码迷,mamicode.com
首页 > 编程语言 > 详细

Spring AOP—注解配置方法的使用

时间:2020-02-26 23:23:53      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:sts   delegate   spec   auto   string   before   match   type   cut   

Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。
1 启用对@AspectJ的支持
Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置:

技术图片

这样Spring就能发现@AspectJ风格的切面并且将切面应用到目标对象。

2 声明切面
@AspectJ风格的声明切面非常简单,使用@Aspect注解进行声明:

技术图片

然后将该切面在配置文件中声明为Bean后,Spring就能自动识别并进行AOP方面的配置:
该切面就是一个POJO,可以在该切面中进行切入点及通知定义
声明切面也可以直接使用注解的方式如下图:

技术图片

用@component 把普通pojo实例化到spring容器中。在去上图xml文件中去配置。

1
技术图片

2
技术图片

3 声明切入点
@AspectJ风格的命名切入点使用org.aspectj.lang.annotation包下的@Pointcut+方法(方法必须是返回void类型)实现。

技术图片

 value:指定切入点表达式;
argNames:指定命名切入点方法参数列表参数名字,可以有多个用“,”分隔,这些参数将传递给通知方法同名的参数,同时比如切入点表达式“args(param)”将匹配参数类型为命名切入点方法同名参数指定的参数类型。
pointcutName:切入点名字,可以使用该名字进行引用该切入点表达式。

技术图片
定义了一个切入点,名字为“beforePointcut”,该切入点将匹配目标方法的第一个参数类型为通知方法实现中参数名为“param”的参数类型。

4 声明通知
@AspectJ风格的声明通知也支持5种通知类型:

一、前置通知:使用org.aspectj.lang.annotation 包下的@Before注解声明;

技术图片

 value:指定切入点表达式或命名切入点;
argNames:与Schema方式配置中的同义。
示例:
1、定义接口和实现

技术图片

技术图片

2、定义切面:(打印日志的切面)

技术图片

3、定义切入点:

技术图片

4、定义通知:

技术图片

完整的切面:

技术图片

5、在spring_aop_annotation.xml配置文件中进行如下配置:

技术图片

6、测试代码TestSpringAopAnnotation.java

技术图片

7、结果:

技术图片

切面、切入点、通知全部使用注解完成:
(1)使用@Aspect将POJO声明为切面;
(2)使用@Pointcut进行命名切入点声明,同时指定目标方法第一个参数类型必须是java.lang.String,对于其他匹配的方法但参数类型不一致的将也是不匹配的,通过argNames = "param"指定了将把该匹配的目标方法参数传递给通知同名的参数上;
(3)使用@Before进行前置通知声明,其中value用于定义切入点表达式或引用命名切入点;
(4)配置文件需要使用来开启注解风格的@AspectJ支持;
(5)需要将切面注册为Bean,如“aspect”Bean;
(6)测试代码完全一样。
上面我不仅演示了前置,还有后置一起演示了

二、后置返回通知:使用org.aspectj.lang.annotation 包下的@AfterReturning注解声明;(也可以使用@After)

技术图片

value:指定切入点表达式或命名切入点;
pointcut:同样是指定切入点表达式或命名切入点,如果指定了将覆盖value属性指定的,pointcut具有高优先级;
argNames:与Schema方式配置中的同义;
returning:与Schema方式配置中的同义。

三、后置异常通知:使用org.aspectj.lang.annotation 包下的@AfterThrowing注解声明;

技术图片

 value:指定切入点表达式或命名切入点;
pointcut:同样是指定切入点表达式或命名切入点,如果指定了将覆盖value属性指定的,pointcut具有高优先级;
argNames:与Schema方式配置中的同义;
throwing:与Schema方式配置中的同义。
例子:

技术图片

四、后置最终通知:使用org.aspectj.lang.annotation 包下的@After注解声明;

技术图片

value:指定切入点表达式或命名切入点;
argNames:与Schema方式配置中的同义;
示例:

技术图片

五、环绕通知:使用org.aspectj.lang.annotation 包下的@Around注解声明;

技术图片

value:指定切入点表达式或命名切入点;
argNames:与Schema方式配置中的同义;
例子:

技术图片

5 引入
@AspectJ风格的引入声明在切面中使用org.aspectj.lang.annotation包下的@DeclareParents声明:

技术图片

value:匹配需要引入接口的目标对象的AspectJ语法类型表达式;与Schema方式中的types-matching属性同义;
private Interface interface:指定需要引入的接口;
defaultImpl:指定引入接口的默认实现类,没有与Schema方式中的delegate-ref属性同义的定义方式;
例子

技术图片

Spring AOP—注解配置方法的使用

标签:sts   delegate   spec   auto   string   before   match   type   cut   

原文地址:https://www.cnblogs.com/miniSimple/p/12369446.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!