您好,登錄后才能下訂單哦!
小編給大家分享一下Spring-AOP 靜態正則表達式方法怎么匹配切面,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
在Spring-AOP 靜態普通方法名匹配切面案例中 StaticMethodMatcherPointcutAdvisor中,僅能通過方法名定義切點,這種描述方式不夠靈活,假設目標類中有多個方法,切滿足一定的命名規范,使用正則表達式進行匹配就靈活多了。
RegexpMethodPointcutAdvisor是正則表達式方法匹配的切面實現類,該類已經是功能齊全的實現類,一般情況下無需擴展該類。
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
package com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor; public class Waiter { /** * * * @Title: greetTo * * @Description: * * @param name * * @return: void */ public void greetTo(String name) { System.out.println("Waiter Greet to " + name); } /** * * * @Title: serverTo * * @Description: * * @param name * * @return: void */ public void serverTo(String name) { System.out.println("Waiter Server to " + name); } }
package com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor; public class Seller { /** * * * @Title: greetTo * * @Description: 和Waiter類中的同名的方法,目的是為了驗證僅僅織入了Waiter類中的greetTo方法 * * @param name * * @return: void */ public void greetTo(String name) { System.out.println("Seller Greet to " + name); } }
package com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; /** * * * @ClassName: GreetBeforeAdivce * * @Description: * * @author: Mr.Yang * * @date: 2017年8月18日 下午11:29:46 */ public class GreetBeforeAdivce implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target) throws Throwable { // 輸出切點 System.out.println("Pointcut:" + target.getClass().getName() + "." + method.getName()); String clientName = (String) args[0]; System.out.println("How are you " + clientName + " ?"); } }
RegexpMethodPointcutAdvisor是正則表達式方法匹配的切面實現類,該類已經是功能齊全的實現類,一般情況下無需擴展該類。
直接使用RegexpMethodPointcutAdvisor,通過配置的方式為目標類定義一個切面
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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"> <!-- 配置切面:靜態正則表達式方法匹配切面 --> <!-- Waiter目標類 --> <bean id="waiterTarget" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.Waiter"/> <!-- Seller目標類 --> <bean id="sellerTarget" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.Seller"/> <!-- 前置增強 --> <bean id="greetBeforeAdvice" class="com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor.GreetBeforeAdivce"/> <!-- 切面 --> <bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" p:advice-ref="greetBeforeAdvice" p:pattern=".*greet.*" > <!-- 向切面注入一個前置增強 , 用正則表達式定義目標類全限定方法名的匹配模式串 。--> </bean> <!-- 通過父bean,配置公共的信息 --> <bean id="parent" abstract="true" class="org.springframework.aop.framework.ProxyFactoryBean" p:interceptorNames="regexpAdvisor" p:proxyTargetClass="true"/> <!-- waiter代理 --> <bean id="waiter" parent="parent" p:target-ref="waiterTarget"/> <!-- seller代理 --> <bean id="seller" parent="parent" p:target-ref="sellerTarget"/> </beans>
package com.xgj.aop.spring.advisor.RegexpMethodPointcutAdvisor; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * * * @ClassName: RegexpMethodPointcutAdvisorTest * * @Description: 單元測試類 * * @author: Mr.Yang * * @date: 2017年8月18日 下午11:30:01 */ public class RegexpMethodPointcutAdvisorTest { @Test public void test() { // 加載配置文件,啟動容器 ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:com/xgj/aop/spring/advisor/RegexpMethodPointcutAdvisor/conf-advisor.xml"); // 從容器中獲取Bean Waiter waiter = ctx.getBean("waiter", Waiter.class); Seller seller = ctx.getBean("seller", Seller.class); // 調用業務方法 waiter.greetTo("XiaoGongJiang"); waiter.serverTo("XiaoGongJiang"); seller.greetTo("XiaoGongJiang"); } }
可見,Waiter和 Seller的greetTo()都成功的織入了切面,Waiter.serverTo()沒有被織入切面。
RegexpMethodPointcutAdvisor除了pattern和advice屬性外 ,還有另外兩個屬性
patterns: 如果只有一個匹配串模式,這可以使用pattern屬性配置,如果需要定義多個匹配模式穿,就需要使用patterns屬性了, 這些匹配模式串是“或"的關系。order:切面織入時對應的順序
可以使用RegexBuddy簡單的測下,如果匹配,下方會以黃色標注。
看完了這篇文章,相信你對“Spring-AOP 靜態正則表達式方法怎么匹配切面”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。