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

歡迎訪問 生活随笔!

生活随笔

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

javascript

Spring-AOP 使用@AspectJ

發布時間:2025/3/21 javascript 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-AOP 使用@AspectJ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 概述
  • 準備工作
  • 實例
    • 通過編碼的方式使用AspectJ切面
    • 通過配置的方式使用AspectJ切面
      • 自動生成代理的方式
      • 基于Schema的aop命名空間配置的方式

概述

我們之前一個系列的文章,分別使用Pointcut和Advice接口描述切點和增強,并用Advisor整合二者描述切面,@AspectJ則采用注解來描述切點、增強,二者只是表述方式不同,描述內容的本質是完全相同的。


準備工作

  • 在使用@AspectJ之前,必須確保使用的Java5.0以及以上的版本,否則無法使用注解。

  • Spring在處理@AspectJ注解表達式時,需要將Spring的asm模塊添加到類路徑中。asm是輕量級的字節碼處理框架,因為Java的反射機制無法獲取入參名,Spring就利用asm處理@AQspectJ中所描述的方法入參名

  • 如果是maven工程,需要在pom.xml添加aspectj.weaver和aspectj.tools類包的依賴。

<!-- asm/cglib依賴(spring依賴) --><dependency><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>${asm.version}</version></dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm-util</artifactId><version>${asm.version}</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>${cglib.version}</version><exclusions><exclusion><artifactId>asm</artifactId><groupId>org.ow2.asm</groupId></exclusion></exclusions></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>${aspectj.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectj.version}</version></dependency><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>${aopalliance.version}</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>${commons-codec.version}</version></dependency>

實例

代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster

通過編碼的方式使用@AspectJ切面

@AspectJ采用不同的方式對AOP進行描述。

我們依舊采用我們一直使用的服務生的例子

package com.xgj.aop.spring.advisor.aspectJ.aspectJByCode;public class NaiveWaiter implements Waiter {@Overridepublic void greetTo(String name) {System.out.println("NaiveWaiter Greet To " + name);}@Overridepublic void serverTo(String name) {System.out.println("NaiveWaiter Server To " + name);}}

下面使用@AspectJ注解定義一個切面

package com.xgj.aop.spring.advisor.aspectJ.aspectJByCode;import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before;/*** * * @ClassName: PreGreetingAspect* * @Description: 切面類* * @author: Mr.Yang* * @date: 2017年8月24日 下午3:21:15*/// 通過@Aspect將PreGreetingAspect標注為一個切面 @Aspect public class PreGreetingAspect {// 定義切點和增強類型@Before("execution(* greetTo(..))")public void beforeGreeting() {// 增強的橫切邏輯System.out.println("How are you ?");} }

從上述代碼中,我們可以看到這個切面沒有實現任何特殊的接口,它只是一個普通的POJO,特殊之處在于使用了@AspectJ注解。

首先,在PreGreetingAspect類定義出標注了@AspectJ注解,這樣,第三方處理程序就可以通過類是否擁有@AspectJ注解來判斷其是否是一個切面。

其次,在beforeGreeting()方法處標注了@Before注解,并未改注解提供了成員值“execution(* greetTo(..))”

@Before(“execution(* greetTo(..))”)注解提供了兩個信息: @Before注解白該增強是前置增強,而成員值是一個@AspectJ切點表達式。 意思為:在目標類的greetTo方法上織入增強,greetTo()方法可以帶帶任意的入參和任意的返回值。

最后beforeGreeting()方法是增強說是所使用的橫切邏輯,該橫切邏輯在目標方法前調用。

我們通過下圖來先看下這種關系 《切面的信息構成》

PreGreetingAspect類通過注解和代碼,將切點、增強類型和增強的橫切邏輯柔和到一個類中,使切面的定義渾然天成。 其實相當于我們之前說的BeforeAdivce、NameMatchMethodPoincut和DefaultPointcutAdvisor三者聯合表達的信息。

下面我們通過AspectProxyFactory為NaiverWaiter生成織入PreGreetingAspect切面的代碼

package com.xgj.aop.spring.advisor.aspectJ.aspectJByCode;import org.junit.Test; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;/*** * * @ClassName: PreGreetingAspectTest* * @Description:* * @author: Mr.Yang* * @date: 2017年8月24日 下午3:21:29*/ public class PreGreetingAspectTest {@Testpublic void test() {// 目標類Waiter target = new NaiveWaiter();// 實例化切面代理工廠AspectJProxyFactory aspectJProxyFactory = new AspectJProxyFactory();// 設置目標對象aspectJProxyFactory.setTarget(target);// 添加切面類aspectJProxyFactory.addAspect(PreGreetingAspect.class);// 生成織入切面的代理對象Waiter proxy = aspectJProxyFactory.getProxy();// 調用業務方法proxy.greetTo("XiaoGongJiang");proxy.serverTo("XiaoGongJiang");} }

運行結果

How are you ? NaiveWaiter Greet To XiaoGongJiang NaiveWaiter Server To XiaoGongJiang

從輸出結果,我們可以知道代理對象的greetTo()方法已經被織入了切面類所定義的增強邏輯。


通過配置的方式使用@AspectJ切面

雖然可以通過編程的方式織入切面,但是一般情況下,我們都是通過Spring的配置完成切面織入工作。

自動生成代理的方式

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 通過配置使用@AspectJ --><!-- 目標Bean --> <bean id="waiter" class="com.xgj.aop.spring.advisor.aspectJ.aspectJByConf.NaiveWaiter"/> <!-- 使用了@AspectJ注解的切面類 --> <bean class="com.xgj.aop.spring.advisor.aspectJ.aspectJByConf.PreGreetingAspect"/> <!-- 自動代理創建器,自動將@AspectJ注解切面類織入目標Bean中 --> <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/></beans>

測試:

package com.xgj.aop.spring.advisor.aspectJ.aspectJByConf;import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;/*** * * @ClassName: PreGreetingAspectTest* * @Description:* * @author: Mr.Yang* * @date: 2017年8月24日 下午3:21:29*/ public class PreGreetingAspectTest {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advisor/aspectJ/aspectJByConf/conf-aspectJ.xml");Waiter naiveWaiter = ctx.getBean("waiter", Waiter.class);naiveWaiter.greetTo("XiaoGongJiang");naiveWaiter.serverTo("XiaoGongJiang");} }

運行結果:

2017-08-24 17:29:48,644 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@24177697: startup date [Thu Aug 24 17:29:48 BOT 2017]; root of context hierarchy 2017-08-24 17:29:48,754 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/aspectJ/aspectJByConf/conf-aspectJ.xml] How are you ? NaiveWaiter Greet To XiaoGongJiang NaiveWaiter Server To XiaoGongJiang

基于Schema的aop命名空間配置的方式

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 使用基于Schema的aop命名空間進行配置 --><!-- 基于@AspectJ切面的驅動器 --> <aop:aspectj-autoproxy/><!-- 目標Bean --> <bean id="waiter" class="com.xgj.aop.spring.advisor.aspectJ.aspectJByConf.NaiveWaiter"/> <!-- 使用了@AspectJ注解的切面類 --> <bean class="com.xgj.aop.spring.advisor.aspectJ.aspectJByConf.PreGreetingAspect"/></beans>

首先在配置文件中引入aop的命名空間;然后通過aop命名空間的<aop:aspectj-atuoproxy/>自動為Spring容器中哪些匹配@AspectJ切面的bean 創建代理,完成切面織入。

當然了,Spring在內部依舊使用AnnotationAspectJAutpProxyCreator進行自動代理的創建工作,但具體的實現細節被<aop:aspectj-atuoproxy/>隱藏起來了。

<aop:aspectj-atuoproxy/>有一個proxy-target-class屬性,默認為false,標識使用JDK動態代理技術織入增強。 當配置 <aop:aspectj-autoproxy proxy-target-class="true"/>表示使用CGLib動態代理技術織入增強。

不過即使 proxy-target-class設置為false,如果目標類沒有聲明接口,Spring將自動使用CGLib動態代理

測試

package com.xgj.aop.spring.advisor.aspectJ.aspectJByConf;import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class PreGreetingAspectSchemaTest {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advisor/aspectJ/aspectJByConf/conf-aspectJ_schema.xml");Waiter naiveWaiter = ctx.getBean("waiter", Waiter.class);naiveWaiter.greetTo("XiaoGongJiang");naiveWaiter.serverTo("XiaoGongJiang");} }

運行結果

2017-08-24 17:30:28,141 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@24177697: startup date [Thu Aug 24 17:30:28 BOT 2017]; root of context hierarchy 2017-08-24 17:30:28,244 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/aspectJ/aspectJByConf/conf-aspectJ_schema.xml] How are you ? NaiveWaiter Greet To XiaoGongJiang NaiveWaiter Server To XiaoGongJiang

通過輸出結果,我們可以看到實現了同樣的效果。

總結

以上是生活随笔為你收集整理的Spring-AOP 使用@AspectJ的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 粉嫩av一区二区三区四区五区 | 国产资源在线免费观看 | 九九热精品视频在线播放 | 欧美不卡一区 | 天天影视插插插 | 国产传媒av | 少妇喷白浆 | 日本免费电影一区二区三区 | 韩国三级丰满少妇高潮 | 五月激情婷婷丁香 | 免费在线黄色网 | 鬼灭之刃柱训练篇在线观看 | 欧美成人久久久免费播放 | 免费观看一区二区三区视频 | 一本色综合| 内射一区二区 | av调教 | 国产精品无码一区二区三 | 91极品身材尤物theporn | 国产96视频 | 欧美视频一区二区 | 白又丰满大屁股bbbbb | 欧美亚洲另类小说 | 亚洲一区亚洲二区 | 四虎在线免费视频 | 国产在线观看无码免费视频 | 国产男女无遮挡猛进猛出 | 精品一区二区三区四区五区 | 中文字幕一区二区在线观看视频 | 亚洲第一精品在线观看 | 欧美精品自拍视频 | 91在线网 | 欧美日韩三级视频 | 日韩专区一区二区三区 | 91香蕉国产在线观看软件 | 日韩高清在线观看 | 欧美做爰猛烈床戏大尺度 | 成人依依 | 中文字幕在线播放av | 天天碰天天| 欧美成人三级在线视频 | 无码人妻丰满熟妇区96 | 日本一二三区视频在线 | 国产一区免费观看 | 中文字幕日产 | 成人黄色短片 | 日韩一区二区三区久久 | 夜夜嗨av一区二区 | 久久国产小视频 | 中文精品视频 | 久久久久久久久久久久久久国产 | 国产高清片 | 精品国产乱码久久久久久1区二区 | 日韩精选av | 女仆裸体打屁屁羞羞免费 | 懂色av蜜臂av粉嫩av | 亚洲综合在线观看视频 | 久久重口味 | 国产精品久久久久久久久久免费看 | 涩涩涩在线视频 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 亲吻刺激视频 | 羞羞的视频在线观看 | 中国少妇做爰全过程毛片 | 国产ts系列 | 亚洲乱亚洲乱 | 91麻豆精品国产91久久久更新时间 | 亚洲av毛片 | 三级黄网 | 一区免费视频 | sm久久捆绑调教精品一区 | 国产一区视频观看 | 日韩精品久久久久久久 | 欧美视频在线观看一区二区三区 | 国产日韩在线播放 | 一个人在线免费观看www | 国产18av| 日日噜夜夜噜 | 男人插女人的网站 | 打屁股调教视频 | 国产又粗又猛又爽又黄的视频小说 | 一道本在线观看 | 国产成人无码精品久在线观看 | 91免费看网站 | 中国特级毛片 | 免费观看已满十八岁 | 成人你懂的 | 亚洲精品一区二区三区蜜桃久 | 我要色综合天天 | 人人人射 | 自拍偷拍亚洲天堂 | 日韩视频免费观看高清完整版 | 在线播放亚洲 | 国产男女猛烈无遮挡a片漫画 | 色婷婷亚洲| 伊人久久97| 按摩毛片| 国产九色视频 | 亚洲aa视频|