Aop面向切面编程
Aop不是替代oop,oop的补充(架构模式)
通用的流程代码,从业务代码中抽离出来,定义(封装)成独立的,可插拔的组件,根据需要以装配的形式动态插入需要的业务方法
Spring Aop提供了基础的Aop支持,基于JDK,动态代理和CGLib库实现的,方法代理AspectJ 提供强大的复杂的AOP支持。基于字节码生成,在编译,类加载,运行时都可以,不止方法还可以是字段
RESTTemplate 请求第三方 RESTful API(以火币为例)

API文档:
工程目录:
工程所需的依赖:
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.newer</groupId> <artifactId>kline</artifactId> <version>0.1</version> <name>kline</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
Tick.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | package com.newer.kline; import java.util.Arrays; public class Tick { // 字段名称 数据类型 描述 // id long 调整为新加坡时间的时间戳,单位秒,并以此作为此K线柱的id // amount float 以基础币种计量的交易量 // count integer 交易次数 // open float 本阶段开盘价 // close float 本阶段收盘价 // low float 本阶段最低价 // high float 本阶段最高价 // vol float 以报价币种计量的交易量 long id; double amount; int count; double open; double close; double low; double high; double vol; // double [] kib; // double [] ask; public Tick() { } public long getId() { return id; } public void setId(long id) { this.id = id; } public double getAmount() { return amount; } public void setAmount(double amount) { this.amount = amount; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public double getOpen() { return open; } public void setOpen(double open) { this.open = open; } public double getClose() { return close; } public void setClose(double close) { this.close = close; } public double getLow() { return low; } public void setLow(double low) { this.low = low; } public double getHigh() { return high; } public void setHigh(double high) { this.high = high; } public double getVol() { return vol; } public void setVol(double vol) { this.vol = vol; } @Override public String toString() { return "Tick [id=" + id + ", amount=" + amount + ", count=" + count + ", open=" + open + ", close=" + close + ", low=" + low + ", high=" + high + ", vol=" + vol + "]"; } } |
HomeController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package com.newer.kline; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class HomeController { // 注入业务逻辑或数据操作 // 从第三方API接口获得数据 @GetMapping("/kline") public String kline() { // 服务端从第三方(火币)获得数据 // RestTemplate是java的Http客户端:ttpURLConnection, Apache HttpComponents, and others. // Vue中 axios:JS Http客户端 RestTemplate restTemplate=new RestTemplate(); String url = "https://api.huobi.me/market/detail/merged?symbol=btcusdt"; // 第一种方式:发送GET请求,从响应中获得相应的数据 // return restTemplate.getForEntity(url, String.class).getBody(); // 第二种方式:发送HTTP任意请求 HttpHeaders headers=new HttpHeaders(); // headers.put(HttpHeaders.AUTHORIZATION); // 设置HTTP请求头 headers.set(HttpHeaders.CONTENT_TYPE, "application/json"); headers.set(HttpHeaders.AUTHORIZATION, "令牌"); HttpEntity requestEntity=new HttpEntity<>(null,headers); // 发送HTTP任意请求,POST,PUT,DELETE return restTemplate.exchange( url, HttpMethod.GET, requestEntity, String.class) .getBody(); } } |
这样,我们就可以从第三方API接口获取数据

@Scheduled的使用
如果我们想从第三方API接口不断获得实时更新的数据,可以采用@Scheduled 中的频率和时间间隔。
KlineJob.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | package com.newer.kline; import java.util.Date; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component public class KlineJob { // 假设执行耗费时间为5秒 // 时间 频率 延时(时间间隔) // 0 0 0 // 1 10 15 // 2 20 30 // 3 30 45 // 4 40 60 // 固定的频率 @Scheduled(fixedRate = 1000*10) public void job() { // System.out.println("固定的频率"+new Date().toLocaleString()); //// 5 // try { // Thread.sleep(5000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // // HttpClient,UrlConnection发送Http请求 // RestTemplate(WebClient) 访问其他的RESTful API // RestController 自己定义RESTful API RestTemplate restTemplate=new RestTemplate(); String url="https://api.huobi.me/market/detail/merged?symbol=ethusdt"; HttpMethod method=HttpMethod.GET; HttpEntity requestEntity=null; String json= restTemplate.exchange( url, method, requestEntity, String.class).getBody(); // 写入MongoDB // 写入文档数据库 System.out.println(json); } // 固定的延时 @Scheduled(fixedDelay = 1000*10) public void job2() { System.out.println("固定延时"+new Date().toLocaleString()); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
KlineApplication.java(@EnableScheduling)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.newer.kline; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @SpringBootApplication public class KlineApplication { public static void main(String[] args) { SpringApplication.run(KlineApplication.class, args); } } |
控制台输出:

可以看到程序从第三方API接口在不断的获取实时的数据。
以上就是RESTTemplate 请求第三方 RESTful API,@Scheduled的使用以及Spring Aop面向切面编程部分知识,有问题的小伙伴,欢迎留言!!!