Spring使用@AspectJ開發AOP(零配置文件)


前言:

 AOP並不是Spring框架特有的。Spring只是支持AOP編程 (面向切面編程) 的框架之一。

概念:

1、切面(Aspect)

  一系列Advice + Pointcut 的集合。

2、通知(Advice)

  通知是切面開啟后,切面的方法。

  • 前置通知 ( before ):在動態代理反射原有對象方法 或者 執行環繞通知 前 執行的通知功能
  • 后置通知(after):在動態代理反射原有對象方法 或者 執行環繞通知 后 執行的通知功能
  • 返回通知 (afterReturning):在動態代理反射原有對象方法 或者 執行環繞通知 后 正常返回(無異常)執行的通知功能
  • 異常通知(afterTherowing):在動態代理反射原有對象方法 或者 執行環繞通知 產生異常后執行的通知功能
  • 環繞通知(around):在動態代理中,它可以取代當前被攔截對象的方法,提供回調原有被攔截對象的方法

3、引入(Introduction)

  引入允許我們在現有的類里添加自定義的類和方法

4、切點(Pointcut)

  這是一個告訴Spring AOP 在什么時候啟動攔截並織入對應的流程,因為並不是所有的開發都是需要啟動AOP的,它往往通過正則表達進行限定

5、連接點( join point)

  Pointcut 中的某個具體位置。

首先要有 AspectJ 的依賴 

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.2</version>
</dependency>

現在我們去創建一個Cat 類 (目標類)出來,並使用@Component 注入容器中

import org.springframework.stereotype.Component;

//目標類
@Component
public class Cat {

    public void eat(){
        System.out.println("小白貓,開始吃魚了!!!!");
    }
}

然后再創一個 切面類 出來

@Component
@Aspect
public class CatAdvice {//切面類


    //execution (* *.*(..) )
    // 第一個* 代表着 返回類型是任意的
    // 第二個* 代表着 類的全限定名 * 代表着所有
    // *(..) 代表着 任意方法 任意的參數
    // 比如  execution ( void com.oukele.learning.aop2.Cat.eat())
    
    //切點
    @Pointcut("execution(* *.*(..))")
    public void pointcut(){};

    @Before("pointcut()")
    public void clean(){//在貓吃之前執行的方法 ,把魚清洗一下 (前置通知)
        System.out.println("現在我們把我這條魚,清洗一下");
    }

    @After("pointcut()")
    public void  tidy(){//貓吃完魚后執行的方法,收拾一下剩下的殘渣 (后置通知)
        System.out.println("收拾,小白貓吃剩下來的殘渣。!!!");
    }

}

再創一個配置類

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration//聲明當前類是配置類 ( 類似於 xml 文件一樣 )
@ComponentScan(basePackages = "com.oukele.learning.aop2")//掃描某個包中的注解
@EnableAspectJAutoProxy//激活 代理功能
public class SpringConfig {

}

 

現在開始測試啦

public class Main {
    public static void main(String[] args) {
        //加載配置類
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //從容器中獲取Cat類
        Cat cat = context.getBean(Cat.class);
        cat.eat();//調用Cat類的方法

    }
}

結果:

1 現在我們把我這條魚,清洗一下
2 小白貓,開始吃魚了!!!!
3 收拾,小白貓吃剩下來的殘渣。!!!

 只要我們把切面類里面的@Componet去掉,就會發現,這只貓,是直接吃魚的。

這就是面向切面編程。。。。

代碼示例下載:https://github.com/oukele/Spring-AspectJ-Annotion


免責聲明!

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



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