當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring-AOP @AspectJ进阶之命名切点
生活随笔
收集整理的這篇文章主要介紹了
Spring-AOP @AspectJ进阶之命名切点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 概述
- 示例
概述
在前面所舉的例子中,比如
@Before("within(com.xgj.aop.spring.advisor.aspectJAdvance.pointcutComplex.*)"+ " && execution(* greetTo(..))")public void matchGreetTo() {System.out.println("matchGreetTo executed,some logic is here ");}切點直接聲明在增強方法處,這種切點聲明方式稱為匿名切點,匿名切點只能在聲明處使用。
如果希望在其它地方重用一個切點,我們可以通過@Pointcut注解以及切面類方法對切點進行命名
示例
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
package com.xgj.aop.spring.advisor.aspectJAdvance.namePoint;import org.aspectj.lang.annotation.Pointcut;/*** * * @ClassName: NamePoint* * @Description: 如果希望在其它地方重用一個切點,我們可以通過@Pointcut注解以及切面類方法對切點進行命名* * @author: Mr.Yang* * @date: 2017年9月10日 下午11:13:45*/ public class NamePoint{/*** * * @Title: inPackage* * @Description: 通過注解方法inPackage()對該切點進行命名,方法可視域* 修飾符為private,表明該命名切點只能在本切面類中使用。* * * @return: void*/@Pointcut("within(com.xgj.aop.spring.advisor.aspectJAdvance.namePoint)")private void inPackage() {};/*** * * @Title: greetTo* * @Description: 通過注解方法greetTo()對該切點進行命名,方法可視域* 修飾符為protected,表明該命名切點可以在當前包中的切面 類、子切面類中中使用。* * * @return: void*/@Pointcut("execution(* greetTo(..))")protected void greetTo() {}/*** * * @Title: inPkgGreetTo* * @Description: 引用命名切點定義的切點,本切點也是命名切點, 它對應的可視域為public* * * @return: void*/@Pointcut("inPackage() and greetTo()")public void inPkgGreetTo() {}}上面上述示例中定義了3個命名切點,命名切點的使用類方法作為切點的名稱,此外方法的訪問修飾符還控制了切點的可引用性,這種可引用性和類方法的可訪問性相同,如private的切點只能在本類中引用,public的切點可以在任何類中引用。
命名切點僅利用方法名及訪問修飾符的信息,所以習慣上,方法的返回類型為void,并且方法體為空。
我們可以通過下圖更直觀地了解命名切點的結構:
inPkgGreetTo()的切點引用了同類中的greetTo()切點,而inPkgGreetTo()切點可以被任何類引用。
你還可以擴展NamePoint類,通過類的繼承關系定義更多的切點。 命名切點定義好后,就可以在定義切面時通過名稱引用切點.
來看個示例
假設有兩個業務類
package com.xgj.aop.spring.advisor.aspectJAdvance.namePoint;import org.springframework.stereotype.Component;/*** * * @ClassName: NaiveWaiter* * @Description: @Component注解標注的bean* * @author: Mr.Yang* * @date: 2017年9月10日 下午11:55:00*/@Component public class NaiveWaiter {public void greetTo(String clientName) {System.out.println("NaiveWaiter greetTo " + clientName);}public void serverTo(String clientName) {System.out.println("NaiveWaiter serverTo " + clientName);} } package com.xgj.aop.spring.advisor.aspectJAdvance.namePoint;import org.springframework.stereotype.Component;@Component public class CuteWaiter {public void greetTo(String clientName) {System.out.println("CuteWaiter greetTo " + clientName);}public void serverTo(String clientName) {System.out.println("CuteWaiter serverTo " + clientName);} }切點命名復用上面那個切點,然后編寫切面NamePointAspect
package com.xgj.aop.spring.advisor.aspectJAdvance.namePoint;import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect;/*** * * @ClassName: NamePointTest* * @Description: 使用@Aspect注解標注的切面,演示命名切點的使用* * @author: Mr.Yang* * @date: 2017年9月10日 下午11:42:39*/@Aspect public class NamePointAspect {/*** * * @Title: pkgGreetTo* * @Description: 引用了NamePoint.inPkgGreetTo()切點* * * @return: void*/@AfterReturning("NamePoint.inPkgGreetTo()")public void pkgGreetTo() {System.out.println("pkgGreetTo exectued ,some logic is here ");}/*** * * @Title: pkgGreetToNotNaiveWaiter* * @Description: 在復合運算中使用了命名切點* * * @return: void*/@AfterReturning("!target(com.xgj.aop.spring.advisor.aspectJAdvance.namePoint.NaiveWaiter) && NamePoint.inPkgGreetTo()")public void pkgGreetToNotNaiveWaiter() {System.out.println("pkgGreetToNotNaiveWaiter() executed,some logic is here");} }配置文件如下:
<?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"xmlns:context="http://www.springframework.org/schema/context"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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- (1)聲明Context命名空間以及Schema文件 (2)掃描類包以及應用注解定義的bean --> <context:component-scan base-package="com.xgj.aop.spring.advisor.aspectJAdvance.namePoint"/><!-- 基于@AspectJ切面的驅動器 --> <aop:aspectj-autoproxy proxy-target-class="true"/><!-- 使用了@AspectJ注解的切面類 --> <bean class="com.xgj.aop.spring.advisor.aspectJAdvance.namePoint.NamePointAspect"/></beans>測試類
package com.xgj.aop.spring.advisor.aspectJAdvance.namePoint;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;/*** * * @ClassName: NamePointAspectTest* * @Description: 命名切點測試類* * @author: Mr.Yang* * @date: 2017年9月10日 下午11:56:50*/public class NamePointAspectTest {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advisor/aspectJAdvance/namePoint/conf-namePoint.xml");CuteWaiter cuteWaiter = ctx.getBean("cuteWaiter", CuteWaiter.class);NaiveWaiter naiveWaiter = ctx.getBean("naiveWaiter", NaiveWaiter.class);naiveWaiter.greetTo("XiaoGongJiang");System.out.println("================");cuteWaiter.greetTo("XiaoGongJiang");System.out.println("================");naiveWaiter.serverTo("XiaoGongJiang");System.out.println("================");cuteWaiter.serverTo("XiaoGongJiang");} }運行結果
2017-09-11 00:58:34,752 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4888884e: startup date [Mon Sep 11 00:58:34 BOT 2017]; root of context hierarchy 2017-09-11 00:58:34,821 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/aspectJAdvance/namePoint/conf-namePoint.xml] NaiveWaiter greetTo XiaoGongJiang pkgGreetTo exectued ,some logic is here ================ CuteWaiter greetTo XiaoGongJiang pkgGreetTo exectued ,some logic is here pkgGreetToNotNaiveWaiter() executed,some logic is here ================ NaiveWaiter serverTo XiaoGongJiang pkgGreetTo exectued ,some logic is here ================ CuteWaiter serverTo XiaoGongJiang pkgGreetTo exectued ,some logic is here pkgGreetToNotNaiveWaiter() executed,some logic is here可以看到NaiveWaiter greetTo 方法 沒有織入第二個增強。
總結
以上是生活随笔為你收集整理的Spring-AOP @AspectJ进阶之命名切点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring MVC-使用Spring
- 下一篇: Spring-AOP @AspectJ进