最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot動態(tài)配置AOP切點詳解

 更新時間:2023年09月08日 11:29:25   作者:澄風(fēng)  
這篇文章主要介紹了Springboot動態(tài)配置AOP切點詳解,Springboot 可以定義注解切點去攔截注解修飾的類方法以及execution(xxxx)切點去攔截具體的類方法,默認情況下我們都會使用注解@PointCut去定義切點,然后定義切面攔截切點,需要的朋友可以參考下

前言

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)文章

  • Spring Boot不同版本Redis設(shè)置JedisConnectionFactory詳解

    Spring Boot不同版本Redis設(shè)置JedisConnectionFactory詳解

    本文章向大家介紹Spring Boot不同版本Redis設(shè)置JedisConnectionFactory,主要內(nèi)容包括1.X 版本、2.X 版本、2.、基本概念、基礎(chǔ)應(yīng)用、原理機制和需要注意的事項等,并結(jié)合實例形式分析了其使用技巧,希望通過本文能幫助到大家理解應(yīng)用這部分內(nèi)容
    2023-09-09
  • SpringBoot Test及注解的使用詳解

    SpringBoot Test及注解的使用詳解

    這篇文章主要介紹了SpringBoot Test及注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 查找IDEA文件目錄下tomcat文件的具體位置

    查找IDEA文件目錄下tomcat文件的具體位置

    IDEA中Tomcat文件目錄位置可能在:C:\Users\用戶名\.IntelliJIdea\system\tomcat或C:\Users\用戶名\AppData\Local\JetBrains\IntelliJIdea\system\tomcat,可以通過運行Tomcat查看Server中顯示的CATALINA_BASE找到對應(yīng)路徑
    2026-02-02
  • RocketMQ 延時級別配置方式

    RocketMQ 延時級別配置方式

    這篇文章主要介紹了RocketMQ 延時級別配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java獲取文件夾下所有文件名稱的方法示例

    Java獲取文件夾下所有文件名稱的方法示例

    這篇文章主要介紹了Java獲取文件夾下所有文件名稱的方法,涉及java針對文件與目錄相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 最新評論

    马尔康县| 镇巴县| 凌源市| 工布江达县| 浑源县| 仙桃市| 措勤县| 彭泽县| 富阳市| 云梦县| 西宁市| 阿克| 泽州县| 晋江市| 南乐县| 武汉市| 鄢陵县| 元氏县| 瓦房店市| 清镇市| 赣榆县| 长白| 土默特右旗| 天峻县| 舟曲县| 徐州市| 疏附县| 开封市| 吉林市| 皮山县| 仙桃市| 漳平市| 布尔津县| 自贡市| 呼和浩特市| 翼城县| 宁阳县| 富宁县| 石嘴山市| 济南市| 兴安县|