springboot 中使用AOP
网上关于AOP的例子好多,各种名词解释也一大堆,反正名词各种晦涩,自己写个最最最简单的例子入门mark一下,以后再深入学习。
maven依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
定义切面
@Aspect @Configuration public class AopConfiguration { }
切面内定义切入点,就是执行的条件
@Pointcut("execution(* com.test.service.*.*(..))") public void executeService() { }
切入点的方法不用任何代码,返回值是void,最重要的是执行的条件的表达式:
1)execution:用于匹配子表达式。 //匹配com.cjm.model包及其子包中所有类中的所有方法,返回类型任意,方法参数任意 @Pointcut("execution(* com.cjm.model..*.*(..))") public void before(){} 2)within:用于匹配连接点所在的Java类或者包。 //匹配Person类中的所有方法 @Pointcut("within(com.cjm.model.Person)") public void before(){} //匹配com.cjm包及其子包中所有类中的所有方法 @Pointcut("within(com.cjm..*)") public void before(){} 3) this:用于向通知方法中传入代理对象的引用。 @Before("before() && this(proxy)") public void beforeAdvide(JoinPoint point, Object proxy){ //处理逻辑 } 4)target:用于向通知方法中传入目标对象的引用。 @Before("before() && target(target) public void beforeAdvide(JoinPoint point, Object proxy){ //处理逻辑 } 5)args:用于将参数传入到通知方法中。 @Before("before() && args(age,username)") public void beforeAdvide(JoinPoint point, int age, String username){ //处理逻辑 } 6)@within :用于匹配在类一级使用了参数确定的注解的类,其所有方法都将被匹配。 @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation标注的类都将匹配 public void before(){} 7)@target :和@within的功能类似,但必须要指定注解接口的保留策略为RUNTIME。 @Pointcut("@target(com.cjm.annotation.AdviceAnnotation)") public void before(){} 8)@args :传入连接点的对象对应的Java类必须被@args指定的Annotation注解标注。 @Before("@args(com.cjm.annotation.AdviceAnnotation)") public void beforeAdvide(JoinPoint point){ //处理逻辑 } 9)@annotation :匹配连接点被它参数指定的Annotation注解的方法。也就是说,所有被指定注解标注的方法都将匹配。 @Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)") public void before(){} 10)bean:通过受管Bean的名字来限定连接点所在的Bean。该关键词是Spring2.5新增的。 @Pointcut("bean(person)") public void before(){}
接下来定义通知,就是行为呗,常用的包括Before,Around,After等
@Before("executeService() &&"+"args(name)") public void before(String name) { System.out.println("before say hello"); System.out.println("name = "+name); } @AfterReturning("executeService()") public void after() { System.out.println("after return"); }
这样调用com.test.service包下所有类的方法前都先回执行@Before的行为,结束都会执行@AfterReturning的行为。
更为详细的介绍参考:http://www.cnblogs.com/lic309/p/4079194.html