上一节中,因为反欺诈软件接口是通过aop的形式引入的,所以接下来介绍下aop的实现。其实再springboot中的实现aop是很简单的,仅仅需要知道几个注解就可以了。
准备工作:首先要引入springboot的基础包和aop对应的包。如下:
<dependencies>
<!-- 引入springboot的基础配置,这里的容器使用undertow,不适用tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除自带的tomcat -->>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
<version>1.4.0.RELEASE</version>
</dependency>
<!-- 引入undertow -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
<!--这个是aop需要引入jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
</dependencies>
上述的undertow和tomcat一样,这里我会使用,是因为公司在用undertow,听公司大佬说某些场景下,这个性能要好。
然后创建以下的包结构:
AopSpringApplication是springboot的启动类:代码很简单:
@SpringBootApplication
public class AopSpringApplication {
public static void main(String[] args) {
SpringApplication.run(AopSpringApplication.class, args);
}
}
1、@Before
对应的controller也如下:
@Controller
@RequestMapping("/v1")
public class AopController {
//这个是springboot自带的日志打印类,这个很好用,建议使用
//前段时间,公司日志的管理就是用logback管理的,提供按大小
//切割和按天回滚各种功能。
Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/before")
public ResponseEntity<?> aopBefore(@RequestParam String songName){
logger.info(String.format("这是输入参数%s", songName));
return new ResponseEntity(null,HttpStatus.OK);
}
}
对应的aop的前置通知如下:
package itouchtv.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @author created by chenjianhui 2018/11/22
* 这两个不陌生吧,刚学spring的时候,总会讲,这两个是spring的
* 核心部分,一个是Aop和一个是Ioc,Aop表示切面,Ioc是依赖注入。
*/
@Aspect//声明为一个切面
@Component//注入到spring容器中
public class AopAspect {
private final static int FIRST_ARG = 0;//第一个参数
private final static int SENCOND_ARG = 1;//第二个参数
Logger logger = LoggerFactory.getLogger(this.getClass());
@Before("execution( * itouchtv.controller.v*.AopController.aopBefore(..))")
public void beforeTest(JoinPoint join) {
String songName = (String)join.getArgs()[FIRST_ARG];
logger.info(String.format("这是前置通知拦截的地方,拦截第一个参数第一个参数%s", songName));
}
}
然后在启动类中,右键run as - java application 就行了可以启动运用。在浏览器中输入:
http://localhost:8080/v1/before?songName=搁浅
就可以看到控制台中输出以下结果:
2018-11-22 22:3