AOP
AOP
/**
* 在程式運作期間可以将某段代碼切入到指定的位置進行程式設計
* 1、 導入AOP子產品 (spring-aspects)
* 2、 建立業務邏輯類
* 3、 切面類需要動态感覺運作到哪裡了,動态調用
* 通知方法:
* 前值方法(@Before)
* 後置通知(@After)
* 傳回通知(@AfterReturning)
* 異常通知(@AfterThrowing)
* 環繞通知(@Around):手動調用目标方法運作
*
* 4、 給切面類的目标方法何時何地運作
* */
寫一個
AOP
切面并實作切入業務邏輯的代碼順序:
0、明确目的:
由于切面程式設計是在不改變原有的代碼的情況下修改代碼的執行結果,是以我們實作一個除法的方法,然後在不改變該方法的任何代碼的情況下,執行指定的輸出
整理邏輯:首先要有一個處理除法的方法,然後有一個切面類,用于切入除法中,将兩個類放入Bean工廠,然後從Bean
工程中取出執行個體,調用除法,檢視輸出結果是不是執行了切面類的輸出語句。
1、建立業務邏輯類,這裡以一個傳回商的方法為例
package com.tian.aop.calculator;
public class CountMethod {
public int countMethod(int i, int j) {
System.out.println("begin to calculate");
return i / j;
}
}
2、建立切面類,該類有四個操作,分别是:
- 在上面除法操作之前執行輸出:————@Before開始調用,這裡是業務邏輯開始之前執行————
- 在上面除法操作結束以後輸出:————@After開始調用,這裡是業務邏輯執行之後執行————
- 在上面除法操作執行return時輸出:————@AfterReturning開始調用,這裡是業務邏輯執行return時調用————
- 在上面除法操作執行抛出異常時輸出:————@AfterThrowing開始調用,這裡是業務邏輯執行異常時執行————
上面的四個操作其實就對應了切面類的四大注解:@Before、@After、@AfterReturning、@AfterThrowing
3、将兩個類放到Spring的Bean工廠裡面
package com.tian.aop.config;
import com.tian.aop.calculator.CountMethod;
import com.tian.aop.calculator.LogosMethod;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AOPConfig {
@Bean
public CountMethod countMethod() {
return new CountMethod();
}
@Bean
public LogosMethod logosMethod() {
return new LogosMethod();
}
}
4、雖然兩個類都在Bean工廠中,但是編譯器也不知道誰是切面類,切面類要切的類是誰也沒有指定,是以我們可以通過@Aspect注解告訴編譯器哪個類是切面類,然後由切面類指定誰是被切的方法即可。
package com.tian.aop.calculator;
import org.aspectj.lang.annotation.*;
@Aspect
public class LogosMethod {
@Pointcut("execution(public int com.tian.aop.calculator.CountMethod.*(..))") // 這裡我直接抽取了一個方法作為指定要切的方法
public void ph() {
}
@Before(value = "ph()")
public void start() {
System.out.println("————@Before開始調用,這裡是業務邏輯開始之前執行————");
}
@After(value = "ph()")
public void end() {
System.out.println("————@After開始調用,這裡是業務邏輯執行之後執行————");
}
@AfterThrowing(value = "ph()")
public void AfterThrowing() {
System.out.println("————@AfterThrowing開始調用,這裡是業務邏輯執行異常時執行————");
}
@AfterReturning(value = "ph()")
public void AfterReturning() {
System.out.println("————@AfterReturning開始調用,這裡是業務邏輯執行return時調用————");
}
}
這幾種切入操作也叫通知方法,他們分别對應:前置通知,後置通知,異常通知,傳回通知
5、重要的一步:開啟基于注解AOP模式
給配置檔案添加
@EnableAspectJAutoProxy
注解
6、寫一個測試類:
package com.tian.aop.test;
import com.tian.aop.config.AOPConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.Arrays;
public class AOPTest1 {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AOPConfig.class);
// Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);
AOPConfig bean = applicationContext.getBean(AOPConfig.class);
int i = bean.countMethod().countMethod(4, 2);
System.out.println(i);
}
}
輸出結果:
————@Before開始調用,這裡是業務邏輯開始之前執行————
begin to calculate
————@After開始調用,這裡是業務邏輯執行之後執行————
————@AfterReturning開始調用,這裡是業務邏輯執行return時調用————
2