注解切面
除了使用XML配置AOP切面,我们还可以使用更简洁的注解配置。
现使用注解修改Audience类:
1 | import org.aspectj.lang.ProceedingJoinPoint; |
@Aspect
使得Audience成为了切面。
为了让Spring识别改注解,我们还需在XML中添加<aop:aspectj-autoproxy/>
。<aop:aspectj-autoproxy/>
将在Spring应用上下文中创建一个AnnotationAwareAspectJAutoProxyCreator
类,它会自动代理@Aspect
标注的Bean:
1 | <aop:aspectj-autoproxy proxy-target-class="true" /> |
实例化kenny,输出:
1 | 观众入座 |
在这途中遇到错误:
1 | :error at ::0 can't find referenced pointcut XXX |
网络上的说法是JDK不匹配造成的,
我原来用的JDK1.7匹配的是aspectjrt.1.6和aspectjweaver.1.6,因此会报错。 如果要使用AspectJ完成注解切面需要注意下面的JDK与AspectJ的匹配:
JDK1.6 —— aspectJ1.6
JDK1.7 —— aspectJ1.7.3+
aspectJ1.7下载链接:密码:6wd7
注解环绕通知
使用@Around注解环绕通知:
1 |
|
实例化kenny,输出:
1 | 观众入座 |
注解传递参数
修改Magician类:
1 | import org.aspectj.lang.annotation.Aspect; |
<aop:pointcut>
变为@Pointcut
注解,<aop:before>
变为@Before
注解。
测试:
1 | public class TestIntercept { |
输出:
1 | 侦听志愿者的心声 |
通过注解引入新的方法
之前通过在XML中配置AOP切面的方法为Bean引入新的方法,现在改用注解的方式来实现:
新建一个ContestantIntroducer类:
1 | import org.aspectj.lang.annotation.Aspect; |
@DeclareParents
注解代替了之前的<aop:declare-parents>
标签。 @DeclareParents
注解由三个部分组成:
1.value属性等同于<aop:declare-parents>
的types-matching属性。它标识应该被引入指定接口的Bean。
2.defaultImpl属性等同于<aop:declare-parents>
的default-impl属性。它标识该类所引入接口的实现。
3.由@DeclareParents
注解所标注的static属性制订了将被引入的接口。
测试:
1 | public class Play { |
输出:
1 | 观众入座 |