1. 程式人生 > >Spring基於註解的Aop實戰以及原理解析

Spring基於註解的Aop實戰以及原理解析

一.新增依賴包

  

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.2.RELEASE</version>
    </dependency>

    <!-- https://
mvnrepository.com/artifact/org.springframework/spring-aspects --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.1.2.RELEASE</version> </dependency>

二.編寫業務邏輯類

  這次業務邏輯類為一個計算功能的,簡單起見只寫了一個除法,理解思想就行...

  

public class Calculate {
    public int div(int a,int b){
        return a/b;
    }
}

三.編寫切面類

  這裡比較重要,有@Aspect標註為切面類以和業務類分開,還有切點表示式的編寫,以及通知型別等標籤的使用。

//切面類
    @Aspect

public class LogAspects {
    @Pointcut("execution (public int com.Aop.Main.Calculate.*(..))")
    public void pointCut(){}

    @Before(value 
= "pointCut()") public void logStart(){ System.out.println("除法開始執行...{}"); } @After(value = "pointCut()") public void logEnd(){ System.out.println("除法結束..."); } @AfterReturning(value = "pointCut()") public void logReturn(){ System.out.println("除法正常返回..."); } @AfterThrowing(value = "pointCut()") public void logThrowing(){ System.out.println("除法異常...{}"); } }

四.AopConfig類

  這個類相當於以前的application.xml裡面的beans標籤,@Bean就相當於Bean標籤啦。要注意的一點是@EnableAspestJAutoProxy,這個是代替了以前的xml檔案配置的<aop:aspect-autoproxy>啟動註解式事務

  

@EnableAspectJAutoProxy
@Configuration
public class AopConfig {

    @Bean
    public Calculate calculate(){
        return new Calculate();
    }

    @Bean
    public LogAspects logAspects(){
        return new LogAspects();
    }

}

五.測試

public class AopMainTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext();
        configApplicationContext.register(AopConfig.class);
        configApplicationContext.refresh();
        Calculate c = configApplicationContext.getBean(Calculate.class);
        c.div(1,2);
        configApplicationContext.close();
    }
}

結果如下: