北京 網(wǎng)站建設(shè) 公司公眾號怎么引流推廣
AOP簡介
AOP(面向切面編程)是一種編程范式,Spring AOP是基于代理模式的AOP框架,它通過動態(tài)代理實現(xiàn)切面的織入,更加輕量級和易于使用。
- Joinpoint (連接點):類里面可以被增強的方法即為連接點。例如,想修改哪個方法的功能,那么該方法就是一個連接點。
- Pointcut(切入點):對Joinpoint進行攔截的定義即為切入點。例如,攔截所有以insert 開始的方法,這個定義即為切入點。
- Advice (通知):攔截到Joinpoint 之后所要做的事情就是通知。例如,上文說到的打印日志監(jiān)控。通知分為前置通知、后置通知、異常通知、最終通知和環(huán)繞通知。
- Aspect ( 切面): Pointcut 和Advice的結(jié)合。
- Target (目標(biāo)對象):要增強的類稱為Target。
引入Maven依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
動態(tài)數(shù)據(jù)源配置
@Component
@Aspect
public class ExampleAspect {@Pointcut("execution(* com.example.*.*(..))")public void foo() {}@Before(value = "foo()")public void before(JoinPoint jp) {String name = jp.getSignature().getName();System.out.println(name + "方法開始執(zhí)行...");}@After(value = "foo()")public void after(JoinPoint jp) {String name = jp.getSignature().getName();System.out.println(name + "方法執(zhí)行結(jié)束...");}@AfterReturning(value = "foo()", returning = "result")public void afterReturning(JoinPoint jp, Object result) {String name = jp.getSignature().getName();System.out.println(name + "方法返回值為: " + result);}@AfterThrowing(value = "foo ()", throwing = "e")public void afterThrowing(JoinPoint jp, Exception e) {String name = jp.getSignature().getName();System.out.println(name + "方法拋異常了,異常是: " + e.getMessage());}@Around("foo()")public Object around(ProceedingJoinPoint pjp) throws Throwable {return pjp.proceed();}
}
@Aspect注解表明這是一個切面類。
- @Pointcut注解:這是一個切入點定義。execution 中的第一個 * 表示方法返回任意值,第二個 * 表示service 包下的任意類,第三個 * 表示類中的任意方法,括號中的兩個點表示方法參數(shù)任意,即這里描述的切入點為service 包下所有類中的所有方法。
-
常用的@Pointcut值包括:
- execution:用于匹配方法執(zhí)行的連接點。可以使用通配符和正則表達式來指定匹配的方法。
- within:用于匹配指定類型內(nèi)的方法執(zhí)行連接點。
- this:用于匹配當(dāng)前AOP代理對象類型的連接點。
- target:用于匹配目標(biāo)對象類型的連接點。
- args:用于匹配方法參數(shù)類型的連接點。
- @annotation:用于匹配使用指定注解修飾的方法連接點。
- bean:用于匹配指定名稱的Bean對象的連接點。
- 這些@Pointcut值可以與邏輯運算符(&&、||、!)一起使用,以實現(xiàn)更復(fù)雜的切點表達式。例如:
@Pointcut(“execution(* com.example.service..(…)) && !execution(* com.example.service.internal..(…))”)
上述切點表達式匹配了com.example.service包下的所有方法,但排除了com.example.service.internal包下的方法。
請注意,上述只是常見的@Pointcut值示例,實際使用時可以根據(jù)需要進行更靈活的配置和組合。
-
@Pointcut常見表達式包括:
- execution:用于匹配方法執(zhí)行的連接點。例如:
execution(public * com.example.service..(…)):匹配com.example.service包下所有public方法的執(zhí)行。
execution(* com.example.service.UserService.*(…)):匹配com.example.service.UserService類中的所有方法的執(zhí)行。 - within:用于匹配指定類型內(nèi)的方法執(zhí)行連接點。例如:
within(com.example.service.*):匹配com.example.service包下所有類的方法執(zhí)行。
within(com.example.service.UserService):匹配com.example.service.UserService類中的所有方法的執(zhí)行。 - this:用于匹配當(dāng)前AOP代理對象類型的連接點。例如:
this(com.example.service.UserService):匹配當(dāng)前AOP代理對象類型為com.example.service.UserService的方法執(zhí)行。 - target:用于匹配目標(biāo)對象類型的連接點。例如:
target(com.example.service.UserService):匹配目標(biāo)對象類型為com.example.service.UserService的方法執(zhí)行。 - args:用于匹配方法參數(shù)類型的連接點。例如:
args(java.lang.String):匹配方法參數(shù)類型為java.lang.String的方法執(zhí)行。 - @annotation:用于匹配使用指定注解修飾的方法連接點。例如:
@annotation(org.springframework.transaction.annotation.Transactional):匹配使用org.springframework.transaction.annotation.Transactional注解修飾的方法執(zhí)行。 - bean:用于匹配指定名稱的Bean對象的連接點。例如:
bean(userService):匹配名稱為userService的Bean對象的方法執(zhí)行。
- execution:用于匹配方法執(zhí)行的連接點。例如:
-
- @Before注解:表示這是一個前置通知,該方法在目標(biāo)方法執(zhí)行之前執(zhí)行。通過JoinPoint參數(shù)可以獲取目標(biāo)方法的方法名、修飾符等信息。
- @After注解:表示這是一個后置通知,該方法在目標(biāo)方法執(zhí)行之后執(zhí)行。
- @AfterReturning注解:表示這是一個返回通知,在該方法中可以獲取目標(biāo)方法的返回值。@AfterReturmning 注解的returning參數(shù)是指返回值的變量名,對應(yīng)方法的參數(shù)。注意,在方法參數(shù)中定義了result 的類型為Object,表示目標(biāo)方法的返回值可以是任意類型,若result 參數(shù)的類型為Long,則該方法只能處理目標(biāo)方法返回值為Long的情況。
- @AfterThrowing注解:表示這是一個異常通知,即當(dāng)目標(biāo)方法發(fā)生異常時,該方法會被調(diào)用,異常類型為Exception 表示所有的異常都會進入該方法中執(zhí)行,若異常類型為ArithmeticException,則表示只有目標(biāo)方法拋出的ArithmeticException異常才會進入該方法中處理。
- @Around注解:表示這是一一個環(huán)繞通知。環(huán)繞通知是所有通知里功能最為強大的通知,可以實現(xiàn)前置通知、后置通知、異常通知以及返回通知的功能。目標(biāo)方法進入環(huán)繞通知后,通過調(diào)用ProceedingJoinPoint對象的proceed方法使目標(biāo)方法繼續(xù)執(zhí)行,開發(fā)者可以在此修改目標(biāo)方法的執(zhí)行參數(shù)、返回值等,并且可以在此處理目標(biāo)方法的異常。
–
本文到此結(jié)束,感謝您的觀看!!!