背景
改造老項目,須要加一個aop來攔截所的web Controller請求做一些處理,由於老項目比較多,且包的命名也不統一,又不想每個項目都copy一份相同的代碼,這樣會導致後以後升級很麻煩,不利於維護。於是我們想做成一個統一的jar包來給各項目引用,這樣每個項目只須要引用該jar,然後配置對應的切面值就可以了。
我們都知道,java中的註解裏面的值都是一個常量, 如:
@Pointcut("execution(* com.demo.Serviceable+.*(..))")
這種方式原則上是沒有辦法可以進行改變的。但是我們又要實現這將aop中的切面值做成一個動態配置的,每個項目的值的都不一樣的,該怎麼辦呢?
首先,我們可以先創建一個類來實現 MethodInterceptor
類 :
class LogAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Before method");//這裏做你的before操作
Object result = invocation.proceed();
System.out.println("After method");//這裏做你的after操作
return result;
}
}
然後創建一個Configuration類,創建Bean:
@Configuration
public class ConfigurableAdvisorConfig {
@Value("${pointcut.property}")
private String pointcut;
@Bean
public AspectJExpressionPointcutAdvisor configurabledvisor() {
AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();
advisor.setExpression(pointcut);
advisor.setAdvice(new LogAdvice ());
return advisor;
}
}
這裏面的 pointcut.property值來自於你的application.properties 等配置文件。
這樣,各項目只須要引用該jar,然後在配置文件中指定要攔截的pointcut就可以了。
小聲逼逼
:本文主要爲拋磚引玉,提供一個思路。比如,我們定時器採用註解方式配置的時候,cron
表達式也是註解裏面的一個字符串常量,那麼,我們能不能通過配置文件的方式來配置這個cron
呢?原理都是一樣的。我們要善於解決一類問題,而不是某一個問題。