Spring AOP知识点
1、Spring AOP依赖
spring-aop.jar
aopalliance.jar
aspectjweaver.jar
2、AOP通知
Spring切面支持5种类型的通知:
1、前置通知(目标方法被调用之前通知)@Before
2、后置通知(目标方法被调用之后通知)@After
3、返回通知(目标方法成功返回后通知)@AfterRunning
4、异常通知(目标方法抛出异常后通知)@AfterThrowing
5、环绕通知(目标方法被调用之前和调用之后都通知)@Around
Spring默认使用jdk动态代理创建AOP对象,但是当需要代理的类不是接口而是类时,便会采用cglib代理AOP
3、切点表达式
表达式语言 | 描述 |
---|---|
args() | 通过比较方法的参数类型来选择连接点 |
@args() | 通过比较方法中参数的注解类型来选择连接点 |
execution() | 通过特定的表达式来确定连接点 |
this | 限制连接点匹配AOP代理的bean引用为指定类型的类 |
target | 限制连接点匹配目标对象为指定类型的类 |
@target | 匹配所属的目标对象的类有一个指定的注解的连接点 |
within | 匹配包括参数类的所有连接点 |
@within | 匹配包括参数注解的的类里的所有连接点 |
@annotation | 匹配带有指定注解的连接点 |
一般execution表达式就足够我们定义所需要的切点了。所以先说execution。
execution("public String com.package.Class.function(String)")
execution("* com.package.Class.function(..)")
execution("* *.function(..)")
第一个表达式匹配com.package包下的Class类下的function方法,其中方法的返回值为public String,参数列表为一个String字符串。
第二个表达式匹配com.package包下的Class类下的function方法,其中方法的返回值不做要求(随意),方法的参数列表不做要求。
第三个表达式匹配所有包下所有类下的function方法,其中方法的返回值不做要求,方法的参数列表不做要求。
args()与@args():
args(String,String)匹配只有两个String类型参数的方法。
@args(org.springframework.web.bind.annotation.RequestBody)只匹配方法参数中带有RequestBody注解的方法。
this与target:
this用来匹配的连接点所属的对象引用是某个特定类型的实例,target用来匹配的连接点所属目标对象必须是指定类型的实例。两种方法含义其实是一样的,不过在spring创建aop代理时会判断需要代理的类是否实现了某些接口,若是实现了接口,那么spring会使用jdk代理创建代理对象,否则调用cglib代理创建代理对象。this表示该类使用的cglib实现的AOP代理,target表示该类使用的jdk实现的AOP代理。因此this中的参数应该是类类型,target参数应该是接口类型。
@target:
@target(org.springframework.stereotype.Repository)
within与@within:
within(com.package.Class)匹配Class类中的方法
within(com.package.*)匹配package包下的所有类中的方法
@within(org.springframework.stereotype.Repository)匹配标注@Respository类中的方法