1. 程式人生 > 程式設計 >SpringBoot整合aop面向切面程式設計過程解析

SpringBoot整合aop面向切面程式設計過程解析

這篇文章主要介紹了SpringBoot整合aop面向切面程式設計過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是Spring框架中的一個重要內容,它通過對既有程式定義一個切入點,然後在其前後切入不同的執行內容,比如常見的有:開啟資料庫連線/關閉資料庫連線、開啟事務/關閉事務、記錄日誌等。基於AOP不會破壞原來程式邏輯,因此它可以很好的對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。

spring aop預設是使用JDK動態代理,即基於介面的代理,可以通過proxy-target-class屬性修改。如果proxy-target-class=true, 那基於類的代理將起作用(這時需要cglib庫)。

引入依賴

<!--aop-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--spring 的aop預設是使用JDK代理,即-->
<!--用來動態代理用的,基於類的代理-->
<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.2.12</version>
</dependency>

注:在完成了引入AOP依賴包後,一般來說並不需要去做其他配置。也許在Spring中使用過註解配置方式的人會問是否需要在程式主類中增加@EnableAspectJAutoProxy來啟用,實際並不需要。AOP的預設配置屬性中spring.aop.auto屬性預設是開啟的,也就是說只要引入了AOP依賴後,預設已經增加了@EnableAspectJAutoProxy。

實現AOP的切面主要有以下幾個要素:

  • 使用@Aspect註解將一個java類定義為切面類
  • 使用@Pointcut定義一個切入點,可以是一個規則表示式,比如某個package下的所有函式,也可以是一個註解等。
  • 根據需要在切入點不同位置的切入內容,即不同的通知:@Before、@After、@AfterReturning、@Around、@AfterThrowing

普通業務元件

/**
 * 普通業務元件
 */
@Component
public class CustomerBusiness {

  private String message;

  public void setMessage(String message) {
    this.message = message;
  }

  public void getMessage() {
    System.out.println("Your Message : " + message);
  }
}

切面

@Aspect //宣告式一個切面元件
@Component //加入到IoC容器
public class TimeHandler {
  
  //指定切入點表示式,攔截那些方法,即為哪些類生成代理物件
  @Pointcut("execution(* com.linhw.demo.ascpet.CustomerBusiness.*())")
  public void pointCut(){
    
  }
  
  @Before("pointCut()")
  public void printBeforeTime() {
    System.out.println("---------------Before CurrentTime = " + System.currentTimeMillis());
  }
  
  @After("pointCut()")
  public void prinAftertTime() {
    System.out.println("---------------After CurrentTime = " + System.currentTimeMillis());
  }
  
}

測試

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {AopApplication.class})
public class AopTest {

  @Autowired
  CustomerBusiness business;

  @Test
  public void testAop(){
    business.setMessage("hello world");
    business.getMessage();
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。