锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成人网在线播放,亚洲精品色播一区二区,亚洲国产精品成人综合久久久 http://www.tkk7.com/zyl/category/17748.html濂藉ソ瀛︿範錛屽ぉ澶╁悜涓?/description>zh-cnTue, 27 Feb 2007 19:46:51 GMTTue, 27 Feb 2007 19:46:51 GMT60鐢ˋOP瀹炵幇瑙傚療鑰呮ā寮?/title><link>http://www.tkk7.com/zyl/archive/2006/11/17/81790.html</link><dc:creator>甯冭。閮?/dc:creator><author>甯冭。閮?/author><pubDate>Fri, 17 Nov 2006 08:55:00 GMT</pubDate><guid>http://www.tkk7.com/zyl/archive/2006/11/17/81790.html</guid><wfw:comment>http://www.tkk7.com/zyl/comments/81790.html</wfw:comment><comments>http://www.tkk7.com/zyl/archive/2006/11/17/81790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zyl/comments/commentRss/81790.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zyl/services/trackbacks/81790.html</trackback:ping><description><![CDATA[ <div style="line-height: 30px;"> <b> 瑙傚療鑰?Observer)妯″紡</b> <br />聽聽聽 鐢ㄩ旓細瀹氫箟瀵硅薄涔嬮棿鐨勪竴瀵瑰渚濊禆鍏崇郴錛屽洜姝わ紝褰撲竴涓璞$殑鐘舵佸彂鐢熸敼鍙樻椂錛屽叾鎵鏈変緷璧栭」閮戒細寰楀埌閫氱煡錛屽茍鑷姩鏇存柊銆?br />聽聽聽 瀹冩槸 OO 璁捐妯″紡鐨勭殗鍚庛傝妯″紡琚漢浠箍娉涘簲鐢紙鐗瑰埆鏄湪 GUI 搴旂敤紼嬪簭涓級錛屽茍鏋勬垚浜?MVC 鏋舵瀯鐨勫叧閿儴鍒嗐傚畠澶勭悊澶嶆潅鐨勯棶棰橈紝鑰屽湪瑙e喅榪欑被闂鏂歸潰琛ㄧ幇寰楃浉瀵硅緝濂姐備絾鏄紝浠庡疄鐜伴渶瑕佺殑鍔姏鍜屼唬鐮佺悊瑙g殑瑙掑害鏉ヨ錛屽畠榪樻槸甯︽潵浜嗕竴浜涢毦浠ヨВ鍐崇殑闅鵑銆?br />聽聽聽 涓嶈凍錛氳瀵熻?Observer)妯″紡瑕佹眰鎮ㄥ厛渚靛叆緋葷粺涓幇鏈夌殑綾伙紝鐒跺悗鎵嶈兘鏀寔璇ユā寮?鈥斺?鑷沖皯鍦?Java 璇█涓槸榪欐牱銆?br />聽聽聽 鑰屾柟闈㈠彲浠ラ檷浣庡儚瑙傚療鑰?Observer)妯″紡榪欑渚靛叆鎬фā寮忕殑璐熸媴錛屼嬌寰楁ā寮忓弬涓庤呮洿鐏墊椿錛屽洜涓轟笉闇瑕佸寘鍚ā寮忎唬鐮併傝屼笖錛屾ā寮忔湰韜彲浠ュ彉鎴愭娊璞$殑鍩烘湰鏂歸潰錛屽厑璁稿紑鍙戜漢鍛橀氳繃瀵煎叆鍜屽簲鐢ㄥ畠鏉ュ疄鐜伴噸鐢紝涓嶅繀姣忔閮借閲嶆柊鑰冭檻妯″紡銆?br />聽聽聽 涓嬮潰閫氳繃涓涓緥瀛愭潵璇存槑錛?br />聽聽聽 鍋囪濡備笅鐨勬儏鍐碉細<br />聽聽聽 AccountManager 瀵硅薄鑳藉瑙傚療 Account錛岃繖鏍鳳紝鍦ㄥ笎鎴風姸鎬佹敼鍙樻椂錛屽畠浠彲浠ュ悜閿鍞漢鍛樺彂閫佷竴灝佺數瀛愰偖浠躲?br />聽聽聽 浠g爜濡備笅錛? <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><br /><br />public class Account {<br /><br />聽聽聽 private int state;<br />聽聽聽聽 private String name;<br /><br />聽聽聽 public String getName() {<br />聽聽聽聽聽聽聽 return name;<br />聽聽聽 }<br />聽聽聽 public Account(String name) {<br />聽聽聽聽聽聽聽 super();<br />聽聽聽聽聽聽聽 this.name = name;<br />聽聽聽 }<br />聽聽聽 public int getState() {<br />聽聽聽聽聽聽聽 return state;<br />聽聽聽 }<br /><br />聽聽聽 public void setState(int state) {<br />聽聽聽聽聽聽聽 this.state = state;<br />聽聽聽 }<br />聽聽聽聽 @Override<br />聽聽聽 public String toString() {<br />聽聽聽聽聽聽聽 return name;<br />聽聽聽 }<br />}<br /><br />public class AccountManager {<br /><br />聽聽聽 public void sendEmail(Account account) {<br />聽聽聽聽聽聽聽聽 System.out.println("send Email:" + account);<br />聽聽聽 }<br />}<br /><br /></div>鏉ョ湅涓涓媕ava浠g爜鏄浣曞疄鐜拌瀵熻呮ā寮忕殑<br /><br /><b>Java 璇█鐨勮瀵熻?/b><br />铏界劧瀹炵幇鐨勫樊寮傚緢鏄庢樉錛屼絾鍦ㄥ畠浠箣闂磋繕鏄湁涓浜涚浉浼間箣澶勩備笉璁哄浣曞疄鐜拌瀵熻咃紝浠g爜涓兘蹇呴』鍥炵瓟浠ヤ笅 4 涓棶棰橈細<br />聽聽 1. 鍝釜瀵硅薄鏄富浣擄紝鍝釜瀵硅薄鏄瀵熻咃紵<br />聽聽 2. 浠涔堟椂鍊欎富浣撳簲褰撳悜瀹冪殑瑙傚療鑰呭彂閫侀氱煡錛?br />聽聽 3. 褰撴帴鏀跺埌閫氱煡鏃訛紝瑙傚療鑰呭簲璇ュ仛浠涔堬紵<br />聽聽 4. 瑙傚療鍏崇郴搴斿綋鍦ㄤ粈涔堟椂鍊欏紑濮嬶紝浠涔堟椂鍊欑粓姝紵<br /><br /><b>瑙掕壊瀹氫箟</b><br />聽聽聽 棣栧厛浠庢爣璁板櫒鎺ュ彛鏉ュ垎閰嶈鑹插紑濮嬨侽bserver 鎺ュ彛鍙畾涔変簡涓涓柟娉曪細update()錛屽畠瀵瑰簲鐫 Subject 鍙戦侀氱煡鏃舵墽琛岀殑鎿嶄綔銆?Subject 鎵挎媴鐫鏇村鐨勮亴璐c傚畠鐨勬爣璁板櫒鎺ュ彛瀹氫箟浜嗕袱涓柟娉曪紝涓涓敤鏉ヨ窡韙瀵熻咃紝鍙︿竴涓敤鏉ラ氱煡浜嬩歡鐨勯偅浜涜瀵熻呫? <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><br /><br />public interface Observer {<br /><br />聽聽聽 public void update(Subject subject);<br />}<br /><br />public interface Subject {聽 聽<br />聽聽聽 public void addObserver(Observer o);<br />聽聽聽 public void removeObserver(Observer o);<br />聽聽聽 public void notifyObservers();<br />} 聽</div><br />涓鏃﹀畾涔変簡榪欎簺瑙掕壊錛屽氨鍙互鎶婂畠浠簲鐢ㄥ埌緋葷粺涓搴旂殑瑙掕壊涓娿?br /><br /><b>搴旂敤瑙傚療鑰呰鑹?/b><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><br /><br />public class AccountManager implements Observer {<br /><br />聽聽 public void update(Subject subject) {<br />聽聽聽聽聽聽聽 sendEmail((Account) subject);<br />聽聽聽 }<br />}<br /><br /></div><b>璺熻釜鍜岄氱煡瑙傚療鑰?/b><br />涓鏃﹁繖欏瑰伐浣滃畬鎴愶紝灝卞彲浠ヨ漿縐誨埌Subject銆傚湪榪欓噷錛岃瀵?Account榪涜淇敼錛? <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><br />聽 private Set observers = new HashSet(); 聽<br />聽 public void addObserver(Observer o) {<br />聽聽聽 observers.add(o);<br />聽 }<br />聽 public void removeObserver(Observer o) {<br />聽聽聽 observers.remove(o);<br />聽 }<br />聽 public void notifyObservers() {<br />聽聽聽 for (Observer o : observers) {<br />聽聽聽聽聽 o.update(this);<br />聽聽聽 }<br />聽 }</div><br /><b>瑙﹀彂浜嬩歡</b><br />聽聽聽 鐜板湪宸茬粡鎶婄被璋冩暣鍒板畠浠湪妯″紡涓殑瑙掕壊涓婁簡銆備絾鏄紝榪橀渶瑕佸洖榪囧ご鏉ワ紝鍦ㄥ搴旂殑浜嬩歡鍙戠敓鏃惰Е鍙戦氱煡銆?br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> 聽聽聽 Account<br />聽聽聽 public void setState(int state) {<br />聽聽聽聽聽聽聽 if (this.state != state) {<br />聽聽聽聽聽聽聽聽聽聽聽 this.state = state;<br />聽聽聽聽聽聽聽聽聽聽聽 notifyObservers();<br />聽聽聽聽聽聽聽 }<br />聽聽聽 }</div><br /><b>鍚姩瑙傚療鍏崇郴</b><br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> public class ObserverClient {<br /><br />聽聽聽 public static void main(String[] args) {<br />聽聽聽聽聽聽聽 AccountManager manager = new AccountManager();<br />聽聽聽聽聽聽聽 AccountManager manager2 = new AccountManager();<br />聽聽聽聽聽聽聽 Account account = new Account("Account1");<br />聽聽聽聽聽聽聽 account.addObserver(manager);<br />聽聽聽聽聽聽聽 account.addObserver(manager2);<br />聽聽聽聽聽聽聽 account.setState(1);<br />聽聽聽 }<br />}</div><br /><br /><b>AspectJ 瑙傚療鑰?/b><br /><br /><b>瀹氫箟鎶借薄綾繪潵瀹炵幇瑙傚療鑰?/b><br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> //閲囩敤java5鐨勬硾鍨嬫潵瀹氫箟瑙傚療瀵硅薄鍜屼富浣?br />public abstract class AbstractSubjectObserver<Sub, Obv> {<br /><br />聽聽聽聽聽聽 //涓嶅厑璁哥┖item<br />聽聽聽 protected static void iaxIfNull(Object item, String name) {<br />聽聽聽聽聽聽聽 if (null == item) {<br />聽聽聽聽聽聽聽聽聽聽聽 throw new IllegalArgumentException("null " + name);<br />聽聽聽聽聽聽聽 }<br />聽聽聽 }<br />聽聽聽聽聽聽 //鐢ㄤ簬淇濆瓨鎵鏈夌殑涓諱綋鍜岃瀵熻呬箣闂寸殑瀵硅薄鍏崇郴<br />聽聽聽 private final HashMap<Sub, ArrayList<Obv>> fObservers = new HashMap<Sub, ArrayList<Obv>>();<br /><br />聽聽聽 protected AbstractSubjectObserver() {<br /><br />聽聽聽 }<br /><br />聽聽聽 public synchronized void addObserver(Sub subject, Obv observer) {<br />聽聽聽聽聽聽聽 iaxIfNull(subject, "subject");<br />聽聽聽聽聽聽聽 iaxIfNull(observer, "observer");<br />聽聽聽聽聽聽聽 getObservers(subject).add(observer);<br />聽聽聽 }<br /><br />聽聽聽 public synchronized void removeObserver(<br />聽聽聽聽聽聽聽聽聽聽聽 Sub subject,<br />聽聽聽聽聽聽聽聽聽聽聽 Obv observer) {<br />聽聽聽聽聽聽聽 iaxIfNull(subject, "subject");<br />聽聽聽聽聽聽聽 iaxIfNull(observer, "observer");<br />聽聽聽聽聽聽聽 getObservers(subject).remove(observer);<br />聽聽聽 }<br /><br />聽聽聽 public synchronized ArrayList<Obv> getObservers(Sub subject) {<br />聽聽聽聽聽聽聽 iaxIfNull(subject, "subject");<br />聽聽聽聽聽聽聽 ArrayList<Observer> result = fObservers.get(subject);<br />聽聽聽聽聽聽聽 if (null == result) {<br />聽聽聽聽聽聽聽聽聽聽聽 result = new ArrayList<Observer>();<br />聽聽聽聽聽聽聽聽聽聽聽 fObservers.put(subject, result);<br />聽聽聽聽聽聽聽 }<br />聽聽聽聽聽聽聽 return result;<br />聽聽聽 }<br />聽聽聽 //涓諱綋鐘舵佹敼鍙橈紝鏇存柊鎵鏈夌殑瑙傚療鑰呭璞?br />聽聽聽 protected void subjectChanged(Sub subject) {<br />聽聽聽聽聽聽聽 iaxIfNull(subject, "subject");<br />聽聽聽聽聽聽聽 ArrayList<Observer> list = getObservers(subject);<br />聽聽聽聽聽聽聽 if (!list.isEmpty()) {<br />聽聽聽聽聽聽聽聽聽聽聽 updateObservers(subject, Collections.unmodifiableList(list));<br />聽聽聽聽聽聽聽 }<br />聽聽聽 }<br /><br />聽聽 //鏇存柊鎵鏈夎瀵熻呮搷浣滐紝璋冪敤鍏蜂綋鐨剈pdateObserver<br />聽聽聽 protected synchronized void updateObservers(<br />聽聽聽聽聽聽聽聽聽聽聽 Subject subject,<br />聽聽聽聽聽聽聽聽聽聽聽 List<Observer> observers) {<br />聽聽聽聽聽聽聽 iaxIfNull(subject, "subject");<br />聽聽聽聽聽聽聽 iaxIfNull(observers, "observers");<br />聽聽聽聽聽聽聽 for (Observer observer : observers) {<br />聽聽聽聽聽聽聽聽聽聽聽 updateObserver(subject, observer);<br />聽聽聽聽聽聽聽 }<br />聽聽聽 }<br />聽聽聽聽 //闇瑕佸瓙綾誨疄鐜幫紝鍏蜂綋鐨勬洿鏂版搷浣?br />聽聽聽 protected abstract void updateObserver(Subject subject, Observer observer);<br /><br />}</div><br /><br /><b>瀹氫箟鏂歸潰錛?/b><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> public abstract aspect SubjectObserver<Sub, Obv> extends<br />聽聽聽聽聽聽聽 AbstractSubjectObserver<Sub, Obv> {<br /><br />聽聽聽 //闇瑕佹í鍒囩殑浠g爜錛岃〃紺哄摢浜涢渶瑕佽Е鍙戣瀵熻呮ā寮?br />聽聽聽 protected abstract pointcut changing();<br /><br />聽聽聽 //鍦ㄧ姸鎬佹敼鍙樺悗錛岃Е鍙戞墍鏈夌殑瑙傚療鑰?br />聽聽聽 after(Sub subject) returning : target(subject) && changing() {<br />聽聽聽聽聽聽聽 subjectChanged(subject);<br />聽聽聽 }<br />}<br /></div><br />鏃犻渶鏀瑰姩鍘熸湁鐨勫疄鐜幫紝鐪嬩竴涓嬪鎴風濡備綍鍚姩瑙傚療鍏崇郴<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> public class ObserverClient {<br /><br />聽聽聽 public static void main(String[] args) {<br />聽聽聽聽聽聽聽 Account account=new Account("Account1");<br />聽聽聽聽聽聽聽 Client client=Client.aspectOf();<br />聽聽聽聽聽聽聽 client.addObserver(account,new AccountManager());<br />聽聽聽聽聽聽聽 client.addObserver(account,new AccountManager());<br />聽聽聽聽聽聽聽 account.setState(1);<br />聽聽聽 }<br />聽聽聽 static aspect Client extends SubjectObserver<Account, AccountManager> {<br /><br />聽聽聽聽聽聽聽 protected pointcut changing() : execution(void聽 Account.setState(int));<br /><br />聽聽聽聽聽聽聽 protected void updateObserver(Account account, AccountManager manager) {<br />聽聽聽聽聽聽聽聽聽聽聽 manager.sendEmail(account);<br />聽聽聽聽聽聽聽 }<br />聽聽聽 }<br />}</div><br /><br /><b>AspectJ 瑙傚療鑰呯殑鍒嗘瀽</b><br />聽聽 鏄撲簬鐞嗚В錛氫粠鍙備笌鑰呯殑瑙嗚鏉ョ湅錛孉OP 鐗堟湰鐨勮瀵熻呮洿綆鍗?br />聽聽 閲嶇敤:鍙互寰堝鏄撶殑瀹炵幇閲嶇敤<br /><br /><br /><br /></div> <img src ="http://www.tkk7.com/zyl/aggbug/81790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zyl/" target="_blank">甯冭。閮?/a> 2006-11-17 16:55 <a href="http://www.tkk7.com/zyl/archive/2006/11/17/81790.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍑犱釜鏈夌敤鐨勯潤鎬佹柟闈紝鐢ㄤ簬瀹℃煡浠g爜錛坅spectJ瀹炵幇錛?/title><link>http://www.tkk7.com/zyl/archive/2006/11/16/81587.html</link><dc:creator>甯冭。閮?/dc:creator><author>甯冭。閮?/author><pubDate>Thu, 16 Nov 2006 10:56:00 GMT</pubDate><guid>http://www.tkk7.com/zyl/archive/2006/11/16/81587.html</guid><wfw:comment>http://www.tkk7.com/zyl/comments/81587.html</wfw:comment><comments>http://www.tkk7.com/zyl/archive/2006/11/16/81587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zyl/comments/commentRss/81587.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zyl/services/trackbacks/81587.html</trackback:ping><description><![CDATA[鏀墮泦浜嗗嚑涓父鐢ㄧ殑鏂歸潰錛?br /><br />NoCallsIntoTestFromOutside 聽聽 聽紱佹浠庝駭鍝佸寘鍒版祴璇曞寘鐨勫紩鐢?br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">public abstract aspect NoCallsIntoTestFromOutside {<br />聽聽 聽//寮曠敤甯︽湁test鐨勫寘鐨勬墍鏈夊彲鑳芥搷浣?br />聽聽 聽pointcut referToTestPackage():<br />聽聽 聽聽聽聽 call(* *..test..*.*(..)) || call(*..test..*.new(..))<br />聽聽 聽聽聽聽 || get(* *..test..*.*) || set(* *..test..*.*)<br />聽聽 聽聽聽聽 || get(*..test..* *) || set(*..test..* *)<br />聽聽 聽聽聽聽 || (staticinitialization(!*..test..*)<br />聽聽 聽聽聽聽聽聽聽 && staticinitialization(*..test..*+))<br />聽聽 聽聽聽聽 || call(* *(*..test..*, ..))<br />聽聽 聽聽聽聽 || call(* *(*, *..test..*, ..))<br />聽聽 聽聽聽聽 || call(* *(*, *, *..test..*))<br />聽聽 聽聽聽聽 || call(* *(.., *..test..*))<br />聽聽 聽聽聽聽 || execution(* *(*..test..*, ..))<br />聽聽 聽聽聽聽 || execution(* *(*, *..test..*, ..))<br />聽聽 聽聽聽聽 || execution(* *(*, *, *..test..*, ..))<br />聽聽 聽聽聽聽 || execution(* *(.., *..test..*))<br />聽聽 聽聽聽聽 ;<br />聽聽 聽// getcode scary-tests END<br /><br />聽聽 聽abstract protected pointcut withinTypes();<br /><br />聽聽 聽pointcut fromWithinNonTest(): within(!*..test..*);<br /><br />聽聽 聽declare error: withinTypes() && referToTestPackage() <br />聽聽 聽聽聽 聽&& fromWithinNonTest(): "production code referring to test code";聽聽 聽<br />} </div><br />UtilityClassEnforced 聽聽聽 紱佹鏋勯犲疄鐢ㄥ伐鍏風被<br /><br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">public aspect UtilityClassEnforced {<br />聽聽 聽<br />聽聽聽 declare error : <br />聽聽聽 聽聽聽 //瀹氫箟闈瀙rivate 鐨勬瀯閫犲櫒<br />聽聽聽 聽聽聽 execution(!private (@UtilityClass *).new(..))<br />聽聽聽 聽聽聽 //璋冪敤new 鍒濆鍖栨柟娉?br />聽聽聽 聽聽聽 || call((@UtilityClass *).new(..))<br />聽聽聽 聽聽聽 //鎵ц宸ュ叿綾葷殑浠諱綍鏂規硶<br />聽聽聽 聽聽聽 || execution((@UtilityClass *) *(..))聽聽聽 聽聽聽 <br />聽聽聽 聽聽聽 : "no instances of utility classes";<br /><br />}<br /><br />@Retention(RetentionPolicy.RUNTIME)<br />@Target({ElementType.TYPE}) <br />public @interface UtilityClass {<br /><br />} <br /></div><br />NoSystemOut 聽聽聽 紱佹浣跨敤 System.err 鎴?System.out<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">public abstract aspect NoSystemOut {<br />聽聽聽 abstract protected pointcut withinTypes錛?br />聽聽聽 //璇誨彇System.out瀵硅薄<br />聽聽聽 declare error: withinTypes() && get(PrintStream System.out) : "no System.out";<br />聽聽聽聽 //璇誨彇System.err瀵硅薄<br />聽聽聽 declare error: withinTypes() && get(PrintStream System.err) : "no System.err";<br />聽聽聽 //璇誨彇FileDescriptor.err<br />聽聽聽 declare error: withinTypes() && get(PrintStream FileDescriptor.err) : "no FileDescriptor.err";<br />聽聽聽 //璇誨彇FileDescriptor.out<br />聽聽聽 declare error: withinTypes() && get(PrintStream FileDescriptor.out) : "no FileDescriptor.out";<br />聽聽聽聽 //鎵цThrowable.printStackTrace()鏂規硶<br />聽聽聽 declare error: withinTypes() && call(void Throwable.printStackTrace()) : "no System.err";<br />}</div><br />GetterSetter 聽聽 聽紱佹鍦ㄩ櫎鍒濆鍖栨垨 getter 鏂規硶浠ュ榪涜瀛楁璇誨彇鎿嶄綔錛岀姝㈠湪鍒濆鍖栨垨 setter 鏂規硶浠ュ榪涜瀛楁鍐欐搷浣?br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">public abstract aspect GetterSetter {<br />聽聽 聽<br />聽聽 聽abstract protected pointcut withinTypes();<br />聽聽 聽//鎵鏈夌殑sets 闈瀙ublic fields<br />聽聽 聽pointcut sets() : set(!public * *);<br />聽聽聽聽聽聽 //鎵鏈夌殑gets 闈瀙ublic fields<br />聽聽 聽pointcut gets() : get(!public * *);<br />聽聽 聽declare error : withinTypes() && gets() && <br />聽聽 聽聽聽 聽//鍦╣et*鏂規硶鎴栬呮瀯閫犲櫒浠ュ鍦版柟浣跨敤<br />聽聽 聽聽聽 聽!(withincode(!void get*()) || withincode(new(..)))<br />聽聽 聽聽聽 聽: "non-public field-get outside constructor or getter method";<br />聽聽 聽declare error : withinTypes() && sets() && <br />聽聽 聽聽聽 聽!(withincode(void set*(*)) || withincode(new(..)))<br />聽聽 聽聽聽 聽: "non-public field-set outside constructor or setter method";<br />}</div><br />NoNullParameters 聽聽 聽聽聽聽聽聽 鍦ㄥ叕鍏辨柟娉曚紶閫掔┖鍙傛暟鏃舵姏鍑哄紓甯?br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">public abstract aspect NoNullParameters {<br />聽聽 聽abstract protected pointcut withinTypes();<br />聽聽 聽<br />聽聽 聽pointcut publicParameters() : <br />聽聽 聽聽聽 聽 //鎵цpublic 鏋勯犲櫒鎴栬卲ublic 鏂規硶<br />聽聽 聽聽聽 聽(execution(public new(*,..)) || execution(public * *(*,..)))<br />聽聽 聽聽聽 聽 //闄や簡鎵ц闈濷bject鐨勫弬鏁?濡傚師綾誨瀷錛宨nt,long<br />聽聽 聽聽聽 聽&& !(execution(* *(!Object+)) || execution(*.new(!Object+)));<br />聽聽 聽//濡傛灉鍙傛暟涓簄ull,鍒欐姏鍑轟緥澶柭犅?聽聽聽 聽聽聽 聽<br />聽聽 聽before() : withinTypes() && publicParameters() {<br />聽聽 聽聽聽 聽Object[] args = thisJoinPoint.getArgs();<br />聽聽 聽聽聽 聽for (int i = 0; i < args.length; i++) {<br />聽聽 聽聽聽 聽聽聽 聽if (null == args[i]) {<br />聽聽 聽聽聽 聽聽聽 聽聽聽 聽JoinPoint.StaticPart sp = thisJoinPointStaticPart;<br />聽聽 聽聽聽 聽聽聽 聽聽聽 聽String name = AJReflect.getParameterName(sp, i);<br />聽聽 聽聽聽 聽聽聽 聽聽聽 聽throw new IllegalArgumentException("null " + name);<br />聽聽 聽聽聽 聽聽聽 聽}<br />聽聽 聽聽聽 聽}<br />聽聽 聽}<br />}</div><img src ="http://www.tkk7.com/zyl/aggbug/81587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zyl/" target="_blank">甯冭。閮?/a> 2006-11-16 18:56 <a href="http://www.tkk7.com/zyl/archive/2006/11/16/81587.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>AspectJ 瀛︿範絎旇錛欰spect鐨勭敓鍛藉懆鏈?/title><link>http://www.tkk7.com/zyl/archive/2006/10/21/76573.html</link><dc:creator>甯冭。閮?/dc:creator><author>甯冭。閮?/author><pubDate>Sat, 21 Oct 2006 12:50:00 GMT</pubDate><guid>http://www.tkk7.com/zyl/archive/2006/10/21/76573.html</guid><wfw:comment>http://www.tkk7.com/zyl/comments/76573.html</wfw:comment><comments>http://www.tkk7.com/zyl/archive/2006/10/21/76573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zyl/comments/commentRss/76573.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zyl/services/trackbacks/76573.html</trackback:ping><description><![CDATA[聽聽 <span style="font-family: 瀹嬩綋;">榛樿鐨勬儏鍐典笅錛孉spect綾誨彧鏈変竴涓疄渚嬪瓨鍦ㄤ簬铏氭嫙鏈轟腑錛屼篃灝辨槸浣滀負鍗曚緥瀛樺湪鐨勶紝瀵逛簬姣忎釜瀵硅薄鏉ヨ錛屾柟闈㈡槸鍏變韓鐨勩備竴鑸繖鏍風殑鏂歸潰錛屼笉鑳界敤鏉ヤ繚瀛樼浉搴斿璞$殑鐘舵併?br />聽聽 瀵逛簬AspectJ 鏉ヨ錛孉spect鏂歸潰綾伙紝鍖呮嫭浠ヤ笅鐨勫疄渚嬪寲鏂瑰紡銆?br /></span><ul><li><span style="font-family: 瀹嬩綋;">姣忚櫄鎷熸満(榛樿錛夛紝鍙湁涓涓疄渚嬶紝鍏剁敓鍛藉懆鏈熶粠铏氭嫙鏈哄惎鍔ㄥ紑濮嬶紝涓鐩村埌铏氭嫙鏈哄仠姝€?/span></li><li><span style="font-family: 瀹嬩綋;">姣忓璞★紝瀵逛簬姣忎竴涓璞¢兘鏈変竴涓柟闈㈠疄渚嬶紝鍏剁敓鍛藉懆鏈熻窡闅忕浉鍏寵仈鐨勫璞°?/span></li><li><span style="font-family: 瀹嬩綋;">姣忔帶鍒舵祦錛屽浜庢瘡涓猚ontrolFlow鐐癸紝閮戒細鍒涘緩鐩稿簲鐨勬柟闈㈠疄渚嬶紝鍙互鍙傝冧簨鍔$鐞嗭紙瀵逛簬浜嬪姟錛屾瘡涓師瀛愭搷浣滐紝閮芥槸涓涓帶鍒舵祦錛屾柟闈㈢殑鐢熷懡鍛ㄦ湡錛屼粠鎺у埗嫻佸紑濮嬶紝涓鐩村埌鎺у埗嫻佺粨鏉燂級銆?/span></li></ul><h4 style="margin-left: 1cm; text-indent: -1cm;"><!--[if !supportLists]--><span style="line-height: 156%; font-family: Courier;" lang="EN-US"><span style="">1)<span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">聽聽 </span></span></span><!--[endif]--><span style="font-size: 12pt; line-height: 156%; font-family: 瀹嬩綋;">姣忚櫄鎷熸満</span><span style="font-family: 瀹嬩綋;">鍏寵仈</span><span style="line-height: 156%; font-family: Courier;" lang="EN-US"><o:p></o:p></span></h4><p class="MsoNormal"><span style="font-family: 瀹嬩綋;">榛樿鏂歸潰錛屽畠鐨勭姸鎬佹槸鍏變韓鐨勩?/span></p><h4 style="margin-left: 1cm; text-indent: -1cm;"><!--[if !supportLists]--><span style="font-size: 12pt; line-height: 156%; font-family: 瀹嬩綋;" lang="EN-US"><span style="">2)<span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"></span></span></span><!--[endif]--><span style="font-size: 12pt; line-height: 156%; font-family: 瀹嬩綋;">姣忓璞?/span><span style="font-family: 瀹嬩綋;">鍏寵仈</span></h4><span style="font-size: 10.5pt; font-family: 瀹嬩綋;">閫氬父錛岄噸鐢ㄥ熀紜鏂歸潰闇瑕佷繚鎸佹瘡涓璞$殑鐘舵侊紝涔熷氨鏄璞$殑鏁版嵁銆傚浜庢瘡涓璞¢兘浼氬垱寤轟竴涓柟闈㈠疄渚嬨?/span><span style="font-family: 瀹嬩綋;"><br /><br />瀵逛簬姣忓璞″叧鑱斿彲浠ユ寚瀹氫袱縐嶇被鍨嬶細</span><br /><p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">perthis()-涓庡綋鍓嶆墍鍖歸厤鐨勮繛鎺ョ偣鐨勬墽琛屽璞★紝鎵鍏寵仈</span></p><p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">pertarget()</span><span style="font-family: 瀹嬩綋;">鈥斾笌褰撳墠鎵鍖歸厤鐨勮繛鎺ョ偣鐨勭洰鏍囨墽琛屽璞★紝鎵鍏寵仈</span><span style="font-family: 瀹嬩綋;"></span></p><h4 style="margin-left: 1cm; text-indent: -1cm;"><!--[if !supportLists]--><span style="font-size: 12pt; line-height: 156%; font-family: 瀹嬩綋;" lang="EN-US"><span style="">3)<span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"></span></span></span><!--[endif]--><span style="font-size: 12pt; line-height: 156%; font-family: 瀹嬩綋;">姣?span lang="EN-US"></span>鎺у埗嫻佸叧鑱?/span></h4><p class="MsoNormal"><span style="font-family: 瀹嬩綋;">鍙互鎸囧畾涓ょ綾誨瀷鐨勬瘡鎺у埗嫻佸璞″叧鑱旓細</span></p><p class="MsoNormal"></p><p class="MsoNormal"><span lang="EN-US">percflow()顱-</span><span style="font-family: 瀹嬩綋;">瀵逛簬鍦?/span><span lang="EN-US">percflow()</span><span style="font-family: 瀹嬩綋;">鎸囧畾鐨?/span><span lang="EN-US">pointcut</span><span style="font-family: 瀹嬩綋;">鎵鍖歸厤鐨勮繛鎺ョ偣錛屽叧鑱旀瘡涓涓嫭绔嬬殑鏂歸潰瀹炰緥鍜屾帶鍒舵祦鎵ц銆?/span></p><p class="MsoNormal"><span lang="EN-US">percflowbelow()</span><span style="font-family: 瀹嬩綋;">錛屽浜庡湪</span><span lang="EN-US">prcflowbelow ()</span><span style="font-family: 瀹嬩綋;">鎸囧畾鐨?/span><span lang="EN-US">pointcut</span><span style="font-family: 瀹嬩綋;">鎵鍖歸厤鐨勮繛鎺ョ偣錛屽叧鑱旀瘡涓涓嫭绔嬬殑鏂歸潰瀹炰緥鍜屾帶鍒舵祦涓嬬殑鎵ц銆?/span></p><p class="MsoNormal"><br /><span style="font-family: 瀹嬩綋;"></span></p><p class="MsoNormal"><span style="font-family: 瀹嬩綋;">涓嬮潰鏉ョ湅涓涓疄渚嬶細鏉ュ尯鍒笉鍚岀偣錛?/span></p><p class="MsoNormal"><span style="font-family: 瀹嬩綋;">澹版槑蹇呰鐨勬祴璇曠被<br /></span></p><table border="0" cellpadding="0" cellspacing="0" height="172" width="741"><tbody><tr valign="top"><td width="10"><br /></td><td width="100%"><br /><table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" height="383" width="676"><tbody><tr><td>public class TestBean {<br /><br />聽聽聽 private String name;<br /><br />聽聽聽 public TestBean(String name) {<br />聽聽聽聽聽聽聽 this.name = name;<br />聽聽聽 }<br /><br />聽聽聽 public void method1() {<br />聽聽聽 }<br /><br />聽聽聽 public void method2() {<br />聽聽聽 }<br /><br />聽聽聽 @Override<br />聽聽聽 public String toString() {<br />聽聽聽聽聽聽聽 return name;<br />聽聽聽 }<br /><br />}<br /><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: "Courier New"; color: black;" lang="EN-US"></span><span style="font-size: 10pt; font-family: "Courier New";" lang="EN-US"><o:p>嫻嬭瘯綾伙細</o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: "Courier New";" lang="EN-US"><o:p>public class LogAspectTest {<br /><br />聽聽聽 @Test<br />聽聽聽 public void testAssociation() {<br />聽聽聽聽聽聽聽 TestBean bean1 = new TestBean("bean1");<br />聽聽聽聽聽聽聽 TestBean bean2 = new TestBean("bean2");<br />聽聽聽聽聽聽聽 bean1.method1();<br />聽聽聽聽聽聽聽 bean1.method2();<br />聽聽聽聽聽聽聽 bean2.method1();<br />聽聽聽聽聽聽聽 bean2.method2();<br />聽聽聽 }<br />}</o:p></span></p><p class="MsoNormal" style="text-align: left;" align="left"><br /><span style="font-size: 10pt; font-family: "Courier New";" lang="EN-US"><o:p></o:p></span></p>鏂歸潰綾伙細<br />public aspect LogAspect {<br /><br />聽聽聽 private static Log log = LogFactory.getLog(LogAspect.class);<br /><br />聽聽聽 public LogAspect() {<br />聽聽聽聽聽聽聽 log.info("create LogAspect instance");<br />聽聽聽 }<br /><br />聽聽聽 pointcut logMethod(TestBean bean)<br />聽聽聽聽聽聽聽 :execution(* TestBean.method*(..))&&this(bean)&&!within(LogAspect+);<br /><br />聽聽聽 before(TestBean bean):logMethod( bean){<br />聽聽聽聽聽聽聽 log.info("JoinPoint: "<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + thisJoinPointStaticPart<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + "\n\taspect: "<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + this<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + "\n\tobject: "<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + bean);<br /><br />聽聽聽 }<br />}<br /></td></tr></tbody></table></td></tr></tbody></table><br />榛樿鐨勮緭鍑轟負錛?br />2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - create LogAspect instance<br />2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@15601ea<br />聽聽聽 object: bean1<br />2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@15601ea<br />聽聽聽 object: bean1<br />2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@15601ea<br />聽聽聽 object: bean2<br />2006-10-21 20:42:02,275 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@15601ea<br />聽聽聽 object: bean2<br /><p class="MsoNormal">鍙互鐪嬪埌鍙槸瀹炰緥鍖栦簡涓嬈?/p><br />鐜板湪鏇存敼鐩稿簲鐨刟spect錛?br /><br />public aspect LogAspect <font color="#ff3300">perthis(logMethod(TestBean))</font>{<br /><br /> 聽聽聽 ....<br /><br /> 聽聽聽 }<br /> }<br /><p class="MsoNormal"><span style="font-family: 瀹嬩綋;">鍙槸澧炲姞浜?/span><font color="#ff3300">perthis(logMethod(TestBean))</font></p><p class="MsoNormal">杈撳嚭鏃訛紝鍙互鐪嬪埌鍒涘緩浜嗕袱涓疄渚?br /></p><p class="MsoNormal"><font color="#ff3300"><font color="#000000"><font color="#ff0000">2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - create LogAspect instance</font><br />2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@197d257<br />聽聽聽 object: bean1<br />2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@197d257<br />聽聽聽 object: bean1<br /><font color="#ff0000">2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - create LogAspect instance</font><br />2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@7259da<br />聽聽聽 object: bean2<br />2006-10-21 20:45:21,306 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@7259da<br />聽聽聽 object: bean2</font></font></p><p class="MsoNormal">緇х畫鏇存敼aspect錛屾妸perthis鏀逛負percflow</p><p class="MsoNormal">杈撳嚭鏀逛負錛?br /></p><p class="MsoNormal">2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance<br />2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@eee36c<br />聽聽聽 object: bean1<br />2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance<br />2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@194df86<br />聽聽聽 object: bean1<br />2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance<br />2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method1())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@defa1a<br />聽聽聽 object: bean2<br />2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - create LogAspect instance<br />2006-10-21 20:46:58,009 [demo.chap4.log.LogAspect] - JoinPoint: execution(void demo.chap4.log.TestBean.method2())<br />聽聽聽 aspect: demo.chap4.log.LogAspect@f5da06<br />聽聽聽 object: bean2</p><br />姣忎釜鏂規硶閮藉垱寤虹浉搴旂殑瀹炰緥銆?br /><br /><br /><img src ="http://www.tkk7.com/zyl/aggbug/76573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zyl/" target="_blank">甯冭。閮?/a> 2006-10-21 20:50 <a href="http://www.tkk7.com/zyl/archive/2006/10/21/76573.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍏充簬AspectJ 涓殑pointcut 璇硶http://www.tkk7.com/zyl/archive/2006/10/17/75732.html甯冭。閮?/dc:creator>甯冭。閮?/author>Tue, 17 Oct 2006 12:00:00 GMThttp://www.tkk7.com/zyl/archive/2006/10/17/75732.htmlhttp://www.tkk7.com/zyl/comments/75732.htmlhttp://www.tkk7.com/zyl/archive/2006/10/17/75732.html#Feedback1http://www.tkk7.com/zyl/comments/commentRss/75732.htmlhttp://www.tkk7.com/zyl/services/trackbacks/75732.html聽聽 鐪嬩簡寰堝AOP鐨勬枃绔犱簡錛孉OP榪欎袱騫村彂灞曠殑寰堟參錛屾病鏈変粈涔堟柊鎰忥紝鐜板湪鍒板閮芥槸SOA錛孲CA浜嗭紝涓嶈繃鐮旂┒浜嗕竴涓嬶紝瑙夊緱榪樻槸寰堟湁甯姪鐨勩傚挨鍏舵槸澧炲姞緋葷粺鐨勫綰︽у拰妯″潡鐨勭嫭绔嬫ф潵璇達紝寰堟湁甯姪銆?br />聽聽 褰撶劧錛屽涓滆タ錛屽熀紜寰堥噸瑕併備笅闈㈠氨璇磋AspectJ涓殑鍩烘湰璇硶錛屾湁鍏磋叮鐨勫彲浠ョ湅鐪婣spectJ in Action銆?br />聽聽 鍏堟潵璇磋pointcut錛屼粠瀛楅潰鐨勬剰鎬濊鐨勬槸鍒囬潰鐨勬剰鎬濄備篃灝辨槸妯垏鐨勬椂鍊欙紝浼氭湁鍝簺鎵ц鐐逛細琚瘑鍒傚彧鏈夊厛璇嗗埆浜嗭紝鎵嶈兘鎵ц鐩稿簲鐨凙dvice銆?br />聽聽 鍩烘湰鐨勫畾涔夊涓嬶細
聽聽
聽聽 public pointcut accountOperations:call(* Account.*(..))
聽聽
聽聽 1.閫氶厤絎﹀拰pointcut 鎿嶄綔絎?br />
  • 聽聽 *聽 琛ㄧず浠諱綍鏁伴噺鐨勫瓧絎︼紝闄や簡(.)
  • 聽聽聽 .. 琛ㄧず浠諱綍鏁伴噺鐨勫瓧絎﹀寘鎷換浣曟暟閲忕殑(.)
  • 聽聽聽聽聽聽 + 鎻忚堪鎸囧畾綾誨瀷鐨勪換浣曞瓙綾繪垨鑰呭瓙鎺ュ彛
聽聽聽 鍚?/span>java涓鏍鳳紝鎻愪緵浜嗕竴鍏冨拰浜屽厓鐨勬潯浠惰〃杈炬搷浣滅銆?br />聽聽聽 涓鍏冩搷浣滅錛?/span>!
聽聽聽聽聽
浜屽厓鎿嶄綔絎︼細||鍜?/span>&&
聽聽聽聽聽
浼樺厛鏉冨悓java

聽聽聽聽聽 2.
絳懼悕璇硶

綾誨瀷絳懼悕鏍峰紡

涓昏鐨勪緥瀛?
Account聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 綾誨瀷Account
聽聽聽
*Account聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽聽聽 浣跨敤Account鍚嶇О緇撴潫鐨勭被鍨嬶紝濡?/span>SavingsAccount鍜?/span>CheckingAccount
聽聽聽
java.*.Date聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 綾誨瀷Date鍦ㄤ換浣曠洿鎺ョ殑java瀛愬寘涓紝濡?/span>java.util.Date鍜?/span>java.sql.Date
聽 聽
java..*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 浠諱綍鍦?/span>java鍖呮垨鑰呮墍鏈夊瓙鍖呬腑鐨勭被鍨嬶紝濡?/span>java.awt鍜?/span>java.util鎴栬?/span>java.awt.event 鍜?/span>java.util.logging
聽聽聽
javax..*Model+聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 鎵鏈?/span>javax鍖呮垨鑰呭瓙鍖呬腑浠?/span>Model緇撳熬鐨勭被鍨嬪拰鍏舵墍鏈夊瓙綾伙紝濡?/span>TableModel,TreeModel銆?br />聽 錛?/span>vector 聽聽聽聽聽 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 鎵鏈夐櫎浜?/span>Vector鐨勭被鍨?br />聽 Vector|| Hashtable聽聽聽聽聽聽聽聽聽聽聽聽聽 Vector鎴栬?/span>Hashtable綾誨瀷
java.util.RandomAccess+聽聽聽 瀹炵幇RandomAccess鍜?/span>List鐨勬墍鏈夊瓙綾?/span>
聽聽 && java.util.List+
聽聽
聽聽
鏂規硶鍜屾瀯閫犲櫒絳懼悕妯″紡

聽 public void Collection.clear()錛?br />聽
鍦–ollection涓悓鏍風鍚嶇殑clear鏂規硶

聽 public void Account.debit(float) throws InsufficientBalanceException錛?br />聽 Account涓悓鏍風鍚嶇殑debit鏂規硶

聽 public void Account.set*(*)
Account涓互set寮澶達紝騫朵笖鍙湁涓涓弬鏁扮被鍨嬬殑鏂規硶

聽 public void Account.*()
Account涓墍鏈夌殑娌℃湁鍙傛暟鐨刾ublic void 鏂規硶

聽 public * Account.*()
聽 Account涓墍鏈夋病鏈夊弬鏁扮殑public 鏂規硶

聽 public * Account.*(..)
Account涓墍鏈夌殑public 鏂規硶

聽 * Account.*(..)
Account涓殑鎵鏈夋柟娉曪紝鍖呮嫭private鏂規硶

聽 !public * Account.*(..)
鎵鏈夌殑闈瀙ublic 鏂規硶

聽聽 * Account+.*(..)
聽聽
鎵鏈夌殑鏂規硶錛屽寘鎷瓙綾葷殑鏂規硶

聽聽 * java.io.Reader.read(..)
聽聽
鎵鏈夌殑read鏂規硶

聽聽 * java.io.Reader.read(char[],..)
聽聽
鎵鏈変互read(char[])寮濮嬬殑鏂規硶錛屽寘鎷瑀ead(char[])鍜宺ead(char[],int,int)

聽聽 * javax..*.add*Listener(EventListener+)
聽聽
鍛藉悕浠dd寮濮嬶紝浠istener緇撳熬鐨勬柟娉曪紝鍙傛暟涓負EventListener鎴栧瓙綾?br />
聽聽 * *.*(..) throws RemoteException
聽聽
鎶涘嚭RemoteException鐨勬墍鏈夋柟娉?/span>

聽聽 鏋勯犲櫒錛屽悓涓婇潰
聽聽 public Account.new()
聽聽
娌℃湁鍙傛暟鐨勬瀯閫犲櫒鏂規硶

聽聽聽 灞炴х鍚嶆ā寮?/b>
聽聽聽 鍚屾柟娉曚竴鏍鳳紝灞炴т篃鏌ヤ笉澶?br />聽聽聽 * Account.*聽聽
聽聽聽 鎵鏈夌殑Account灞炴?br />
聽聽聽 !public static * banking..*.*
聽聽聽 鎵鏈夌殑闈瀙ublic static 灞炴э紝鍦╞anking鐨勫寘鎴栬呭瓙鍖呬腑
聽聽聽
聽聽聽 3.涓昏鐨刾ointcuts綾誨瀷
聽聽
聽聽聽 鍒嗙被pointcuts
聽聽聽 閬靛驚鐗瑰畾鐨勮娉曠敤浜庢崟鑾鋒瘡涓涓綾葷殑鍙嬌鐢ㄨ繛鎺ョ偣銆?br />聽聽聽 涓昏鐨勭綾伙細
  • 鏂規硶鎵ц錛歟xecution(MethodSignature)
  • 鏂規硶璋冪敤錛歝all(MethodSignature)
  • 鏋勯犲櫒鎵ц錛歟xecution(ConstructorSignature)
  • 鏋勯犲櫒璋冪敤錛歝all(ConstructorSignature)
  • 綾誨垵濮嬪寲錛歴taticinitialization(TypeSignature)
  • 灞炴ц鎿嶄綔錛歡et(FieldSignature)
  • 灞炴у啓鎿嶄綔錛歴et(FieldSignature)
  • 渚嬪澶勭悊鎵ц錛歨andler(TypeSignature)
  • 瀵硅薄鍒濆鍖栵細initialization(ConstructorSignature)
  • 瀵硅薄棰勫厛鍒濆鍖栵細preinitialization(ConstructorSignature)
  • Advice鎵ц錛歛dviceexecution()
聽聽 鍩轟簬鎺у埗嫻佺殑pointcuts
聽聽 涓昏鍖呮嫭涓ょ綾誨瀷鐨勬帶鍒舵祦錛?br />聽聽 cflow(Pointcut)錛屾崟鑾鋒墍鏈夌殑榪炴帴鐐瑰湪鎸囧畾鐨勬柟娉曟墽琛屼腑錛屽寘鎷墽琛屾柟娉曟湰韜?br />聽聽 cflowbelow(Pointcut)錛屾崟鑾鋒墍鏈夌殑榪炴帴鐐瑰湪鎸囧畾鐨勬柟娉曟墽琛屼腑錛岄櫎浜嗘墽琛屾柟娉曟湰韜?br />
聽聽 濡備互涓嬬殑渚嬪瓙錛?br />聽聽 cflow(call(* Account.debit(..))
聽聽 鎵鏈夌殑debit鏂規硶涓殑榪炴帴鐐癸紝鍖呮嫭debit鏂規硶鏈韓
聽聽 cflowbelow(call(* Account.debit(..))
聽聽 鎵鏈塪ebit鏂規硶涓殑榪炴帴鐐癸紝闄や簡debit鏂規硶鏈韓
聽聽 cflow(transactedOperations())
聽聽 鎵鏈夌敱transactedOperations鎹曡幏鐨勮繛鎺ョ偣
聽聽 cflowbelow(execution(Account.new(..))
聽聽 鎵鏈夊湪Account 鏋勯犲櫒涓墽琛岀殑榪炴帴鐐?br />
聽聽 鍩轟簬璇嶆眹緇撴瀯鐨勮繛鎺ョ偣
聽聽 婧愪唬鐮佺墖鏂傦紝濡倃ithin()鍜寃ithincode()
聽聽 within 錛氭崟鑾峰湪鎸囧畾綾繪垨鑰呮柟闈腑鐨勭▼搴忎綋涓殑鎵鏈夎繛鎺ョ偣錛屽寘鎷唴閮ㄧ被銆?br />聽聽 Withincode錛氱敤浜庢崟鑾峰湪鏋勯犲櫒鎴栬呮柟娉曚腑鐨勬墍鏈夎繛鎺ョ偣錛屽寘鎷湪鍏朵腑鐨勬湰鍦扮被

聽聽 鎵ц瀵硅薄榪炴帴鐐?/b>
聽聽 鍖歸厤this,鍜宼arget瀵硅薄錛屼綔涓烘柟娉曡璋冪敤鐨勫璞°?br />聽聽 this(Account)錛屾墍鏈堿ccount鐨勫疄渚嬬殑鎵ц鐐癸紝鍖歸厤鎵鏈夌殑榪炴帴鐐癸紝濡傛柟娉曡皟鐢紝灞炴ц緗紝褰撳墠鐨勬墽琛屽璞′負Account錛屾垨鑰呭叾瀛愮被銆?br />聽聽 target(Account)錛氬尮閰嶆墍鏈夌殑榪炴帴鐐癸紝鐩爣瀵硅薄涓篈ccount鎴栧叾瀛愮被銆?br />
聽聽 蹇呴』鎵ц鐩稿簲鐨勭被鍨嬶紝涓嶈兘浣跨敤*,鎴栬?.閫氶厤絎︺傚綋鍓嶉潤鎬佹柟娉曪紝涓嶈兘琚尮閰嶃?br />
聽聽 鍦╳ithin()鍜宼his()涓殑鍖哄埆錛?br />聽聽 涓涓槸紼嬪簭浣擄紝鑰屽彟涓涓負瀵硅薄鎵ц銆?br />
聽聽 鍙傛暟pointcuts
聽聽 鐢ㄤ簬鎹曡幏鍙傛暟綾誨瀷鐨勮繛鎺ョ偣銆?br />聽聽 args(String,..,int)
聽聽 args(RemoteException)

聽聽 鏉′歡媯嫻媝ointcuts
聽聽 if(System.currentTimeMillis()>triggerTime)


聽聽 鍩烘湰鐨勮娉曞氨榪欎簺錛屼笉榪嘇spectJ5 宸茬粡澧炲姞浜嗕笉灝戣娉曪紝涓昏鍏充簬Annotation 鐨勶紝涓嶈繃榪欓儴鍒嗚繕娌℃湁浠旂粏鐮旂┒錛屼互鍚庡啀璁茶В鍚с傚笇鏈涜兘鏈夋墍甯姪

聽聽



]]>
spring aop 2.0 緙栫▼(涓?http://www.tkk7.com/zyl/archive/2006/09/17/70116.html甯冭。閮?/dc:creator>甯冭。閮?/author>Sun, 17 Sep 2006 03:13:00 GMThttp://www.tkk7.com/zyl/archive/2006/09/17/70116.htmlhttp://www.tkk7.com/zyl/comments/70116.htmlhttp://www.tkk7.com/zyl/archive/2006/09/17/70116.html#Feedback4http://www.tkk7.com/zyl/comments/commentRss/70116.htmlhttp://www.tkk7.com/zyl/services/trackbacks/70116.html鍓嶉潰榪欐槸璁蹭簡璁稿鐨勬蹇碉紝涓嬮潰浠ヤ竴涓緥瀛愭潵璇存槑錛?br />涓涓緢濂界悊瑙g殑aop 渚嬪瓙錛屼篃灝辨槸鏃ュ織鏈嶅姟銆?br />鍏堜粠aop絎竴縐嶆柟寮忔潵瀹炵幇錛屼篃灝辨槸xml閰嶇疆鏂瑰紡
鍏堝垱寤哄熀鏈殑鏃ュ織綾伙細
public class Logger {

聽聽聽 private static Log log = LogFactory.getLog(Logger.class);

聽聽聽 public void entry(String message) {
聽聽聽聽聽聽聽 log.info(message);
聽聽聽 }
}
榪欓噷鍙槸綆鍗曠殑涓涓柟娉曪紝褰撶劧瀹為檯鎯呭喌鍙兘涓嶅悓銆?br />鐢變簬xml閰嶇疆闇瑕佷竴涓柟闈㈢殑瀹炵幇bean
鎵浠ュ垱寤轟竴涓畝鍗曠殑bean 錛?br />public class LogBean {

聽聽聽 private Logger logger = new Logger();

聽聽聽 public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {
聽聽聽聽聽聽聽 logger.entry("before invoke method:"
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + joinPoint.getSignature().getName());
聽聽聽聽聽聽聽 Object object = joinPoint.proceed();
聽聽聽聽聽聽聽 logger.entry("after invoke method:"
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + joinPoint.getSignature().getName());
聽聽聽聽聽聽聽 return object;
聽聽聽 }
}
榪欓噷閲囧彇綆鍗曠殑around advice錛屽叾浠栫被鍨嬬殑advice 鍩烘湰涓婇兘宸笉澶?br />
褰撶劧鏈変簡榪欎袱涓牳蹇冪殑鏃ュ織綾伙紝闇瑕佷竴涓祴璇曠被錛岀敤浜庢祴璇曘?br />public class TestBean {

聽聽聽 public void method1() {
聽聽聽聽聽聽聽 System.out.println("in method1");
聽聽聽 }

聽聽聽 public void method2() {
聽聽聽聽聽聽聽 System.out.println("in method2");
聽聽聽 }
}
榪欏氨鏄渶瑕佹祴璇曠殑綾諱簡錛岄渶瑕佽褰曟棩蹇楃殑鏂規硶鍙湁涓や釜錛岃繖閲岀敤System.out.println錛屽彧鏄兂鏄劇ず鏂規硶鐨勮皟鐢ㄩ『搴忋?br />

鐒跺悗鍏抽敭鐨勫湪浜巟ml鐨勯厤緗簡

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="聽xmlns:xsi="聽xmlns:aop="http://www.springframework.org/schema/aop"
聽xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">

聽<aop:config>
聽聽聽聽<!--聽聽expression 琛ㄧず瑕佹墽琛岀殑鍖歸厤琛ㄨ揪寮忥紝榪欓噷鍖歸厤鎵鏈夌殑public鏂規硶錛屼絾鏄幓闄ogger綾葷殑鎵鏈夋柟娉曪紝闃叉鏃犻檺璋冪敤-->

聽聽聽聽聽聽<aop:pointcut id="loggableCalls"
聽聽聽聽聽聽聽聽聽 expression="execution(public * *(..)) and !execution(* org.spring.test.aop.log.Logger.*(..))"/>


聽聽<aop:aspect id="logAspect" ref="logBean">
聽聽聽<aop:around pointcut-ref="loggableCalls" method="aroundLogCalls"/>
聽聽</aop:aspect>

聽</aop:config>
聽<bean id="logBean" class="org.spring.test.aop.log.LogBean" />
聽<bean id="testBean" class="org.spring.test.aop.log.TestBean"/>

</beans>

鐜板湪鍐欎竴涓祴璇曠被錛?br />
public class LogXmlTest extends RootTest {

聽聽聽 @Override
聽聽聽 protected String getBeanXml() {
聽聽聽聽聽聽聽 return "org/spring/test/aop/log/bean.xml";
聽聽聽 }

聽聽聽 public void testLog() {
聽聽聽聽聽聽聽 TestBean bean = (TestBean) ctx.getBean("testBean");
聽聽聽聽聽聽聽 bean.method1();
聽聽聽聽聽聽聽 bean.method2();
聽聽聽 }

}

public abstract class RootTest extends TestCase {

聽聽聽 protected ApplicationContext聽 ctx;

聽聽聽 protected Log log = LogFactory.getLog(getClass());

聽聽聽 protected RootTest() {
聽聽聽聽聽聽聽 ctx = new ClassPathXmlApplicationContext(getBeanXml());
聽聽聽 }

聽聽聽 protected abstract String getBeanXml();

}

鎵撳嵃鐨勬秷鎭涓嬶細
2006-09-17 11:08:28,203 INFO [org.spring.test.aop.log.Logger] - before invoke method:method1
in method1
2006-09-17 11:08:28,203 INFO [org.spring.test.aop.log.Logger] - after invoke method:method1
2006-09-17 11:08:28,218 INFO [org.spring.test.aop.log.Logger] - before invoke method:method2
in method2
2006-09-17 11:08:28,218 INFO [org.spring.test.aop.log.Logger] - after invoke method:method2

絎簩縐嶅疄鐜版柟寮忥紝閲囩敤娉ㄩ噴鏂瑰紡錛?br />
Logger 綾諱笉鍙?br />鍒涘緩涓涓狶ogAspect綾?br />@Aspect
public class LogAspect {

聽聽聽 private Logger logger = new Logger();

聽聽聽 @Pointcut("execution(public * *(..))")
聽聽聽 public void publicMethods() {

聽聽聽 }

聽聽聽 @Pointcut("execution(* org.spring.test.aop.log.Logger.*(..))")
聽聽聽 public void logObjectCalls() {

聽聽聽 }

聽聽 @Pointcut("publicMethods()&&!logObjectCalls()")
聽聽聽 public void loggableCalls() {

聽聽聽 }

聽聽聽 @Around("loggableCalls()")
聽聽聽 public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {
聽聽聽聽聽聽聽 logger.entry("before invoke method:"
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + joinPoint.getSignature().getName());
聽聽聽聽聽聽聽 Object object = joinPoint.proceed();
聽聽聽聽聽聽聽 logger.entry("after invoke method:"
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 + joinPoint.getSignature().getName());
聽聽聽聽聽聽聽 return object;
聽聽聽 }
}

閰嶇疆鏂囦歡灝辯畝鍗曞浜?br /><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="聽xmlns:xsi="聽xmlns:aop="聽xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
聽<aop:aspectj-autoproxy/>

聽<!-- 鎴栬呬嬌鐢ㄤ互涓嬪畾涔?br />聽


聽<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />

聽-->
聽<bean id="logAspect" class="org.spring.test.aop.log.LogAspect"/>
聽<bean id="testBean" class="org.spring.test.aop.log.TestBean"/>

</beans>

嫻嬭瘯綾伙細
璺熶笂闈㈢殑宸笉澶?br />鎶妜ml鏂囦歡鎹㈡帀灝辮

鎵撳嵃鐨勬柟寮忓樊涓嶅

涓漢榪樻槸姣旇緝鍠滄絎簩縐嶅疄鐜般?/p>

]]>
spring aop緙栫▼(浜?http://www.tkk7.com/zyl/archive/2006/09/15/69966.html甯冭。閮?/dc:creator>甯冭。閮?/author>Fri, 15 Sep 2006 11:31:00 GMThttp://www.tkk7.com/zyl/archive/2006/09/15/69966.htmlhttp://www.tkk7.com/zyl/comments/69966.htmlhttp://www.tkk7.com/zyl/archive/2006/09/15/69966.html#Feedback0http://www.tkk7.com/zyl/comments/commentRss/69966.htmlhttp://www.tkk7.com/zyl/services/trackbacks/69966.html鍓嶉潰涓昏浠嬬粛浜嗗浣曢氳繃xml瀹炵幇aop緙栫▼錛屼笅闈富瑕佷粙緇嶅浣曢氳繃@AspectJ鏉ュ疄鐜般?br />涓轟簡浣緻AspectJ 鏀寔鐢熸晥,
闇瑕佸仛浠ヤ笅姝ラ錛?br />鍦?/span>xml涓緗?/span>

<aop:aspectj-autoproxy/>

鎴栬?br />鍦▁ml涓姞鍏?br /><bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />

澹版槑 aspect

<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect">

聽聽 <!-- configure properties of aspect here as normal -->

</bean>

package org.xyz;

import org.aspectj.lang.annotation.Aspect;

@Aspect

public class NotVeryUsefulAspect {

}

澹版槑 pointcut

@Pointcut("execution(* transfer(..))")

public void transfer() {}


澹版槑 advice

Before advice:

@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")

public void doAccessCheck() {

聽聽聽 // ...

}

After returning advice:

@AfterReturning("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")

public void doAccessCheck() {

聽聽聽 // ...

}

鎴栬?/span>

@AfterReturning(
pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
returning="retVal")

public void doAccessCheck(Object retVal) {

聽聽聽 // ...

}

After throwing advice錛?o:p>

@AfterThrowing("SystemArchitecture.dataAccessOperation()")

public void doRecoveryActions() {

聽聽聽 // ...

}

鎴栬?/span>

@AfterThrowing(

聽聽聽 pointcut=" SystemArchitecture.dataAccessOperation()",

聽聽聽 throwing="ex")

public void doRecoveryActions(DataAccessException ex) {

聽聽聽 // ...

}

After (finally) advice錛?o:p>

@After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")

public void doReleaseLock() {

聽聽聽 // ...

}

Around advice錛?o:p>

@Around("com.xyz.myapp.SystemArchitecture.businessService()")

public Object doBasicProfiling( ProceedingJoinPoint pjp) throws Throwable {

聽聽聽 // start stopwatch

聽聽聽 Object retVal = pjp.proceed();

聽聽聽 // stop stopwatch

聽聽聽 return retVal;

}

Advice parameters錛?o:p>

@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" + "args(account,..)" )

public void validateAccount(Account account) {

// ...

}

澹版槑鍙傛暟鍚嶇О錛?/span>

@Before(

聽聽 value="com.xyz.lib.Pointcuts.anyPublicMethod() && " +

聽聽聽聽聽聽聽聽 "@annotation(auditable)",

argNames="auditable" )

public void audit(Auditable auditable) {

AuditCode code = auditable.value();

// ...

}

Advice 鎺掑簭錛?o:p>

涓鑸互澹版槑鐨勬柟娉曟搴忎負鍏堝悗

涓嶅悓鐨?/span> Advice 錛岄氳繃瀹炵幇 Ordered 鎺ュ彛錛屾潵鎺掑簭


Introductions

鐢ㄤ簬寮曞叆鏂扮殑鎺ュ彛

@Aspect

public class UsageTracking {

@DeclareParents(value="com.xzy.myapp.service.*+",

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 defaultImpl=DefaultUsageTracked.class)

public static UsageTracked mixin;

@Before("com.xyz.myapp.SystemArchitecture.businessService() &&" +

聽聽聽聽聽聽聽聽聽 "this(usageTracked)")

public void recordUsage(UsageTracked usageTracked) {

聽聽聽 usageTracked.incrementUseCount();

}

}



]]>
spring 2.0 aop緙栫▼(涓)http://www.tkk7.com/zyl/archive/2006/09/15/69805.html甯冭。閮?/dc:creator>甯冭。閮?/author>Fri, 15 Sep 2006 01:41:00 GMThttp://www.tkk7.com/zyl/archive/2006/09/15/69805.htmlhttp://www.tkk7.com/zyl/comments/69805.htmlhttp://www.tkk7.com/zyl/archive/2006/09/15/69805.html#Feedback0http://www.tkk7.com/zyl/comments/commentRss/69805.htmlhttp://www.tkk7.com/zyl/services/trackbacks/69805.html涓昏鍒嗕負涓ゅぇ鏂歸潰
1.鏀寔綆鍗曠殑aop xml閰嶇疆
2.鏀寔@AspectJ鐨勬敞閲?br />
鍏堟潵鐪嬩竴鐪嬬涓縐嶆儏鍐碉細
鐢蟲槑涓涓猘spect錛屽湪xml涓殑鐢蟲槑濡備笅錛?br />

<aop:config>

<aop:aspect id="myAspect" ref="aBean">

聽聽聽 ...

</aop:aspect>

</aop:config>

<bean id="aBean" class="...">

...

</bean>


鐢蟲槑pointcut

<aop:config>

<aop:pointcut id="businessService"

聽聽聽聽聽聽聽 expression="execution(* com.xyz.myapp.service.*.*(..))"/>

</aop:config>


鐢蟲槑advice

Before advice錛?/span>

<aop:aspect id="beforeExample" ref="aBean">

聽聽聽 <aop:before

聽聽聽聽聽 pointcut-ref="dataAccessOperation"

聽聽聽聽聽 method="doAccessCheck"/>

</aop:aspect>

After returning advice:

<aop:aspect id="afterReturningExample" ref="aBean">

聽聽聽 <aop:after-returning

聽聽聽聽聽 pointcut-ref="dataAccessOperation"

聽聽聽聽聽 method="doAccessCheck"/>

聽聽聽聽聽聽聽聽聽

聽聽聽 ...

聽聽聽

</aop:aspect>

鎴栬呭甫鏈夎繑鍥炲弬鏁?/span>

<aop:aspect id="afterReturningExample" ref="aBean">

聽聽聽 <aop:after-returning

聽聽聽聽聽 pointcut-ref="dataAccessOperation"

聽聽聽聽 returning="retVal"

聽聽聽聽聽 method="doAccessCheck"/>

聽聽聽聽聽聽聽聽聽

聽聽聽 ...

聽聽聽

</aop:aspect>

After throwing advice錛?/span>

<aop:aspect id="afterThrowingExample" ref="aBean">

聽聽聽 <aop:after-throwing

聽聽聽聽聽 pointcut-ref="dataAccessOperation"

聽聽聽聽 method="doRecoveryActions"/>

聽聽聽聽聽聽聽聽聽

聽聽聽 ...

聽聽聽

</aop:aspect>

鎴栬呭甫鏈塼hrowing

<aop:aspect id="afterThrowingExample" ref="aBean">

聽聽聽 <aop:after-throwing

聽聽聽聽聽 pointcut-ref="dataAccessOperation"

聽聽聽聽聽 throwing="dataAccessEx"

聽聽聽聽聽 method="doRecoveryActions"/>

聽聽聽聽聽聽聽聽聽

聽聽聽 ...

聽聽聽

</aop:aspect>

After (finally) advice錛?/span>

<aop:aspect id="afterFinallyExample" ref="aBean">

聽聽聽 <aop:after

聽聽聽聽聽 pointcut-ref="dataAccessOperation"

聽聽聽聽聽 method="doReleaseLock"/>

聽聽聽聽聽聽聽聽聽

聽聽聽 ...

聽聽聽

</aop:aspect>

Around advice錛?/span>

<aop:aspect id="aroundExample" ref="aBean">

聽聽聽 <aop:around

聽聽聽聽聽 pointcut-ref="businessService"

聽聽聽聽聽 method="doBasicProfiling"/>

聽聽聽聽聽聽聽聽聽

聽聽聽 ...

聽聽聽

</aop:aspect>

Advice parameters錛?/span>

<aop:before

pointcut="Pointcuts.anyPublicMethod() and @annotation(auditable)"

method="audit"

arg-names="auditable"/>


瀵逛簬寮曞叆鎺ュ彛錛?a name="_Toc144432334">Introductions錛夛細

<aop:aspect id="usageTrackerAspect" ref="usageTracking">

<aop:declare-parents

聽聽聽聽聽 types-matching="com.xzy.myapp.service.*+",

聽聽聽聽聽 implement-interface="UsageTracked"
聽聽聽聽 default-impl=" service.tracking.DefaultUsageTracked"/>

<aop:before

聽聽聽 pointcut="com.xyz.myapp.SystemArchitecture.businessService()

聽聽聽聽聽聽聽聽聽聽聽聽聽 and this(usageTracked)"

聽聽聽 method="recordUsage"/>

</aop:aspect>



]]>
浣跨敤aop鍒涘緩鏉炬暎鑰﹀悎錛堝垎鏋愭棩蹇楃▼搴忥級http://www.tkk7.com/zyl/archive/2006/09/09/68648.html甯冭。閮?/dc:creator>甯冭。閮?/author>Sat, 09 Sep 2006 00:32:00 GMThttp://www.tkk7.com/zyl/archive/2006/09/09/68648.htmlhttp://www.tkk7.com/zyl/comments/68648.htmlhttp://www.tkk7.com/zyl/archive/2006/09/09/68648.html#Feedback0http://www.tkk7.com/zyl/comments/commentRss/68648.htmlhttp://www.tkk7.com/zyl/services/trackbacks/68648.html聽聽聽聽聽聽聽 浣嗙敤浜庢棩蹇楄褰曠殑浠g爜鍜屼富瑕佺敤浜庡叾瀹冭亴璐g殑浠g爜緙犵粫鍦ㄤ竴璧楓傛牴鎹墍瑙e喅鐨勯棶棰樼殑澶嶆潅紼嬪害鍜屼綔鐢ㄥ煙鐨勪笉鍚岋紝鎵寮曡搗鐨勬販涔卞彲澶у彲灝忋傛洿鏀逛竴涓簲鐢ㄧ▼搴忕殑鏃ュ織璁板綍絳栫暐鍙兘娑夊強鏁扮櫨嬈$紪杈?鈥?鍗充嬌鍙錛岃繖鏄釜浠や漢澶寸柤鐨勪換鍔°?br />聽聽聽聽聽聽聽聽 鑰冭檻涓涓嬩互涓嬩唬鐮侊細
娓呭崟 1. 鏃ュ織璋冪敤鎵嬪伐鎻掑叆鍒版瘡涓柟娉曚腑聽聽聽聽聽聽聽聽
public void doGet(JspImplicitObjects theObjects) throws ServletException
{
  logger.entry("doGet(...)");

  JspTestController controller = new JspTestController();
  controller.handleRequest(theObjects);

  logger.exit("doGet");
}
聽聽聽聽聽聽聽 鍙兘鍦ㄤ笉鍚岀殑鏂規硶涓兘瀛樺湪榪欐牱鐨勪唬鐮併傝繖灝遍犳垚浠g爜鐨勬棤闄愭墿寮狅紝鍚屾椂淇敼涔熷彉寰楅潪甯稿洶闅俱?br />聽聽聽聽聽聽 浣跨敤aop鍚庯紝鏇存敼鐨勪唬鐮佷負錛?br />娓呭崟 2. 鑷姩搴旂敤浜庢瘡涓柟娉曠殑璁板綍鏃ュ織璋冪敤
public aspect AutoLog{
  
  pointcut publicMethods() : execution(public * org.apache.cactus..*(..));

  pointcut logObjectCalls() :
    execution(* Logger.*(..));
    
  pointcut loggableCalls() : publicMethods() && ! logObjectCalls();
    
  before() : loggableCalls(){
    Logger.entry(thisJoinPoint.getSignature().toString());
  }
    
  after() : loggableCalls(){
    Logger.exit(thisJoinPoint.getSignature().toString());
  }
}

鎵鏈夌殑鏃ュ織緇存姢閮介泦涓簬AutoLog鏂歸潰銆?br />

Pointcut 鍜?join point

瑕佺悊瑙?Pointcut錛屽繀闇鐭ラ亾 join point 鏄粈涔堛俲oin point 琛ㄧず鍦ㄧ▼搴忔墽琛屼腑鏄庣‘瀹氫箟鐨勭偣銆侫spectJ 涓吀鍨嬬殑 join point 鍖呮嫭鏂規硶璋冪敤銆佸綾繪垚鍛樼殑璁塊棶浠ュ強寮傚父澶勭悊紼嬪簭鍧楃殑鎵ц銆俲oin point 鍙互鍖呭惈鍏跺畠 join point銆備緥濡傦紝涓涓柟娉曡皟鐢ㄥ彲鑳藉湪瀹冭繑鍥炰箣鍓嶅紩璧峰叾瀹冩柟娉曡皟鐢ㄣ傞偅涔堬紝Pointcut 灝辨槸涓縐嶈璦鏋勯狅紝榪欑鏋勯犳牴鎹凡瀹氫箟鐨勬爣鍑嗘寫閫変竴緇?join point銆傜ず渚嬩腑鐨勭涓涓?Pointcut 縐頒負 publicMethods 錛岄夋嫨 org.apache.cactus 鍖呬腑鐨勬墍鏈夊叕鐢紙public錛夋柟娉曠殑鎵ц銆?execution 鏄竴涓師濮嬬殑 Pointcut錛堝氨璞?int 鏄竴縐嶅師濮嬬殑 Java 綾誨瀷錛夈傚畠閫夋嫨涓庡叾鎷彿涓畾涔夌殑鏂規硶璇存槑鍖歸厤鐨勪換浣曟柟娉曠殑鎵ц銆傛柟娉曡鏄庡厑璁稿寘鍚氶厤絎︼紱紺轟緥涓殑涓涓柟娉曡鏄庡寘鍚簡鍑犱釜閫氶厤絎︺傜浜屼釜鍚嶄負 logObjectCalls 鐨?Pointcut 閫夋嫨浜?Logger 綾諱腑鐨勬墍鏈夋柟娉曠殑鎵ц銆傜涓変釜 Pointcut loggableCalls 錛岄氳繃浣跨敤 && ! 鍚堝茍浜嗗墠涓や釜 Pointcut錛岃繖鎰忓懗鐫瀹冮夋嫨浜嗛櫎 Logger 綾諱腑鐨勫叕鐢ㄦ柟娉曚互澶栵紝 org.apache.cactus 涓墍鏈夌殑鍏敤鏂規硶銆傦紙璁板綍 log 鏂規硶灝嗗鑷存棤闄愰掑綊銆傦級

Advice

鏃㈢劧 Aspect 宸茬粡瀹氫箟浜嗗畠搴旇璁板綍鐨勭偣錛屽畠浣跨敤 Advice 鏉ュ畬鎴愬疄闄呯殑鏃ュ織璁板綍銆侫dvice 鏄湪 join point 涔嬪墠銆佷箣鍚庢垨鍛ㄥ洿鎵ц鐨勪唬鐮併傜浉瀵逛簬 Pointcut 鏉ュ畾涔?Advice錛岃綾諱技浜庘滃湪鎯寵璁板綍鐨勬瘡涓柟娉曡皟鐢ㄤ箣鍚庤繍琛岃繖浜涗唬鐮佲濊繖鏍風殑璇濄傚洜姝?Advice 濡備笅錛?/p>

before() : loggableCalls(){
    Logger.entry(thisJoinPoint.getSignature().toString());
}

Advice 浣跨敤 Logger 綾伙紝鍏跺叆鍙e拰鍑哄彛鏂規硶綾諱技浜庝笅鍒椾唬鐮侊細

public static void entry(String message){
   System.out.println("entering method " + message);
}

鍦ㄧず渚嬩腑錛屼紶閫掑埌璁板綍鍣ㄧ殑 String 鏄粠 thisJoinPoint 媧劇敓鐨勶紝榪欐槸涓涓壒孌婄殑鍙嶅皠瀵硅薄錛屽畠鍏佽璁塊棶 join point 鎵ц鎵澶勭殑榪愯鏃朵笂涓嬫枃銆傚湪 Cactus 瀹為檯浣跨敤鐨?Aspect 涓紝Advice 浣跨敤榪欑瀵硅薄鏉ユ绱紶閫掑埌姣忎釜璁板綍鐨勬柟娉曡皟鐢ㄤ腑鐨勬柟娉曞弬鏁般傚綋鏃ュ織璁板綍 Aspect 搴旂敤浜庝唬鐮佹椂錛屾柟娉曡皟鐢ㄧ殑緇撴灉濡備笅錛?


娓呭崟 3. AutoLog Aspect 鐨勮緭鍑?/b>

entering method: void test.Logging.main(String[])
entering method: void test.Logging.foo()
exiting method: void test.Logging.foo()
exiting method: void test.Logging.main(String[])



]]>
鐞嗚ВAOPhttp://www.tkk7.com/zyl/archive/2006/09/06/68113.html甯冭。閮?/dc:creator>甯冭。閮?/author>Wed, 06 Sep 2006 12:05:00 GMThttp://www.tkk7.com/zyl/archive/2006/09/06/68113.htmlhttp://www.tkk7.com/zyl/comments/68113.htmlhttp://www.tkk7.com/zyl/archive/2006/09/06/68113.html#Feedback0http://www.tkk7.com/zyl/comments/commentRss/68113.htmlhttp://www.tkk7.com/zyl/services/trackbacks/68113.html聽聽聽聽聽聽聽聽 綆鍗曠殑鏉ヨ,AOP灝辨槸闈㈠悜鏂歸潰錛坅spect)緙栫▼銆傚叿浣撶殑姒傚康鏄繖鏍風殑錛?br />聽聽聽聽聽聽聽聽 闈㈠悜 Aspect 鐨勭紪紼嬶紙AOP錛夋槸涓縐嶆柊鐨勭紪紼嬫妧鏈紝瀹冨厑璁哥▼搴忓憳瀵?妯垏鍏崇郴錛坈rosscutting concerns錛?/i>錛堣法瓚婂吀鍨嬭亴璐g晫闄愮殑琛屼負錛屼緥濡傛棩蹇楄褰曪級榪涜妯″潡鍖栥侫OP 寮曡繘浜?Aspect錛?/i>瀹冨皢褰卞搷澶氫釜綾葷殑琛屼負灝佽鍒頒竴涓彲閲嶇敤妯″潡涓?br />聽聽聽聽聽聽聽聽 閭?a name="IDA0ESCC">浠涔堟槸妯垏錛?/font>
聽聽聽聽聽聽聽 妯垏
鏄潰鍚戞柟闈㈢紪紼嬬殑涓撴湁鍚嶈瘝銆傚畠鎸囩殑鏄湪涓涓粰瀹氱殑緙栫▼妯″瀷涓┛瓚婃棦瀹氱殑鑱岃矗閮ㄥ垎錛堟瘮濡傛棩蹇楄褰曞拰鎬ц兘浼樺寲錛夌殑鎿嶄綔銆傚湪妯垏鐨勪笘鐣岄噷錛屾í鍒囨湁涓ょ綾誨瀷錛氬姩鎬佹í鍒囧拰闈欐佹í鍒囥?br />聽聽聽聽聽聽聽 鍔ㄦ佹í鍒?/strong>
聽聽聽聽聽聽 鍔ㄦ佹í鍒?/i> 鏄氳繃 鍒囧叆鐐?/i> 鍜?榪炴帴鐐?/i> 鍦ㄤ竴涓?鏂歸潰 涓垱寤鴻涓虹殑榪囩▼錛岃繛鎺ョ偣鍙互鍦ㄦ墽琛屾椂妯悜鍦板簲鐢ㄤ簬鐜版湁瀵硅薄銆傚姩鎬佹í鍒囬氬父鐢ㄤ簬甯姪鍚戝璞″眰嬈′腑鐨勫悇縐嶆柟娉曟坊鍔犳棩蹇楄褰曟垨韜喚璁よ瘉銆備笅闈㈣鎴戜滑鑺辯偣鏃墮棿浜嗚В涓涓嬪姩鎬佹í鍒囦腑鐨勪竴浜涘疄闄呮蹇碉細
  • 鏂歸潰錛坅spect錛?/b>綾諱技浜?Java 緙栫▼璇█涓殑綾匯傛柟闈㈠畾涔夊垏鍏ョ偣鍜岄氱煡錛坅dvice錛夛紝騫剁敱璇稿 AspectJ 榪欐牱鐨勬柟闈㈢紪璇戝櫒鏉ョ紪璇戯紝浠ヤ究灝嗘í鍒囷紙鍖呮嫭鍔ㄦ佺殑鍜岄潤鎬佺殑錛夌粐鍏ワ紙interweave錛夌幇鏈夌殑瀵硅薄涓?

  • 涓涓?榪炴帴鐐癸紙join point錛?/b> 鏄▼搴忔墽琛屼腑涓涓簿紜墽琛岀偣錛屾瘮濡傜被涓殑涓涓柟娉曘備緥濡傦紝瀵硅薄 Foo 涓殑鏂規硶 bar() 灝卞彲浠ユ槸涓涓繛鎺ョ偣銆?榪炴帴鐐?/i>鏄釜鎶借薄鐨勬蹇碉紱涓嶇敤涓誨姩瀹氫箟涓涓繛鎺ョ偣銆?

  • 涓涓?鍒囧叆鐐癸紙pointcut錛?/b> 鏈川涓婁竴涓敤浜庢崟鎹夎繛鎺ョ偣鐨勭粨鏋勩備緥濡傦紝鍙互瀹氫箟涓涓垏鍏ョ偣鏉ユ崟鎹夊瀵硅薄 Foo 涓殑鏂規硶 bar() 鐨勬墍鏈夎皟鐢ㄣ傚拰榪炴帴鐐圭浉鍙嶏紝鍒囧叆鐐歸渶瑕佸湪鏂歸潰涓畾涔夈?

  • 閫氱煡錛坅dvice錛?/b> 鏄垏鍏ョ偣鐨勫彲鎵ц浠g爜銆備竴涓粡甯稿畾涔夌殑閫氱煡鏄坊鍔犳棩蹇楄褰曞姛鑳斤紝鍏朵腑鍒囧叆鐐規崟鎹夊瀵硅薄 Foo 涓殑 bar() 鐨勬瘡涓皟鐢紝鐒跺悗璇ラ氱煡鍔ㄦ佸湴鎻掑叆涓浜涙棩蹇楄褰曞姛鑳斤紝姣斿鎹曟崏 bar() 鐨勫弬鏁般?

聽聽聽聽聽聽 榪欎簺姒傚康鏄姩鎬佹í鍒囩殑鏍稿績錛岃櫧鐒舵濡傛垜浠嵆灝嗙湅鍒扮殑錛屽畠浠茍涓嶅叏閮芥槸闈欐佹í鍒囨墍蹇呴渶鐨勩?br />
聽聽聽聽聽聽 闈欐佹í鍒?/strong>

聽聽聽聽 闈欐佹í鍒?/i> 鍜屽姩鎬佹í鍒囩殑鍖哄埆鍦ㄤ簬瀹冧笉淇敼涓涓粰瀹氬璞$殑鎵ц琛屼負銆傜浉鍙嶏紝瀹冨厑璁擱氳繃寮曞叆闄勫姞鐨勬柟娉曞瓧孌靛拰灞炴ф潵淇敼瀵硅薄鐨?緇撴瀯銆傛澶栵紝闈欐佹í鍒囧彲浠ユ妸鎵╁睍鍜屽疄鐜伴檮鍔犲埌瀵硅薄鐨勫熀鏈粨鏋勪腑銆?
聽聽聽 铏界劧鐜板湪榪樻棤娉曡皥鍙婇潤鎬佹í鍒囩殑鏅亶浣跨敤鈥斺斿畠鐪嬭搗鏉ユ槸 AOP 鐨勪竴涓浉瀵規湭琚帰绱紙灝界闈炲父鍏鋒湁鍚稿紩鍔涳級鐨勭壒鎬р斺旂劧鑰岃繖涓鎶鏈暣鍚殑娼滃姏鏄法澶х殑銆備嬌鐢ㄩ潤鎬佹í鍒囷紝鏋舵瀯甯堝拰璁捐鑰呰兘鐢ㄤ竴縐嶇湡姝i潰鍚戝璞$殑鏂規硶鏈夋晥鍦板緩绔嬪鏉傜郴緇熺殑妯″瀷銆傞潤鎬佹í鍒囧厑璁告偍涓嶇敤鍒涘緩寰堟繁鐨勫眰嬈$粨鏋勶紝浠ヤ竴縐嶆湰璐ㄤ笂鏇翠紭闆呫佹洿閫肩湡浜庣幇瀹炵粨鏋勭殑鏂瑰紡錛屾彃鍏ヨ法瓚婃暣涓郴緇熺殑鍏叡琛屼負銆?/p>

聽聽聽聽聽聽



]]>
主站蜘蛛池模板: 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲国产一区二区三区青草影视| 男人的好免费观看在线视频| 在线免费视频你懂的| 亚洲日韩AV一区二区三区中文| 亚洲精品国产成人99久久| 免费观看午夜在线欧差毛片 | 久久夜色精品国产噜噜噜亚洲AV| 国产午夜免费秋霞影院| 亚州免费一级毛片| 国产偷伦视频免费观看| 国产成人综合久久精品亚洲| 2017亚洲男人天堂一| 亚洲视频国产精品| 亚洲av永久无码精品国产精品| 又粗又大又硬又爽的免费视频| 成人免费视频77777| 16女性下面扒开无遮挡免费| 免费一区二区三区| 在线观看免费无码视频| 在线播放国产不卡免费视频| 爱爱帝国亚洲一区二区三区| 亚洲日韩乱码中文字幕| wwwxxx亚洲| 亚洲国产精品一区二区三区在线观看| 亚洲精品不卡视频| 亚洲黄网在线观看| 亚洲无线电影官网| 97久久精品亚洲中文字幕无码| 亚洲Aⅴ无码专区在线观看q| 亚洲色精品aⅴ一区区三区 | 精品亚洲成A人在线观看青青| 亚洲色无码国产精品网站可下载| 33333在线亚洲| 亚洲一区精彩视频| 在线观看日本亚洲一区| 亚洲欧美日本韩国| 亚洲国产成人精品无码区花野真一 | 77777午夜亚洲| 亚洲gay片在线gv网站| 亚洲av无码一区二区三区在线播放|