Springboot動態(tài)配置AOP切點詳解
前言
Springboot 可以定義注解切點去攔截注解修飾的類方法以及execution (xxxx)切點去攔截具體的類方法。默認情況下我們都會使用注解@PointCut去定義切點,然后定義切面攔截切點。
但有些場景需要我們在配置文件(.properties/yml)中配置 execution 靈活的去修改需要攔截的切點。這樣我們可以將一些公共的攔截增強放到 jar 包推送到倉庫中共享。
通用不可動態(tài)配置的做法
@Aspect
@Component
public class TransactionConfig {
private static final String C_POINT_CUT = "execution(public * com.allens.export.service.*.*(..))";
@Pointcut(C_POINT_CUT)
public void pointCut () {};
//@Pointcut("execution(public * com.allens.export.service.*.*(..))")
//public void pointCut () {};
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
System.out.println("----------------");
}
@Around("pointCut()")
public Object process (ProceedingJoinPoint joinPoint) throws Throwable {
return joinPoint.proceed();
}
@After("pointCut()")
public void after(JoinPoint joinPoint) {
}
}可以看到我們可以將切點寫成static final 傳入到注解中,但我們并不能傳變量到切點中。解下來就要講重點部分,如何動態(tài)配置切點。其實我們可以猜到,AOP原理就是使用Java動態(tài)代理或CGlib進行增強代理。我們使用注解@PointCut定義切點其實也是需要代碼去解析然后增強。我們其實也可以直接寫代碼去增強我們的類,手動定義切點,手動定義切面等等。
動態(tài)配置切點
AspectJExpressionPointcut 提供表達式匹配類和方法。
public class GreetingDynamicPointcut extends AspectJExpressionPointcut {
}MethodInterceptor 提供攔截方法的能力,我們可以借助它實現(xiàn)注解@Around功能
@Slf4j
public class GreetingInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
try {
log.info("調(diào)用前...");
return methodInvocation.proceed();
} catch (Exception e) {
log.error("error", e);
throw e;
} finally {
log.info("調(diào)用后...");
}
}
}GreetingAdvice 這個類繼承了 GreetingInterceptor 可以實現(xiàn)@Around環(huán)繞功能,繼承了 AfterReturningAdvice 實現(xiàn)了 @After 方法調(diào)用后攔截功能,繼承了 MethodBeforeAdvice 實現(xiàn)了方法調(diào)用前的攔截功能。
@Slf4j
public class GreetingAdvice extends GreetingInterceptor implements MethodBeforeAdvice, AfterReturningAdvice, AdvisorAdapter {
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
// 輸出切點
System.out.println("Pointcut:" + target.getClass().getName() + "."
+ method.getName());
if (args.length > 0) {
String clientName = (String) args[0];
System.out.println("How are you " + clientName + " ?");
}
}
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println(returnValue);
}
@Override
public boolean supportsAdvice(Advice advice) {
return true;
}
@Override
public MethodInterceptor getInterceptor(Advisor advisor) {
return null;
}
}配置
@Configuration
public class WebmvcConfig {
@Bean
public Pointcut customPointCut() {
GreetingDynamicPointcut greetingDynamicPointcut = new GreetingDynamicPointcut();
// ①
greetingDynamicPointcut.setExpression("execution(public * com.allens.test.controller..*(..)) || execution(public * com.allens.test.service..*(..))");
return greetingDynamicPointcut;
}
@Bean
GreetingBeforeAdvice getAdvice () {
return new GreetingBeforeAdvice();
}
// ②
@Bean
DefaultPointcutAdvisor defaultPointcutAdvisor () {
DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor();
defaultPointcutAdvisor.setPointcut(customPointCut());
defaultPointcutAdvisor.setAdvice(getAdvice());
return defaultPointcutAdvisor;
}
}① 我們實現(xiàn)動態(tài)配置只需要把這里的execution 字符串替換成自己從配置文件中獲取的配置即可。
② 自定義切面,可以靈活配置切點和切面。
到此這篇關(guān)于Springboot動態(tài)配置AOP切點詳解的文章就介紹到這了,更多相關(guān)Springboot配置AOP切點內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中Tomcat和SpringMVC整合源碼分析
Tomcat和SpringMVC都是通過這樣的方式進行集成的,SpringBoot出現(xiàn)之前SpringMVC項目是直接部署在Tomcat服務(wù)器中的,這篇文章主要介紹了SpringBoot中Tomcat和SpringMVC整合源碼分析,需要的朋友可以參考下2022-07-07
Springboot項目基于Devtools實現(xiàn)熱部署步驟詳解
這篇文章主要介紹了Springboot項目基于Devtools實現(xiàn)熱部署,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
IDEA中Spring Initializr沒有Java8選項的解決辦法
在使用IDEA中的Spring Initializr創(chuàng)建新項目時,Java 版本近可選擇Java17,21 ,不能選擇Java8;SpringBoot 版本也只有 3.x,所以本文給大家介紹了IDEA中Spring Initializr沒有Java8選項的解決辦法,需要的朋友可以參考下2024-06-06
springboot項目攔截器重定向循環(huán)問題的解決
這篇文章主要介紹了springboot項目攔截器重定向循環(huán)問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring Boot不同版本Redis設(shè)置JedisConnectionFactory詳解

