javascript
Spring AOP相关术语解释及简单使用
什么是面向切面編程
百度百科定義為:在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
AOP相關術語
通知(Advice)
在AOP術語中,切面的工作被稱為通知。通知定義了切面是什么以及何時使用,通知還解決了何時執行。
spring切面有5種通知類型
- 前置通知(Before):在目標方法被調用之前調用通知功能;
- 后置通知(After):在目標方法完成之后調用通知,此時不會關心方法的輸入是什么;
- 返回通知(After-returning):在目標方法成功執行之后調用通知
- 異常通知(After-throwing):在目標方法拋出異常后調用通知
- 環繞通知(Around):通知包括了被通知的方法,在被通知的方法調用之前和調用之后執行自定義的行為
連接點(Join point)
程序執行的某個特定位置:如類開始初始化前、類初始化后、類某個方法調用前、調用后、方法拋出異常后。一個類或一段程序代碼擁有一些具有邊界性質的特定點,這些點中的特定點就稱為“連接點”。Spring僅支持方法的連接點,即僅能在方法調用前、方法調用后、方法拋出異常時以及方法調用前后這些程序執行點織入增強。連接點由兩個信息確定:第一是用方法表示的程序執行點;第二是用相對點表示的方位。
切點(Pointcut)
每個程序類都擁有多個連接點,如一個擁有兩個方法的類,這兩個方法都是連接點,即連接點是程序類中客觀存在的事物。AOP通過“切點”定位特定的連接點。連接點相當于數據庫中的記錄,而切點相當于查詢條件。切點和連接點不是一對一的關系,一個切點可以匹配多個連接點。在Spring中,切點通過org.springframework.aop.Pointcut接口進行描述,它使用類和方法作為連接點的查詢條件,Spring AOP的規則解析引擎負責切點所設定的查詢條件,找到對應的連接點。其實確切地說,不能稱之為查詢連接點,因為連接點是方法執行前、執行后等包括方位信息的具體程序執行點,而切點只定位到某個方法上,所以如果希望定位到具體連接點上,還需要提供方位信息。
織入(Weaving)
織入是將增強添加對目標類具體連接點上的過程。AOP像一臺織布機,將目標類、增強或引介通過AOP這臺織布機天衣無縫地編織到一起。根據不同的實現技術,AOP有三種織入的方式:
a、編譯期織入,這要求使用特殊的Java編譯器。
b、類裝載期織入,這要求使用特殊的類裝載器。
c、動態代理織入,在運行期為目標類添加增強生成子類的方式。
Spring采用動態代理織入,而AspectJ采用編譯期織入和類裝載期織入。
切面(Aspect)
切面是通知和切點的結合
springboot整合aop簡單例子
代碼在github上
package com.sl.aop;import org.aspectj.lang.annotation.*; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.stereotype.Component;/*** @author shuliangzhao* @Title: AopLog* @ProjectName spring-boot-learn* @Description: TODO* @date 2019/10/13 15:18*/ @Aspect @Component @EnableAspectJAutoProxy public class AopLog {@Pointcut("execution(* com.sl..*.*(..))")public void pointcut() {}@Before("pointcut()")public void before() {System.out.println("方法執行前...");}@After("pointcut()")public void after() {System.out.println("方法執行后...");}@Around("pointcut()")public void around() {System.out.println("環繞執行方法...");}@AfterThrowing("pointcut()")public void ffterThrowing() {System.out.println("方法執行失敗...");} }名詞解釋:
例: execution (* com.sl.service…*. *(…))
整個表達式可以分為五個部分:
1、execution()::表達式主體。
2、第一個*號:表示返回類型, *號表示所有的類型。
3、包名:表示需要攔截的包名,后面的兩個句點表示當前包和當前包的所有子包,com.sample.service包、子孫包下所有類的方法。
4、第二個*號:表示類名,*號表示所有的類。
5、*(…):最后這個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數,兩個句點表示任何參數
總結
以上是生活随笔為你收集整理的Spring AOP相关术语解释及简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot实现懒加载@Lazy
- 下一篇: Spring AOP注解方式实现日志管理