在开始实现之前,先解决一下controller,先把controller调用service,这个可以看之前的一和二
package com.example.test.demotest.controller;
import com.example.test.demotest.service.IGetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @author qiubo
* @date 2019/1/20
*/
@RestController
public class TestController {
@Autowired
IGetService getService;
@RequestMapping(value = "/test",method = RequestMethod.GET)
String getTest(){
return getService.getTest();
}
}
然后增加依赖
image.png
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
写一个简单的处理TestController的aop方法
package com.example.test.demotest.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
/**
* @author qiubo
* @date 2019/1/21
*/
@Aspect
@Component
public class TestAop {
@Pointcut("execution(* com.example.test.demotest.controller.TestController..*(..))")
private void pointcut() {
}
@Before("pointcut()")
public void beforeLog(){
System.out.println("before");
}
@After("pointcut()")
public void afterLog(){
System.out.println("after");
}
@Around("pointcut()")
public void aroundLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("around before");
String s= (String) proceedingJoinPoint.proceed();
System.out.println("around after"+" "+s);
}
}
解释一下,pointcut是切点,@Before与@After是运行方法之前调用和之后调用的,@Around是可以实现自定方法之前和之后的方法。还有execution里面的内容,我看了一篇不错的网址,里面介绍十分详细https://blog.csdn.net/ABCD898989/article/details/50809321这里就不解释了
http://localhost:8080/test访问这个url结果,可以明显看到执行顺序
说完了例子,可以探讨一下aop的原理,aop的代理实现有两种,一种的java的动态代理,一种是cglib代理,他们的主要区别是,java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。其实说到底,aop只是一种设计模式的思想--代理模式。感觉思想比调用更加重要
网友评论