美文网首页
Spring AOP知识点

Spring AOP知识点

作者: 游牧族人 | 来源:发表于2018-05-10 20:06 被阅读61次
    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类中的方法

    相关文章

      网友评论

          本文标题:Spring AOP知识点

          本文链接:https://www.haomeiwen.com/subject/nmltdftx.html