Springboot整合AOP


AOP:Spring得核心之一,面向切面編程,底層是通過動態代理實現得。實現方式有兩種:(1)基本JDK原生動態代理,被代理得類需要實現接口。  (2)基於CGLIB,類和接口都可以代理。

在沒有使用boot框架時,使用ssm時,我們需要在配置文件中加上以下配置。    (1)配置切入點。 (2)編寫切面類。  (3)將配置類與切入點結合。

          

 

 現在進入主題,看看boot是如何整合AOP得(boot是2.1.9版本)。

(1)引入依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

(2)配置yml

spring:
  aop:
    #采用CGLIB作為作為動態代理,默認true  為了解決使用 JDK 動態代理可能導致的類型轉化異常而默認使用 CGLIB (boot1.x版本默認是false)
    proxy-target-class: true
    #是否開啟aop自動配置,默認為true
    #意味着自動加上 @EnableAspectAutoProxy 注解
    #該注解用於開啟AOP相關注解得支持
    auto: true

(3)編寫業務方法

 (4)編寫切面類

/**
 * @ClassName
 * @Description
 *
 * @Autor wcy
 * @Date 2020/11/6 13:31
 */
//用於定義一個切面類,切面類上面需要加上@Component才可以生效
@Aspect
@Component
public class AspectController {

   private static final Logger log = LoggerFactory.getLogger(WebController.class);

    /**
     * Pointcut定義切入點,一般為方法級別,通過表達式提現。  匹配springbootaop.demo.controller下面所有得公用方法
     */
    @Pointcut("execution(public * com.example.demo.controller..*.*(..))")
    public void aspect(){};

    /**
     *  @Around("aspect()") 這種定義切入點方式和直接在@Around里面聲明具體得切入點表達式一樣
     * 環繞通知,更靈活得自定義增強通知,可以注入ProceedingJoinPoint獲取相關信息和執行方法
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("aspect()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object object = null;
        log.info("環繞通知開始");
        object =  joinPoint.proceed();
        log.info("環繞通知結束");
        return object;
    }

    /**
     *用於在切入點的流程執行前生效,可以在方法中注入JoinPoint用於獲取相關信息
     * @param joinPoint
     */
    @Before("aspect()")
    public void before(JoinPoint joinPoint){
       log.info("我是前置通知");
    }

    /**
     * finally通知,這就意味着無論如何都會執行這個通知(不論是否發生異常),可以在方法中注入JoinPoint用於獲取相關信息
     * @param joinPoint
     */
    @After("aspect()")
    public void after(JoinPoint joinPoint){
        log.info("我是finally通知");
    }

    /**
     * 異常通知,出現異常時執行,可以在方法中注入JoinPoint和Throwable用於獲取相關信息
     */
    @AfterThrowing("aspect()")
    public void throwing(){
        log.info("我是異常通知");
    }

    /**
     * 后置返回前通知 ,在finally通知之后,方法正常退出前執行,可以注入JoinPoint 和Object 獲取相關信息和方法執行成功的返回結果
     * @param object
     */
    @AfterReturning(pointcut = "aspect()",returning = "object")
    public void returning(Object object){
        log.info("我是后置通知,響應結果為:"+object);
    }

}

(5)進入測試,界面輸入http://localhost:8080/test1,控制台輸入如下

從結果中我們可以看到,當所有通知都存在時,執行順序如下:

 

 

 至此boot整合aop也就結束了,此外不同版本得boot,執行順序也是不一樣得,我之前也試了2.3.5得版本,執行得順序是不同得,這里我就不做說明了,下圖便是2.3.5版本得執行順序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM