日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Spring-AOP @AspectJ进阶之命名切点

發(fā)布時(shí)間:2025/3/21 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-AOP @AspectJ进阶之命名切点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 概述
  • 示例

概述

在前面所舉的例子中,比如

@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),我們可以通過(guò)@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),我們可以通過(guò)@Pointcut注解以及切面類方法對(duì)切點(diǎn)進(jìn)行命名* * @author: Mr.Yang* * @date: 2017年9月10日 下午11:13:45*/ public class NamePoint{/*** * * @Title: inPackage* * @Description: 通過(guò)注解方法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: 通過(guò)注解方法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)的名稱,此外方法的訪問(wèn)修飾符還控制了切點(diǎn)的可引用性,這種可引用性和類方法的可訪問(wèn)性相同,如private的切點(diǎn)只能在本類中引用,public的切點(diǎn)可以在任何類中引用。

命名切點(diǎn)僅利用方法名及訪問(wèn)修飾符的信息,所以習(xí)慣上,方法的返回類型為void,并且方法體為空。

我們可以通過(guò)下圖更直觀地了解命名切點(diǎn)的結(jié)構(gòu):

inPkgGreetTo()的切點(diǎn)引用了同類中的greetTo()切點(diǎn),而inPkgGreetTo()切點(diǎn)可以被任何類引用。

你還可以擴(kuò)展NamePoint類,通過(guò)類的繼承關(guān)系定義更多的切點(diǎn)。 命名切點(diǎn)定義好后,就可以在定義切面時(shí)通過(guò)名稱引用切點(diǎn).

來(lái)看個(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),然后編寫(xiě)切面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 方法 沒(méi)有織入第二個(gè)增強(qiáng)。

總結(jié)

以上是生活随笔為你收集整理的Spring-AOP @AspectJ进阶之命名切点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。