springboot aop

连接点 JointPoint

表示需要在程序中插入横切关注点的扩展点,连接点可能是类初
始化、方法执行、方法调用、字段调用或处理异常等等,Spring
只支持方法执行连接点

切入点 Pointcut

选择一组相关连接点的模式,即可以认为连接点的集合,Spring
支持perl5正则表达式和AspectJ切入点模式,Spring默认使用
AspectJ语法

通知 Advice

在连接点上执行的行为,通知提供了在AOP中需要在切入点所选
择的连接点处进行扩展现有行为的手段;在Spring中通过代理模
式实现AOP

方面/切面 Aspect

横切关注点的模块化,比如上边提到的日志组件。可以认为是通知、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现。

目标对象 Target Object

需要被织入横切关注点的对象,即该对象是切入点选择的对象,需
要被通知的对象,从而也可称为“被通知对象”;由于Spring
AOP 通过代理模式实现,从而这个对象永远是被代理对象。

AOP代理 AOP Proxy

AOP框架使用代理模式创建的对象,从而实现在连接点处插入通
知(即应用切面),就是通过代理来对目标对象应用切面。在
Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通
过拦截器模型应用切面。

织入 Weaving

织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。

前置通知 Before Advice

在切入点选择的连接点处的方法之前执行的通知,该通知不影响正常程序执行流程。

后置通知 After Advice

• 在切入点选择的连接点处的方法之后执行的通知
• 后置返回通知(After returning Advice)
• 后置异常通知(After throwing Advice)
• 后置最终通知(After finally Advice)

环绕通知 Around Advice

• 环绕着在切入点选择的连接点处的方法所执行的通知


springboot aop_第1张图片
实例
springboot aop_第2张图片
实例

定义切入点,就是执行的条件。切入点的方法不用任何代码,返回值是void,最重要的是执行的条件的表达式。

@Pointcut("execution(* com.test.service.*.*(..))")
    public void executeService()
    {

    }
1)execution:用于匹配子表达式。

            //匹配com.cjm.model包及其子包中所有类中的所有方法,返回类型任意,方法参数任意
            @Pointcut("execution(* com.cjm.model..*.*(..))")
            public void before(){}

 

      2)within:用于匹配连接点所在的Java类或者包。

            //匹配Person类中的所有方法
            @Pointcut("within(com.cjm.model.Person)")
            public void before(){}

 

            //匹配com.cjm包及其子包中所有类中的所有方法

            @Pointcut("within(com.cjm..*)")
            public void before(){}

 

     3) this:用于向通知方法中传入代理对象的引用。
            @Before("before() && this(proxy)")
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //处理逻辑
            }

 

      4)target:用于向通知方法中传入目标对象的引用。
            @Before("before() && target(target)
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //处理逻辑
            }

 

      5)args:用于将参数传入到通知方法中。
            @Before("before() && args(age,username)")
            public void beforeAdvide(JoinPoint point, int age, String username){
                  //处理逻辑
            }
 
      6)@within :用于匹配在类一级使用了参数确定的注解的类,其所有方法都将被匹配。 

            @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation标注的类都将匹配
            public void before(){}

  

      7)@target :和@within的功能类似,但必须要指定注解接口的保留策略为RUNTIME。
            @Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

 

      8)@args :传入连接点的对象对应的Java类必须被@args指定的Annotation注解标注。
            @Before("@args(com.cjm.annotation.AdviceAnnotation)")
            public void beforeAdvide(JoinPoint point){
                  //处理逻辑
            }

  

      9)@annotation :匹配连接点被它参数指定的Annotation注解的方法。也就是说,所有被指定注解标注的方法都将匹配。
            @Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

      10)bean:通过受管Bean的名字来限定连接点所在的Bean。该关键词是Spring2.5新增的。
            @Pointcut("bean(person)")
            public void before(){}
springboot aop_第3张图片
springboot aop_第4张图片

请注意我们使用了“&&”操作符把execution()和within()指示器连接在一起形成与(and)关系(切点必须匹配所有的指示器)。类似地,我们可以使用“||”操作符来标识或(or)关系,而使用“!”操
作符来标识非(not)操作。
因为“&”在XML中有特殊含义,所以在Spring的XML配置里面描述切点时,我们可以使用and来代替“&&”。同样,or和not可以分别用来代替“||”和“!”。

通知参数

任何通知方法可以将第一个参数定义为org.aspectj.lang.JoinPoint类型(环绕通知需要定义第一个参数为ProceedingJoinPoint类型,它是 JoinPoint 的一个子类)。JoinPoint接口提供了一系列有用的方法,比如 getArgs()(返回方法参数)、getThis()(返回代理对象)、getTarget()(返回目标)、getSignature()(返回正在被通知的方法相关信息)和 toString()(打印出正在被通知的方法的有用信息)

切入点表达式

定义切入点时需要一个包含名字和任意参数的签名,还有一个切入点表达式,就是* findById*(..)这一部分。
  切入点表达式的格式:execution([可见性] 返回类型 [声明类型].方法名(参数) [异常])
  其中【】中的为可选,其他的还支持通配符的使用:
  *:匹配所有字符
..:一般用于匹配多个包,多个参数
+:表示类及其子类
  运算符有:&&、||、!

在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut”切入点”
例如定义切入点表达式 execution (* com.sample.service.impl..*. *(..))

execution()是最常用的切点函数,其语法如下所示:

整个表达式可以分为五个部分:

1、execution(): 表达式主体。
2、第一个*号:表示返回类型, *号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数

相关博客:
http://www.cnblogs.com/lic309/p/4079194.html
http://blog.csdn.net/lk7688535/article/details/51989746

你可能感兴趣的:(springboot aop)