Spring鏄竴涓潪甯鎬紭縐鐨勮交閲忕駭妗嗘灦錛岄氳繃Spring鐨処oC瀹瑰櫒錛屾垜浠殑鍏蟲敞鐐逛究鏀懼埌浜嗛渶瑕佸疄鐜扮殑涓氬姟閫昏緫 涓娿傚AOP鐨勬敮鎸佸垯鑳借鎴戜滑鍔ㄦ佸寮轟笟鍔℃柟娉曘傜紪鍐欐櫘閫氱殑涓氬姟閫昏緫Bean鏄潪甯稿鏄撹屼笖鏄撲簬嫻嬭瘯鐨勶紝鍥犱負瀹冭兘鑴辯J2EE瀹瑰櫒錛堝 Servlet錛宩sp鐜錛夊崟鐙繘琛屽崟鍏冩祴璇曘傛渶鍚庣殑涓姝ヤ究鏄湪Spring妗嗘灦涓皢榪欎簺涓氬姟Bean浠ML閰嶇疆鏂囦歡鐨勬柟寮忕粍緇囪搗鏉ワ紝瀹冧滑灝辨寜鐓ф垜浠? 棰勫畾鐨勭洰鏍囨甯稿伐浣滀簡錛侀潪甯稿鏄擄紒
鏈枃灝嗙粰鍑轟竴涓熀鏈殑Spring鍏ラ棬紺轟緥錛屽茍婕旂ず濡備綍浣跨敤Spring鐨凙OP灝嗗鏉傜殑涓氬姟閫昏緫鍒嗙鍒版瘡涓柟闈腑銆?/p>
1錛庡紑鍙戠幆澧冮厤緗?錛庣紪鍐橞ean鎺ュ彛鍙婂叾瀹炵幇3錛庡湪Spring涓厤緗瓸ean騫惰幏寰桞ean鐨勫疄渚?錛庣紪鍐橝dvisor浠ュ寮? ServiceBean5錛庢葷粨
1錛庡紑鍙戠幆澧冮厤緗?棣栧厛錛岄渶瑕佹紜厤緗甁ava鐜銆傛帹鑽愬畨瑁匤DK1.4.2錛屽茍姝g‘閰嶇疆鐜鍙橀噺錛?/p>
JAVA_HOME=<JDK瀹夎鐩綍>CLASSPATH=.Path=%JAVA_HOME%"bin;……
鎴戜滑灝嗕嬌鐢ㄥ厤璐圭殑Eclipse 3.1浣滀負IDE銆傛柊寤轟竴涓狫ava Project錛屽皢Spring鐨勫彂甯冨寘spring.jar浠ュ強commons-logging-1.0.4.jar澶嶅埗鍒癙roject鐩綍涓嬶紝騫跺湪 Project > Properties涓厤緗ソJava Build Path錛?/p>
鎴戜滑瀹炵幇涓涓鐞嗙敤鎴風殑涓氬姟Bean銆傞鍏堝畾涔変竴涓猄erviceBean鎺ュ彛錛屽0鏄庝竴浜涗笟鍔℃柟娉曪細
/** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;
/** * Interface of service facade. * * @author Xuefeng */public interface ServiceBean { void addUser(String username, String passWord); void deleteUser(String username); boolean findUser(String username); String getPassword(String username);}
鐒跺悗鍦∕yServiceBean涓疄鐜版帴鍙o細
/** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;
import java.util.*;
public class MyServiceBean implements ServiceBean {
private String dir; private Map map = new HashMap();
public void setUserDir(String dir) { this.dir = dir; System.out.println("Set user dir to: " + dir); }
public void addUser(String username, String password) { if(!map.containsKey(username)) map.put(username, password); else throw new RuntimeException("User already exist."); }
public void deleteUser(String username) { if(map.remove(username)==null) throw new RuntimeException("User not exist."); }
public boolean findUser(String username) { return map.containsKey(username); }
public String getPassword(String username) { return (String)map.get(username); }}
涓轟簡綆鍖栭昏緫錛屾垜浠嬌鐢ㄤ竴涓狹ap淇濆瓨鐢ㄦ埛鍚嶅拰鍙d護銆?/p>
鐜板湪錛屾垜浠凡緇忔湁浜嗕竴涓笟鍔ean銆傝嫻嬭瘯瀹冮潪甯稿鏄擄紝鍥犱負鍒扮洰鍓嶄負姝紝鎴戜滑榪樻病鏈夋秹鍙婂埌Spring瀹瑰櫒錛屼篃娌℃湁娑夊強鍒頒換浣昗eb瀹瑰櫒錛堝亣瀹氳繖 鏄竴涓猈eb搴旂敤紼嬪簭鍏充簬鐢ㄦ埛綆$悊鐨勪笟鍔ean錛夈傚畬鍏ㄥ彲浠ョ洿鎺ヨ繘琛孶nit嫻嬭瘯錛屾垨鑰咃紝綆鍗曞湴鍐欎釜main鏂規硶嫻嬭瘯錛?/p>
/** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;
public class Main {
public static void main(String[] args) throws Exception { ServiceBean service = new MyServiceBean(); service.addUser("bill", "hello"); service.addUser("tom", "goodbye"); service.addUser("tracy", "morning"); System.out.println("tom's password is: " + service.getPassword("tom")); if(service.findUser("tom")) { service.deleteUser("tom"); } }}
鎵ц緇撴灉錛?img src="http://www.knowsky.com/UploadFiles/20071223/2007122311173837577802.jpg" alt="Spring鍏ラ棬錛堝浘浜岋級" border="0" height="184" width="566" />
3錛庡湪Spring涓厤緗瓸ean騫惰幏寰桞ean鐨勫疄渚?鎴戜滑宸茬粡鍦ㄤ竴涓猰ain鏂規硶涓疄鐜頒簡涓氬姟錛屼笉榪囷紝灝嗗璞$殑鐢熷懡鍛ㄦ湡浜ょ粰瀹瑰櫒綆$悊鏄洿濂界殑鍔炴硶錛屾垜浠氨涓嶅繀涓哄垵濮嬪寲瀵硅薄鍜岄攢姣佸璞¤繘琛岀‖緙栫爜錛屼粠鑰岃幏 寰楁洿澶х殑鐏墊椿鎬у拰鍙祴璇曟с?/p>
鎯寵鎶奡erviceBean浜ょ粰Spring鏉ョ鐞嗭紝鎴戜滑闇瑕佷竴涓猉ML閰嶇疆鏂囦歡銆傛柊寤轟竴涓猙eans.xml錛屾斁鍒皊rc鐩綍涓嬶紝紜繚鍦? classpath涓兘鎵懼埌姝ら厤緗枃浠訛紝杈撳叆浠ヤ笅鍐呭錛?/p>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <bean id="service" class="com.crackj2ee.example.spring.MyServiceBean" /></beans>
浠ヤ笂XML澹版槑浜嗕竴涓猧d涓簊ervice鐨凚ean錛岄粯璁ゅ湴錛孲pring涓烘瘡涓0鏄庣殑Bean浠呭垱寤轟竴涓疄渚嬶紝騫墮氳繃id鏉ュ紩鐢ㄨ繖涓? Bean銆備笅闈紝鎴戜滑淇敼main鏂規硶錛岃Spring鏉ョ鐞嗕笟鍔ean錛?/p>
/** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;
import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.core.io.ClassPathResource;
public class Main {
public static void main(String[] args) throws Exception { // init factory: XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml")); // use service bean: ServiceBean service = (ServiceBean)factory.getBean("service"); service.addUser("bill", "hello"); service.addUser("tom", "goodbye"); service.addUser("tracy", "morning"); System.out.println("tom's password is """ + service.getPassword("tom") + """"); if(service.findUser("tom")) { service.deleteUser("tom"); } // close factory: factory.destroySingletons(); }}
鎵ц緇撴灉錛?nbsp;
鐢變簬鎴戜滑瑕侀氳繃main鏂規硶鍚姩Spring鐜錛屽洜姝わ紝棣栧厛闇瑕佸垵濮嬪寲涓涓狟eanFactory銆傜孩鑹查儴鍒嗘槸鍒濆鍖朣pring鐨? BeanFactory鐨勫吀鍨嬩唬鐮侊紝鍙渶瑕佷繚璇乥eans.xml鏂囦歡浣嶄簬classpath涓?/p>
鐒跺悗錛屽湪BeanFactory涓氳繃id鏌ユ壘錛屽嵆鍙幏寰楃浉搴旂殑Bean鐨勫疄渚嬶紝騫跺皢鍏墮傚綋杞瀷涓哄悎閫傜殑鎺ュ彛銆?/p>
鎺ョ潃錛屽疄鐜頒竴緋誨垪涓氬姟鎿嶄綔錛屽湪搴旂敤紼嬪簭緇撴潫鍓嶏紝璁㏒pring閿姣佹墍鏈夌殑Bean瀹炰緥銆?/p>
瀵規瘮涓婁竴涓増鏈殑Main錛屽彲浠ョ湅鍑猴紝鏈澶х殑鍙樺寲鏄笉闇瑕佽嚜宸辯鐞咮ean鐨勭敓鍛藉懆鏈熴傚彟涓涓ソ澶勬槸鍦ㄤ笉鏇存敼瀹炵幇綾葷殑鍓嶆彁涓嬶紝鍔ㄦ佸湴涓哄簲鐢ㄧ▼搴忓鍔? 鍔熻兘銆?/p> 4錛庣紪鍐橝dvisor浠ュ寮篠erviceBean
鎵璋揂OP鍗蟲槸灝嗗垎鏁e湪鍚勪釜鏂規硶澶勭殑鍏叡浠g爜鎻愬彇鍒頒竴澶勶紝騫墮氳繃綾諱技鎷︽埅鍣ㄧ殑鏈哄埗瀹炵幇浠g爜鐨勫姩鎬佺粐鍏ャ傚彲浠ョ畝鍗曞湴鎯寵薄鎴愶紝鍦ㄦ煇涓柟娉曠殑璋冪敤鍓嶃佽繑鍥? 鍓嶃佽皟鐢ㄥ悗鍜屾姏鍑哄紓甯告椂錛屽姩鎬佹彃鍏ヨ嚜宸辯殑浠g爜銆傚湪寮勬竻妤歅ointcut銆丄dvice涔嬬被鐨勬湳璇墠錛屼笉濡傜紪鍐欎竴涓渶綆鍗曠殑AOP搴旂敤鏉ヤ綋楠屼竴涓嬨?/p>
鑰冭檻涓涓嬮氬父鐨刉eb搴旂敤紼嬪簭閮戒細鏈夋棩蹇楄褰曪紝鎴戜滑鏉ョ紪鍐欎竴涓狶ogAdvisor錛屽姣忎釜涓氬姟鏂規硶璋冪敤鍓嶉兘浣滀竴涓褰曪細
/** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;
import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;
public class LogAdvisor implements MethodBeforeAdvice { public void before(Method m, Object[] args, Object target) throws Throwable { System.out.println("[Log] " + target.getClass().getName() + "." + m.getName() + "()"); }}
鐒跺悗錛屼慨鏀筨eans.xml錛?/p>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean id="serviceTarget" class="com.crackj2ee.example.spring.MyServiceBean" />
<bean id="logAdvisor" class="com.crackj2ee.example.spring.LogAdvisor" />
<bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"><value>com.crackj2ee.example.spring.ServiceBean</value></property> <property name="target"><ref local="serviceTarget"/></property> <property name="interceptorNames"> <list> <value>logAdvisor</value> </list> </property> </bean></beans>
娉ㄦ剰瑙傚療淇敼鍚庣殑閰嶇疆鏂囦歡錛屾垜浠嬌鐢ㄤ簡涓涓狿roxyFactoryBean浣滀負service鏉ヤ笌瀹㈡埛绔墦浜ら亾錛岃岀湡姝g殑涓氬姟Bean鍗?
MyServiceBean琚0鏄庝負serviceTarget騫朵綔涓哄弬鏁板璞′紶閫掔粰ProxyFactoryBean錛宲roxyInterfaces
鎸囧畾浜嗚繑鍥炵殑鎺ュ彛綾誨瀷銆傚浜庡鎴風鑰岃█錛屽皢鎰熻涓嶅嚭浠諱綍鍙樺寲錛屼絾鍗村姩鎬佸姞鍏ヤ簡LogAdvisor錛屽叧緋誨涓嬶細
榪愯緇撴灉濡備笅錛屽彲浠ュ緢瀹規槗鐪嬪埌璋冪敤浜嗗摢浜涙柟娉曪細
瑕佹埅鑾鋒寚瀹氱殑鏌愪簺鏂規硶涔熸槸鍙互鐨勩備笅闈㈢殑渚嬪瓙灝嗕慨鏀筭etPassword()鏂規硶鐨勮繑鍥炲鹼細
/** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;
import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;
public class PasswordAdvisor implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { Object ret = invocation.proceed(); if(ret==null) return null; String password = (String)ret; StringBuffer encrypt = new StringBuffer(password.length()); for(int i=0; i<password.length(); i++) encrypt.append('*'); return encrypt.toString(); }}
榪欎釜PasswordAdvisor灝嗘埅鑾稴erviceBean鐨刧etPassword()鏂規硶鐨勮繑鍥炲鹼紝騫跺皢鍏舵敼涓?***"銆傜戶緇? 淇敼beans.xml錛?/p>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <bean id="serviceTarget" class="com.crackj2ee.example.spring.MyServiceBean" />
<bean id="logAdvisor" class="com.crackj2ee.example.spring.LogAdvisor" />
<bean id="passwordAdvisorTarget" class="com.crackj2ee.example.spring.PasswordAdvisor" />
<bean id="passwordAdvisor" class="org.springframework.aop.support.RegeXPMethodPointcutAdvisor"> <property name="advice"> <ref local="passwordAdvisorTarget"/> </property> <property name="patterns"> <list> <value>.*getPassword</value> </list> </property> </bean>
<bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"><value>com.crackj2ee.example.spring.ServiceBean</value></property> <property name="target"><ref local="serviceTarget"/></property> <property name="interceptorNames"> <list> <value>logAdvisor</value> <value>passwordAdvisor</value> </list> </property> </bean></beans>
鍒╃敤Spring鎻愪緵鐨勪竴涓猂egexMethodPointcutAdvisor鍙互闈炲父瀹規槗鍦版寚瀹氳鎴幏鐨勬柟娉曘傝繍琛岀粨鏋滃涓嬶紝鍙互鐪嬪埌榪斿洖緇撴灉鍙?
涓?******"錛?nbsp;
榪橀渶瑕佺戶緇寮篠erviceBean錛熸垜浠紪鍐欎竴涓狤xceptionAdvisor錛屽湪涓氬姟鏂規硶鎶涘嚭寮傚父鏃惰兘鍋氫竴浜涘鐞嗭細
/** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;
import org.springframework.aop.ThrowsAdvice;
public class ExceptionAdvisor implements ThrowsAdvice { public void afterThrowing(RuntimeException re) throws Throwable { System.out.println("[Exception] " + re.getMessage()); }}
灝嗘Advice娣誨姞鍒癰eans.xml涓紝鐒跺悗鍦ㄤ笟鍔ean涓垹闄や竴涓笉瀛樺湪鐨勭敤鎴鳳紝鏁呮剰鎶涘嚭寮傚父錛?/p>
service.deleteUser("not-exist");
鍐嶆榪愯錛屾敞鎰忓埌ExceptionAdvisor璁板綍涓嬩簡寮傚父錛?nbsp;
鍒╃敤Spring闈炲父寮哄ぇ鐨処oC瀹瑰櫒鍜孉OP鍔熻兘錛屾垜浠兘瀹炵幇闈炲父鐏墊椿鐨勫簲鐢紝璁㏒pring瀹瑰櫒綆$悊涓氬姟瀵硅薄鐨勭敓鍛藉懆鏈燂紝鍒╃敤AOP澧炲己鍔熻兘錛? 鍗翠笉褰卞搷涓氬姟鎺ュ彛錛屼粠鑰岄伩鍏嶆洿鏀瑰鎴風浠g爜銆?/p>
涓轟簡瀹炵幇榪欎竴鐩爣錛屽繀欏誨緇堢墷璁幫細闈㈠悜鎺ュ彛緙栫▼銆傝孲pring榛樿鐨凙OP浠g悊涔熸槸閫氳繃Java鐨勪唬鐞嗘帴鍙e疄鐜扮殑銆傝櫧鐒禨pring涔熷彲浠ョ敤 CGLIB瀹炵幇瀵規櫘閫氱被鐨勪唬鐞嗭紝浣嗘槸錛屼笟鍔″璞″彧瑕佹病鏈夋帴鍙o紝灝變細鍙樺緱闅句互鎵╁睍銆佺淮鎶ゅ拰嫻嬭瘯銆?/p>
嬈㈣繋鏉ヤ俊涓庝綔鑰呬氦嫻侊細asklxf@163.com
鍙互浠庢澶勪笅杞藉畬鏁寸殑Eclipse宸ョ▼錛?/p>
springbasic.rar
錛堝嚭澶勶細http://www.jzwiki.com/article_1215945431010.shtml#錛?/p>