Spring鐨凙OP鏄笂闈唬鐞嗘ā寮忕殑娣卞叆銆備嬌鐢⊿pring AOP錛屽紑鍙戣呮棤闇瀹炵幇涓氬姟閫昏緫瀵硅薄宸ュ巶錛屾棤闇瀹炵幇浠g悊宸ュ巶錛岃繖涓や釜宸ュ巶閮界敱Spring瀹瑰櫒鍏呭綋銆係pring AOP涓嶄粎鍏佽浣跨敤XML鏂囦歡閰嶇疆鐩爣鏂規(guī)硶錛孭roxyHandler涔熷厑璁鎬嬌鐢ㄤ緷璧栨敞鍏ョ鐞嗭紝Spring AOP鎻愪緵浜嗘洿澶氱伒媧葷殑閫夋嫨銆?br /> 鍦ㄤ笅闈pring AOP鐨勭ず渚嬩腑錛孖nvocationHandler閲囩敤鍔ㄦ侀厤緗紝闇瑕佸鍔犵殑鏂規(guī)硶涔熼噰鐢ㄥ姩鎬侀厤緗紝涓涓洰鏍囧璞″彲浠ユ湁澶氫釜鎷︽埅鍣紙綾諱技浜庝唬鐞嗘ā寮忎腑鐨勪唬鐞嗗鐞嗗櫒錛夈?br /> 涓嬮潰鏄師濮嬬殑鐩爣瀵硅薄錛?br /> //鐩爣瀵硅薄鐨勬帴鍙?br /> public interface Person
{
//璇ユ帴鍙e0鏄庝簡涓や釜鏂規(guī)硶
void info();
void run();
}
涓嬮潰鏄師濮嬬洰鏍囧璞$殑瀹炵幇綾伙紝瀹炵幇綾葷殑浠g爜濡備笅錛?br /> //鐩爣瀵硅薄鐨勫疄鐜扮被錛屽疄鐜扮被瀹炵幇Person鎺ュ彛
public class PersonImpl implements Person
{
//涓や釜鎴愬憳灞炴?br /> private String name;
private int age;
//name灞炴х殑 setter鏂規(guī)硶
public void setName(String name)
{
this.name = name;
}
//age灞炴х殑setter鏂規(guī)硶
public void setAge(int age)
{
this.age = age;
}
//info鏂規(guī)硶錛岃鏂規(guī)硶浠呬粎鍦ㄦ帶鍒跺彴鎵撳嵃涓琛屽瓧絎︿覆
public void info()
{
System.out.println("鎴戠殑鍚嶅瓧鏄? " + name + " , 浠婂勾騫撮緞涓? " + age);
}
//run鏂規(guī)硶錛岃鏂規(guī)硶涔熷湪鎺у埗鍙版墦鍗頒竴琛屽瓧絎︿覆銆?br /> public void run()
{
if (age < 45)
{
System.out.println("鎴戣繕騫磋交錛屽璺戣繀閫?..");
}
else
{
System.out.println("鎴戝勾鑰佷綋寮憋紝鍙兘鎱㈣窇...");
}
}
}
璇erson瀹炰緥灝嗙敱Spring瀹瑰櫒璐熻矗浜х敓鍜岀鐞嗭紝name灞炴у拰age灞炴т篃閲囩敤渚濊禆娉ㄥ叆綆$悊銆?br /> 涓轟簡鍏呭垎灞曠ずSpring AOP鐨勫姛鑳斤紝姝ゅ涓篜erson瀵硅薄鍒涘緩涓変釜鎷︽埅鍣ㄣ傜涓涓嫤鎴櫒鏄皟鐢ㄦ柟娉曞墠鐨勬嫤鎴櫒錛屼唬鐮佸涓嬶細(xì)
//璋冪敤鐩爣鏂規(guī)硶鍓嶇殑鎷︽埅鍣紝鎷︽埅鍣ㄥ疄鐜癕ethodBeforeAdvice鎺ュ彛
public class MyBeforeAdvice implements MethodBeforeAdvice
{
//瀹炵幇MethodBeforeAdvice鎺ュ彛錛屽繀欏誨疄鐜癰efore鏂規(guī)硶錛岃鏂規(guī)硶灝嗗湪鐩爣
//鏂規(guī)硶璋冪敤涔嬪墠錛岃嚜鍔ㄨ璋冪敤銆?br /> public void before(Method m, Object[] args, Object target) throws Throwable
{
System.out.println("鏂規(guī)硶璋冪敤涔嬪墠...");
System.out.println("涓嬮潰鏄柟娉曡皟鐢ㄧ殑淇℃伅錛?);
System.out.println("鎵鎵ц鐨勬柟娉曟槸:" + m);
System.out.println("璋冪敤鏂規(guī)硶鐨勫弬鏁版槸錛? + args);
System.out.println("鐩爣瀵硅薄鏄細(xì)" + target);
}
}
絎簩涓嫤鎴櫒鏄柟娉曡皟鐢ㄥ悗鐨勬嫤鎴櫒錛岃鎷︽埅鍣ㄥ皢鍦ㄦ柟娉曡皟鐢ㄧ粨鏉熷悗鑷姩琚皟鐢紝鎷︽埅鍣ㄤ唬鐮佸涓嬶細(xì)
//璋冪敤鐩爣鏂規(guī)硶鍚庣殑鎷︽埅鍣紝璇ユ嫤鎴櫒瀹炵幇AfterReturningAdvice鎺ュ彛
public class MyAfterAdvice implements AfterReturningAdvice
{
//瀹炵幇AfterReturningAdvice鎺ュ彛蹇呴』瀹炵幇afterReturning鏂規(guī)硶錛岃鏂規(guī)硶灝嗗湪鐩爣鏂規(guī)硶
//璋冪敤緇撴潫鍚庯紝鑷姩琚皟鐢ㄣ?br /> public void afterReturning(Object returnValue, Method m, Object[] args, Object target)throws Throwable
{
System.out.println("鏂規(guī)硶璋冪敤緇撴潫...");
System.out.println("鐩爣鏂規(guī)硶鐨勮繑鍥炲兼槸 : " + returnValue);
System.out.println("鐩爣鏂規(guī)硶鏄?: " + m);
System.out.println("鐩爣鏂規(guī)硶鐨勫弬鏁版槸 : " + args);
System.out.println("鐩爣瀵硅薄鏄?: " + target);
}
}
絎笁涓嫤鎴櫒鏄槸Around鎷︽埅鍣紝璇ユ嫤鎴櫒鏃㈠彲浠ュ湪鐩爣鏂規(guī)硶涔嬪墠璋冪敤錛屼篃鍙互鍦ㄧ洰鏍囨柟娉曡皟鐢ㄤ箣鍚庤璋冪敤銆備笅闈㈡槸Around鎷︽埅鍣ㄧ殑浠g爜錛?br /> //Around鎷︽埅鍣ㄥ疄鐜癕ethodInterceptor鎺ュ彛
public class MyAroundInterceptor implements MethodInterceptor
{
//瀹炵幇MethodInterceptor鎺ュ彛蹇呴』瀹炵幇invoke鏂規(guī)硶
public Object invoke(MethodInvocation invocation) throws Throwable
{
//璋冪敤鐩爣鏂規(guī)硶涔嬪墠鎵ц鐨勫姩浣?br /> System.out.println("璋冪敤鏂規(guī)硶涔嬪墠: invocation瀵硅薄錛歔" + invocation + "]");
//璋冪敤鐩爣鏂規(guī)硶
Object rval = invocation.proceed();
//璋冪敤鐩爣鏂規(guī)硶涔嬪悗鎵ц鐨勫姩浣?br /> System.out.println("璋冪敤緇撴潫...");
return rval;
}
}
鍒╃敤Spring AOP妗嗘灦錛屽疄鐜頒箣鍓嶇殑浠g悊妯″紡鐩稿綋綆鍗曘傚彧闇瑕佸疄鐜板搴旂殑鎷︽埅鍣ㄥ嵆鍙紝鏃犻渶鍒涘緩鑷繁鐨勪唬鐞嗗伐鍘傦紝鍙渶閲囩敤Spring瀹瑰櫒浣滀負(fù)浠g悊宸ュ巶銆備笅闈㈠湪Spring閰嶇疆鏂囦歡涓厤緗洰鏍嘼ean錛屼互鍙婃嫤鎴櫒銆?br /> 涓嬮潰鏄疭pring閰嶇疆鏂囦歡鐨勪唬鐮侊細(xì)
<?xml version="1.0" encoding="gb2312"?>
<!-- Spring閰嶇疆鏂囦歡鐨勬枃浠跺ご-->
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- Spring閰嶇疆鏂囦歡鐨勬牴鍏冪礌-->
<beans>
<!-- 閰嶇疆鐩爣瀵硅薄-->
<bean id="personTarget" class="lee.PersonImpl">
<!-- 涓虹洰鏍囧璞℃敞鍏ame灞炴у?->
<property name="name">
<value>Wawa</value>
</property>
<!-- 涓虹洰鏍囧璞℃敞鍏ge灞炴у?->
<property name="age">
<value>51</value>
</property>
</bean>
<!-- 絎竴涓嫤鎴櫒-->
<bean id="myAdvice" class="lee.MyBeforeAdvice"/>
<!-- 絎簩涓嫤鎴櫒-->
<bean id="myAroundInterceptor" class="lee.MyAroundInterceptor"/>
<!-- 灝嗘嫤鎴櫒鍖呰鎴怉dvisor錛岃瀵硅薄榪樼‘瀹氫唬鐞嗗鎬庢牱鐨勬柟娉曞鍔犲鐞?->
<bean id="runAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<!-- advice灞炴х‘瀹氬鐞哹ean-->
<property name="advice">
<!-- 姝ゅ鐨勫鐞哹ean瀹氫箟閲囩敤宓屽bean,涔熷彲寮曠敤瀹瑰櫒鐨勫彟涓涓猙ean-->
<bean class="lee.MyAfterAdvice"/>
</property>
<!-- patterns紜畾姝e垯琛ㄨ揪寮忔ā寮?->
<property name="patterns">
<list>
<!-- 紜畾姝e垯琛ㄨ揪寮忓垪琛?->
<value>.*run.*</value>
</list>
</property>
</bean>
<!-- 浣跨敤ProxyFactoryBean 浜х敓浠g悊瀵硅薄-->
<bean id="person" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 浠g悊瀵硅薄鎵瀹炵幇鐨勬帴鍙?->
<property name="proxyInterfaces">
<value>lee.Person</value>
</property>
<!-- 璁劇疆鐩爣瀵硅薄-->
<property name="target">
<ref local="personTarget"/>
</property>
<!-- 浠g悊瀵硅薄鎵浣跨敤鐨勬嫤鎴櫒-->
<property name="interceptorNames">
<list>
<value>runAdvisor</value>
<value>myAdvice</value>
<value>myAroundInterceptor</value>
</list>
</property>
</bean>
</beans>
璇ラ厤緗枃浠朵嬌鐢≒roxyFactoryBean鏉ョ敓鎴愪唬鐞嗗璞★紝閰嶇疆ProxyFactoryBean宸ュ巶bean鏃訛紝鎸囧畾浜唗arget灞炴э紝璇ュ睘鎬?鍊煎氨鏄洰鏍囧璞★紝璇ュ睘鎬у間負(fù)personTarget錛屾寚瀹氫唬鐞嗙殑鐩爣瀵硅薄涓簆ersonTarget銆傞氳繃interceptorNames灞炴х‘瀹氫唬 鐞嗛渶瑕佺殑鎷︽埅鍣紝鎷︽埅鍣ㄥ彲浠ユ槸鏅氱殑Advice錛屾櫘閫欰dvice灝嗗鐩爣瀵硅薄鐨勬墍鏈夋柟娉曡搗浣滅敤錛屾嫤鎴櫒涔熷彲浠ユ槸Advisor錛孉dvisor鏄?Advice鍜屽垏闈㈢殑緇勫悎錛岀敤浜庣‘瀹氱洰鏍囧璞$殑鍝簺鏂規(guī)硶闇瑕佸鍔犲鐞嗭紝浠ュ強鎬庢牱鐨勫鐞嗐傚湪涓婇潰鐨勯厤緗枃浠朵腑錛屼嬌鐢ㄤ簡涓変釜鎷︽埅鍣紝鍏朵腑myAdvice銆?myAroundInterceptor閮芥槸鏅欰dvice錛屽畠浠皢瀵圭洰鏍囧璞$殑鎵鏈夋柟娉曡搗浣滅敤銆傝宺unAdvisor鍒欎嬌鐢ㄤ簡姝e垯琛ㄨ揪寮忓垏闈紝鍖歸厤 run鏂規(guī)硶錛屽嵆璇ユ嫤鎴櫒鍙鐩爣瀵硅薄鐨剅un鏂規(guī)硶璧蜂綔鐢ㄣ?br />
涓嬮潰鏄祴璇曚唬鐞嗙殑涓葷▼搴忥細(xì)
public class BeanTest
{
public static void main(String[] args)throws Exception
{
//鍒涘緩Spring瀹瑰櫒
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
//鑾峰彇浠g悊瀵硅薄
Person p = (Person)ctx.getBean("person");
//鎵цinfo鏂規(guī)硶
p.info();
System.out.println("===========================================");
//鎵цrun鏂規(guī)硶
p.run();
}
}
涓嬮潰鏄▼搴忕殑鎵ц緇撴灉錛?br /> 鏂規(guī)硶璋冪敤涔嬪墠...
涓嬮潰鏄柟娉曡皟鐢ㄧ殑淇℃伅錛?br /> 鎵鎵ц鐨勬柟娉曟槸:public abstract void lee.Person.info()
璋冪敤鏂規(guī)硶鐨勫弬鏁版槸錛歯ull
鐩爣瀵硅薄鏄細(xì)lee.PersonImpl@b23210
璋冪敤鏂規(guī)硶涔嬪墠: invocation瀵硅薄錛歔invocation: method 'info', arguments
[]; target is of class [lee.PersonImpl]]
鎴戠殑鍚嶅瓧鏄? Wawa , 浠婂勾騫撮緞涓? 51
璋冪敤緇撴潫...
===========================================
鏂規(guī)硶璋冪敤涔嬪墠...
涓嬮潰鏄柟娉曡皟鐢ㄧ殑淇℃伅錛?br /> 鎵鎵ц鐨勬柟娉曟槸:public abstract void lee.Person.run()
璋冪敤鏂規(guī)硶鐨勫弬鏁版槸錛歯ull
鐩爣瀵硅薄鏄細(xì)lee.PersonImpl@b23210
璋冪敤鏂規(guī)硶涔嬪墠: invocation瀵硅薄錛歔invocation: method 'run', arguments [
]; target is of class [lee.PersonImpl]]
鎴戝勾鑰佷綋寮憋紝鍙兘鎱㈣窇...
璋冪敤緇撴潫...
鏂規(guī)硶璋冪敤緇撴潫...
鐩爣鏂規(guī)硶鐨勮繑鍥炲兼槸 : null
鐩爣鏂規(guī)硶鏄?: public abstract void lee.Person.run()
鐩爣鏂規(guī)硶鐨勫弬鏁版槸 : null
鐩爣瀵硅薄鏄?: lee.PersonImpl@b23210
紼嬪簭鐨勬墽琛岀粨鏋滀腑涓琛?#8220;=”鐢ㄤ簬鍖哄垎涓ゆ璋冪敤鐨勬柟娉曘傚湪璋冪敤info鏂規(guī)硶鏃訛紝鍙湁myAdvice鍜宮yAroundInterceptor涓や釜鎷︽埅鍣ㄨ搗浣滅敤錛岃皟鐢╮un鏂規(guī)硶鏃跺欙紝涓変釜鎷︽埅鍣ㄩ兘璧蜂綔鐢ㄤ簡銆?br />
閫氳繃涓婇潰鐨勪粙緇嶏紝鍙湅鍑篠pring鐨凙OP妗嗘灦鏄浠g悊妯″紡綆鍖栵紝騫舵嫇灞曚簡浠g悊妯″紡鐨勪嬌鐢ㄣ?br /> Spring AOP鏄疭pring澹版槑寮忎簨鍔$殑鍩虹銆備簡瑙pring AOP瀵規(guī)繁鍏ョ悊瑙pring鐨勫0鏄庡紡浜嬪姟綆$悊鏄潪甯告湁濂藉鐨勩係pring AOP榪樺彲浠ュ畬鎴愬緢澶氬姛鑳斤紝渚嬪鍩轟簬AOP鐨勬潈闄愭鏌ャ?/p>