javascript
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 ");}切點(diǎn)直接聲明在增強(qiáng)方法處,這種切點(diǎn)聲明方式稱為匿名切點(diǎn),匿名切點(diǎn)只能在聲明處使用。
如果希望在其它地方重用一個(gè)切點(diǎn),我們可以通過@Pointcut注解以及切面類方法對(duì)切點(diǎn)進(jìn)行命名
示例
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
package com.xgj.aop.spring.advisor.aspectJAdvance.namePoint;import org.aspectj.lang.annotation.Pointcut;/*** * * @ClassName: NamePoint* * @Description: 如果希望在其它地方重用一個(gè)切點(diǎn),我們可以通過@Pointcut注解以及切面類方法對(duì)切點(diǎn)進(jìn)行命名* * @author: Mr.Yang* * @date: 2017年9月10日 下午11:13:45*/ public class NamePoint{/*** * * @Title: inPackage* * @Description: 通過注解方法inPackage()對(duì)該切點(diǎn)進(jìn)行命名,方法可視域* 修飾符為private,表明該命名切點(diǎn)只能在本切面類中使用。* * * @return: void*/@Pointcut("within(com.xgj.aop.spring.advisor.aspectJAdvance.namePoint)")private void inPackage() {};/*** * * @Title: greetTo* * @Description: 通過注解方法greetTo()對(duì)該切點(diǎn)進(jìn)行命名,方法可視域* 修飾符為protected,表明該命名切點(diǎn)可以在當(dāng)前包中的切面 類、子切面類中中使用。* * * @return: void*/@Pointcut("execution(* greetTo(..))")protected void greetTo() {}/*** * * @Title: inPkgGreetTo* * @Description: 引用命名切點(diǎn)定義的切點(diǎn),本切點(diǎn)也是命名切點(diǎn), 它對(duì)應(yīng)的可視域?yàn)閜ublic* * * @return: void*/@Pointcut("inPackage() and greetTo()")public void inPkgGreetTo() {}}上面上述示例中定義了3個(gè)命名切點(diǎn),命名切點(diǎn)的使用類方法作為切點(diǎn)的名稱,此外方法的訪問修飾符還控制了切點(diǎn)的可引用性,這種可引用性和類方法的可訪問性相同,如private的切點(diǎn)只能在本類中引用,public的切點(diǎn)可以在任何類中引用。
命名切點(diǎn)僅利用方法名及訪問修飾符的信息,所以習(xí)慣上,方法的返回類型為void,并且方法體為空。
我們可以通過下圖更直觀地了解命名切點(diǎn)的結(jié)構(gòu):
inPkgGreetTo()的切點(diǎn)引用了同類中的greetTo()切點(diǎn),而inPkgGreetTo()切點(diǎn)可以被任何類引用。
你還可以擴(kuò)展NamePoint類,通過類的繼承關(guān)系定義更多的切點(diǎn)。 命名切點(diǎn)定義好后,就可以在定義切面時(shí)通過名稱引用切點(diǎn).
來看個(gè)示例
假設(shè)有兩個(gè)業(yè)務(wù)類
package com.xgj.aop.spring.advisor.aspectJAdvance.namePoint;import org.springframework.stereotype.Component;/*** * * @ClassName: NaiveWaiter* * @Description: @Component注解標(biāo)注的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);} }切點(diǎn)命名復(fù)用上面那個(gè)切點(diǎn),然后編寫切面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注解標(biāo)注的切面,演示命名切點(diǎn)的使用* * @author: Mr.Yang* * @date: 2017年9月10日 下午11:42:39*/@Aspect public class NamePointAspect {/*** * * @Title: pkgGreetTo* * @Description: 引用了NamePoint.inPkgGreetTo()切點(diǎn)* * * @return: void*/@AfterReturning("NamePoint.inPkgGreetTo()")public void pkgGreetTo() {System.out.println("pkgGreetTo exectued ,some logic is here ");}/*** * * @Title: pkgGreetToNotNaiveWaiter* * @Description: 在復(fù)合運(yùn)算中使用了命名切點(diǎn)* * * @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)掃描類包以及應(yīng)用注解定義的bean --> <context:component-scan base-package="com.xgj.aop.spring.advisor.aspectJAdvance.namePoint"/><!-- 基于@AspectJ切面的驅(qū)動(dòng)器 --> <aop:aspectj-autoproxy proxy-target-class="true"/><!-- 使用了@AspectJ注解的切面類 --> <bean class="com.xgj.aop.spring.advisor.aspectJAdvance.namePoint.NamePointAspect"/></beans>測(cè)試類
package com.xgj.aop.spring.advisor.aspectJAdvance.namePoint;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;/*** * * @ClassName: NamePointAspectTest* * @Description: 命名切點(diǎn)測(cè)試類* * @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");} }運(yùn)行結(jié)果
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 方法 沒有織入第二個(gè)增強(qiáng)。
總結(jié)
以上是生活随笔為你收集整理的Spring-AOP @AspectJ进阶之命名切点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring MVC-使用Spring
- 下一篇: Spring-AOP @AspectJ进