javascript
Spring-AOP 静态普通方法名匹配切面
文章目錄
- 概述
- 實例
概述
StaticMethodMatcherPointcutAdvisor代表一個靜態方法匹配切面,它通過StaticMethodMatcherPointcut來定義切點,并通過類過濾和方法名來匹配所定義的切點.
實例
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
我們假設我們業務類中 Waiter和 Seller中都有同名的greetTo()方法.
業務類Waiter
package com.xgj.aop.spring.advisor.StaticMethodMatcherPointcutAdvisor;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);} }業務類Seller
package com.xgj.aop.spring.advisor.StaticMethodMatcherPointcutAdvisor;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);} }現在我們希望通過StaticMethodMatcherPointcutAdvisor定義一個切面,在Waiter#greetTo()方法調用前織入一個增強,即連接點為Waiter#greetTo()方法調用前的位置。
切面代碼
package com.xgj.aop.spring.advisor.StaticMethodMatcherPointcutAdvisor;import java.lang.reflect.Method;import org.springframework.aop.ClassFilter; import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;/*** * * @ClassName: GreetingAdvisor* * @Description: 切面類* * @author: Mr.Yang* * @date: 2017年8月18日 下午8:27:52*/ public class GreetingAdvisor extends StaticMethodMatcherPointcutAdvisor {private static final long serialVersionUID = 1L;/*** 重寫matches方法,切點方法匹配規則:方法名為greetTo*/@Overridepublic boolean matches(Method method, Class<?> targetClass) {return "greetTo".equals(method.getName());}/*** 默認情況下,匹配所有的類,重寫getClassFilter,定義匹配規則 切點類型匹配規則,為Waiter的類或者之類*/public ClassFilter getClassFilter() {return new ClassFilter() {@Overridepublic boolean matches(Class<?> clazz) {return Waiter.class.isAssignableFrom(clazz);}};} }StaticMethodMatcherPointcutAdvisor 抽象類唯一需要定義的是matches()方法,在默認情況下,該切面匹配所有的類,這里通過覆蓋getClassFilter()方法,讓它僅匹配Waiter類及其子類。
當然,Advisor還需要一個增強類的配合 .
我們來定義一個前置增強
我們使用Spring配置來定義切面等信息
<?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.StaticMethodMatcherPointcutAdvisor.Waiter"/><!-- Seller目標類 --><bean id="sellerTarget" class="com.xgj.aop.spring.advisor.StaticMethodMatcherPointcutAdvisor.Seller"/><!-- 前置增強 --><bean id="greetBeforeAdvice" class="com.xgj.aop.spring.advisor.StaticMethodMatcherPointcutAdvisor.GreetBeforeAdivce"/><!-- 切面 --><bean id="greetAdvicesor" class="com.xgj.aop.spring.advisor.StaticMethodMatcherPointcutAdvisor.GreetingAdvisor"p:advice-ref="greetBeforeAdvice"/> <!-- 向切面注入一個前置增強 --><!-- 通過父bean,配置公共的信息 --><bean id="parent" abstract="true" class="org.springframework.aop.framework.ProxyFactoryBean"p:interceptorNames="greetAdvicesor"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.StaticMethodMatcherPointcutAdvisor;import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;/*** * * @ClassName: StaticMethodMatcherPointcutAdvisorTest* * @Description: 測試類* * @author: Mr.Yang* * @date: 2017年8月18日 下午8:29:28*/ public class StaticMethodMatcherPointcutAdvisorTest {@Testpublic void test() {// 加載配置文件,啟動容器ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advisor/StaticMethodMatcherPointcutAdvisor/conf-advisor.xml");// 從容器中獲取BeanWaiter waiter = ctx.getBean("waiter", Waiter.class);Seller seller = ctx.getBean("seller", Seller.class);// 調用業務方法waiter.greetTo("XiaoGongJiang");waiter.serverTo("XiaoGongJiang");seller.greetTo("XiaoGongJiang");} }運行結果:
我們可以看到切面僅僅織入了Wwaiter.greetTo()方法調用前的連接點上, Waiter.serverTo()和Seller.greetTo()方法并沒有織入切面
更多內容請訪問 https://github.com/yangshangwei/SpringMaster
總結
以上是生活随笔為你收集整理的Spring-AOP 静态普通方法名匹配切面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-AOP 通过配置文件实现
- 下一篇: Git-将已有的项目转换为GIT项目托管