美文网首页
Springboot AOP 一 :AOP的基本概念

Springboot AOP 一 :AOP的基本概念

作者: IT前沿技术分享 | 来源:发表于2021-05-30 16:03 被阅读0次

    在一个地方定义通用功能,但是我们可以通过声明的方法定义这个功能在何处应用,无需修改受影响的类,这些类称之为切面

    对于AOP的使用,我们需要抓住以下几点:

    • 通用功能:什么样的功能叫通用功能呢,比如日志、事务之类。
    • 何处使用:在什么地方会使用上日志、事务。
    • 无需修改:这算是aop 的一个特点吧,举个例子 ,如果你要在每个方法上加入日志,最简单最傻的方法是一个个加log,那么会带来一个问题,修改起来特别麻烦。这个时候就需要用到aop了。

    使用前,我们还是先弄明白AOP的基本概念。

    1. 通知 (Advice):

    某个连接点所采用的处理逻辑,也就是向连接点注入的代码, AOP在特定的切入点上执行的增强处理。

    Springboot 有5种类型的通知:

      1. @Before: 标识一个前置增强方法,相当于BeforeAdvice的功能.
      1. @After:标识一个final增强,不管是抛出异常或者正常退出都会执行.
      1. @AfterReturning: 标识一个 后置增强,似于AfterReturningAdvice, 方法正常退出时执行.
      1. @AfterThrowing: 标识一个异常抛出增强,相当于ThrowsAdvice.
      1. @Around: 标识一个环绕增强,相当于MethodInterceptor, 通知包裹着被通知的方法。中间可以使用point.proceed()继续执行方法。.

    2. 连接点(JointPoint):

    程序运行中的某个阶段点,比如方法的调用、异常的抛出等。

    JointPoint提供对连接点可用状态和关于连接点的静态信息的反射访问。该信息可以通过特殊形式thisJoinPoint从通知体中获得。这个反射信息的主要用途是跟踪和记录应用程序。

    常用的方法:

    *   Object[] getArgs:返回目标方法的参数
    *   Signature getSignature:返回目标方法的签名
    *   Object getTarget:返回被织入增强处理的目标对象
    *   Object getThis:返回AOP框架为目标对象生成的代理对象
    

    当使用@Around处理时,需要将第一个参数定义为ProceedingJoinPoint类型,该类是JoinPoint的子类。

    3. 切入点(Pointcut):

    JoinPoint的集合,是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发,在程序中主要体现为书写切入点表达式。

        // 切入点
        @Pointcut("execution(* checkParams_*(..))")
        public void servicePointcut() {
        }
    

    4. 增强(Advisor):

    是PointCut和Advice的综合体,完整描述了一个advice将会在pointcut所定义的位置被触发。

        // 通知
        @Before(value = "servicePointcut()")
        // 连接点
        public void before(JoinPoint joinPoint) throws Exception {
            // 增强功能
        }
    

    5. 切面(@Aspect):

    通常是一个类的注解,里面可以定义切入点和通知、增强能力……

    @Aspect
    @Component
    public class ParamsValidator {
    }
    

    通常,@Aspect与@Component搭配使用

    6. AOP Proxy:

    AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。

    <aop:aspectj-autoproxy/>   
          <aop:config proxy-target-class="true">       
                <aop:pointcut id="servicePointcut"                     
                              expression="execution(* com.cpic..*Service.*(..))" />       
                      <aop:advisor pointcut-ref="servicePointcut" advice-ref="txAdvice"                              
                                   order="3" />   
                </aop:config>   
                <tx:advice id="txAdvice" transaction-manager="transactionManager">             
                      <tx:attributes>           
                            <tx:method name="list*" read-only="true" />           
                            <!-- log方法会启动一个新事务 -->           
                            <tx:method name="log*" propagation="REQUIRES_NEW"                          
                                       isolation="READ_COMMITTED" />       
                      </tx:attributes>   
                </tx:advice> 
    //OK所以一个Spring增强(advisor)=切面(advice)+切入点(PointCut)
    

    相关文章

      网友评论

          本文标题:Springboot AOP 一 :AOP的基本概念

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