實用:如何將aop中的pointcut值從配置文件中讀取

背景

改造老項目,須要加一個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呢?原理都是一樣的。我們要善於解決一類問題,而不是某一個問題。


發佈了265 篇原創文章 · 獲贊 361 · 訪問量 79萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章