java aop 注解方式_Spring AOP—注解配置方法的使用

Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。

1  启用对@AspectJ的支持

Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置:

ca6f1a35508adccccb70ed211a60bccf.png

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

2  声明切面

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

c42f76fde1790ee41c7df56fb2e68688.png

然后将该切面在配置文件中声明为Bean后,Spring就能自动识别并进行AOP方面的配置:

该切面就是一个POJO,可以在该切面中进行切入点及通知定义

声明切面也可以直接使用注解的方式如下图:

48dd376a8a770b74f877be78f8feec74.png

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

1

057e812468abc5d7f358612c58436e4a.png

2

0197190007f2fff10412cf4a26c2b9b7.png

3  声明切入点

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

0794b392c9ac8da33e4306b9b2a4f3c5.png

value:指定切入点表达式;

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

pointcutName:切入点名字,可以使用该名字进行引用该切入点表达式。

4af2f547eef86d9a783dcb04c6505194.png

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

4  声明通知

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

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

1c2d9e397443406cfd4bf4b24dee2b9c.png

value:指定切入点表达式或命名切入点;

argNames:与Schema方式配置中的同义。

示例:

1、定义接口和实现

9b8b718f6af7c2d19ac2f33c7bf8d03d.png

a0ae1e1f8e20ab986d89bcdb990ec9ba.png

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

4dc508fecf0cdd0bb75f5768031cc0e2.png

3、定义切入点:

970b0c901b3ccde6e16efa1e3ce8ec3a.png

4、定义通知:

1cf3ee3c77330f5aa41819c38e09e034.png

完整的切面:

fce1edeb05c6dd60977058c030380836.png

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

d6e6ebecf790cce663e19c590b8df700.png

6、测试代码TestSpringAopAnnotation.java

226c4ef33242672e44650bbe091fbe5c.png

7、结果:

d962793476a48d1e63e0f12b914c3fcf.png

切面、切入点、通知全部使用注解完成:

(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)

f89075bdcb721da5efa25bb4fee1fe3b.png

value:指定切入点表达式或命名切入点;

pointcut:同样是指定切入点表达式或命名切入点,如果指定了将覆盖value属性指定的,pointcut具有高优先级;

argNames:与Schema方式配置中的同义;

returning:与Schema方式配置中的同义。

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

e038e43fd7343b4335e7d1537a4ca841.png

value:指定切入点表达式或命名切入点;

pointcut:同样是指定切入点表达式或命名切入点,如果指定了将覆盖value属性指定的,pointcut具有高优先级;

argNames:与Schema方式配置中的同义;

throwing:与Schema方式配置中的同义。

例子:

ca606c1903183609a57833d200bb8338.png

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

778fbf8f2dcc4ba82b3c264dcb7f37ec.png

value:指定切入点表达式或命名切入点;

argNames:与Schema方式配置中的同义;

示例:

d3b09b056ade353967c6cea6857b0338.png

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

c084c8d7fe9a842f7c0467629fd255e3.png

value:指定切入点表达式或命名切入点;

argNames:与Schema方式配置中的同义;

例子:

99950dc270a2e7ba4c956e1515cb5581.png

5  引入

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

3712a206d36bbdb104b44ac43bc3334d.png

value:匹配需要引入接口的目标对象的AspectJ语法类型表达式;与Schema方式中的types-matching属性同义;

private Interface interface:指定需要引入的接口;

defaultImpl:指定引入接口的默认实现类,没有与Schema方式中的delegate-ref属性同义的定义方式;

例子

a60613067fff38d3c4c6734a929ecdaf.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值