日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

学习 Spring (十七) Spring 对 AspectJ 的支持 (完结)

發布時間:2025/4/5 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习 Spring (十七) Spring 对 AspectJ 的支持 (完结) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring入門篇 學習筆記

@AspectJ 的風格類似純 java 注解的普通 java 類

Spring 可以使用 AspectJ 來做切入點解析

AOP 的運行時仍舊是純的 Spring AOP, 對 AspectJ 的編譯器或者織入無依賴性

Spring 中配置 @AspectJ

對 @AspectJ 支持可以使用 XML 或 Java 風格的配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="com.karonda.aop.aspectj"/><aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>

確保 AspectJ 的 aspectjweaver.jar (1.6.8或更高版本) 庫包含在應用程序的 classpath 中

aspect

@AspectJ 切面使用 @Aspect 注解配置,擁有 @Aspect 的任何 bean 將被 Spring 自動識別并應用

用 @Aspect 注解的類可以有方法和字段,他們也可能包括切入點、通知和引入的聲明

@Aspect 注解是不能通過類路徑自動檢測發現的,所以需要配合使用 @Component 注釋或者在 XML 配置 bean

一個類中的 @Aspect 注解標識它為一個切面,并且將自己從自動代理中排除

@Component @Aspect public class MoocAspect {}

pointcut

一個切入點通過一個普通的方法定義來提供,并且切入點表達式使用 @Pointcut 注解,方法返回類型必須為 void

@Component @Aspect public class MoocAspect {@Pointcut("execution(* com.karonda.aop.aspectj.biz.*Biz.*(..))")public void pointcut() {}@Pointcut("within(com.karonda.aop.aspectj.biz.*)")public void bizPointcut() {}}

組合 pointcut

切入點表達式可以通過 &&, || 和 ! 進行組合,也可以通過名字引用切入點表達式

通過組合,可以建立更加復雜的切入點表達式

定義良好的 pointcut

AspectJ 是編譯期的 AOP

檢查代碼并匹配連接點與切入點的代價是昂貴的

一個好的切入點應該包括以下幾點:

  • 選擇特定類型的連接點,如:execution, get, set, call, handler
  • 確定連接點范圍,如:within, withincode
  • 匹配上下文信息,如:this, target, @annotation

advice

添加類:

@Service public class MoocBiz {public String save(String arg) {System.out.println("MoocBiz save : " + arg); // throw new RuntimeException(" Save failed!");return " Save success!";}}

添加測試類:

@RunWith(BlockJUnit4ClassRunner.class) public class TestAspectJ extends UnitTestBase {public TestAspectJ() {super("classpath:spring-aop-aspectj.xml");}@Testpublic void test() {MoocBiz biz = getBean("moocBiz");biz.save("This is test.");}}

Before advice

在 MoocAspect 類添加方法:

// @Before("execution(* com.karonda.aop.aspectj.biz.*Biz.*(..))")@Before("pointcut()")public void before() {System.out.println("Before.");}

After returning advice

@AfterReturning(pointcut="bizPointcut()", returning="returnValue")public void afterReturning(Object returnValue) {System.out.println("AfterReturning : " + returnValue);}

After throwing advice

@AfterThrowing(pointcut="pointcut()", throwing="e")public void afterThrowing(RuntimeException e) {System.out.println("AfterThrowing : " + e.getMessage());}

After (finally) advice

最終通知必須準備處理正常和異常兩種返回情況,它通常用于釋放資源

@After("pointcut()")public void after() {System.out.println("After.");}

Around advice

@Around("pointcut()")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("Around 1.");Object obj = pjp.proceed();System.out.println("Around 2.");System.out.println("Around : " + obj);return obj;}

advice 擴展

給 advice 傳遞參數

args

@Before("pointcut() && args(arg)")public void beforeWithParam(String arg) {System.out.println("BeforeWithParam." + arg);}

annotation

可以用來判斷方法上是否加了某注解或者方法上加的注解對應的值

定義一個注解:

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MoocMethod {String value();}

添加注解;

@Service public class MoocBiz {@MoocMethod("MoocBiz save MoocMethod.")public String save(String arg) {System.out.println("MoocBiz save : " + arg); // throw new RuntimeException(" Save failed!");return " Save success!";}}

添加通知:

@Before("pointcut() && @annotation(moocMethod)")public void beforeWithAnnotaion(MoocMethod moocMethod) {System.out.println("BeforeWithAnnotation." + moocMethod.value());}

advice 的參數及泛型

public interface Sample<T>{void sampleGenericMethod (T param);void sampleGenericCollectionMethod (Collection<T> param); }@Before("execution(* ..Sample+.sampleGenericMethod(*)) && args(param)") public void beforeSampleMethod(MyType param){}@Before("execution(* ..Sample+.sampleGenericCollectionMethod(*)) && args(param)") public void beforeSampleMethod(Collection<MyType> param){ }

advice 參數名稱

通知和切入點注解有一個額外的 argNames 屬性,它可以用來指定所注解的方法的參數名

@Before(value="com.xyz.lib.Pointcuts.anyPublicMethod() && target(bean) && annotation(auditable)", argNames="bean,auditable") public void audit(Object bean, Auditable a)

如果第一個參數是 JoinPoint, ProceedingJoinPoint, JoinPoint.StaticPart 那么可以忽略它

@Before(value="com.xyz.lib.Pointcuts.anyPublicMethod() && target(bean) && annotation(auditable)", argNames="bean,auditable") public void audit(JoinPoint jp, Object bean, Auditable a)

Introduction

允許一個切面聲明一個通知對象實現指定接口,并且提供了一個接口實現類來代表這些對象

introduction 使用 @DeclareParents 進行注解,這個注解用來定義匹配的類型擁有一個新的 parent

@Aspect public class UsageTracking{@DeclareParents(value="com.xyz.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)public class UsageTracked mixin;@Before("com.xyz.myapp.SystemArchitecture.businessService() && this(usageTracked)")public void recordUsage(UsageTracked usageTracked) {usageTracked.incrementUseCount();} }

切面實例化模型

perthis 切面通過指定 @Aspect 注解 perthis 子句實現

每個獨立的 service 對象執行時都會創建一個切面實例

service 對象的每個方法在第一次執行的時候創建切面實例,切面在 service 對象失效的同時失效

@Aspect("perthis(com.xyz.myapp.SystemArchitecture.businessService())") public class MyAspect{private int someState;@Before(com.xyz.myapp.SystemArchitecture.businessService())public void recordServiceUsage(){}}

源碼:learning-spring

轉載于:https://www.cnblogs.com/victorbu/p/10528957.html

總結

以上是生活随笔為你收集整理的学习 Spring (十七) Spring 对 AspectJ 的支持 (完结)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品无码内射 | 国产乱free国语对白 | 日本aaa视频 | 色欲久久久天天天综合网 | 亚洲av高清一区二区三区 | 国产一区二区三区久久 | 就操网| 有码一区二区 | 9色91| 日本三级视频在线播放 | 不卡的av在线播放 | 啪啪av| 日韩中文字幕精品 | 成人在线观看一区二区三区 | 老司机黄色影院 | 午夜在线观看免费视频 | 国产一区二区精彩视频 | 天堂久久av | 国产一级做a爰片久久毛片男男 | 亚洲美女中文字幕 | 日韩有码在线观看 | 在线观看免费黄视频 | 在线中文字幕网站 | 精品人人 | 免费日韩网站 | 色二区| 猛男大粗猛爽h男人味 | 日本在线视频一区二区 | 国产一区在线免费观看 | 亚洲九九 | 色综合天天色 | 日韩一区二区三区精品视频 | 国产精品美女视频 | 国产精自产拍久久久久久蜜 | 伊人久在线| 免费在线观看av网站 | 成人免费观看av | 天天综合网在线观看 | 99涩涩 | 亚洲精品高潮久久久久久久 | 91精品在线看| 精品看片 | 涩涩网站视频 | 国产精品久久久久av | 美女福利在线观看 | 日本黄色录像片 | 97人人澡人人爽人人模亚洲 | 黄色网络在线观看 | 视频久久 | 鲁一鲁av| 亚洲国产精品福利 | 国产伦理av | 久热精品视频在线观看 | 欧美日韩在线不卡 | 美女露胸无遮挡 | 精品久久二区 | 精品午夜久久久 | 2021狠狠干 | 狠狠干综合网 | 亚洲免费视频网站 | 日韩午夜av | 欲求不满在线小早川怜子 | 免费视频91 | 精品亚洲一区二区三区 | 少妇厨房愉情理伦bd在线观看 | 97视频在线免费观看 | 午夜一区不卡 | 国产精品三区四区 | 最新国产精品自拍 | 91福利视频导航 | 亚洲国产黄| 91精品亚洲一区 | 天天综合天天 | 521av在线 | 99人妻少妇精品视频一区 | 国产三级午夜理伦三级 | 精品美女www爽爽爽视频 | 亚洲日本网站 | 精品黄色在线观看 | 久草视频精品在线 | 亚洲精品视频在线观看视频 | 另类视频在线观看+1080p | 一区二区三区在线视频免费观看 | 久久伊人精品 | 国产又粗又猛视频 | 人人综合 | 久久午夜精品视频 | 亚洲免费av网 | 伊人久久大香网 | 久久艹av | 男人添女人下部高潮全视频 | 国产精品69久久久久 | 成人亚洲电影 | 91精品国产欧美一区二区 | 精品国产乱码久久久久夜深人妻 | 亚洲一区二区三区四区 | 6080av| 四虎最新域名 | 天天天操 |