锘??xml version="1.0" encoding="utf-8" standalone="yes"?><!-- 鍒楄〃緇勪歡瀵煎嚭榪囨護鍣?nbsp;-->
<filter>
<filter-name>eXtremeExport</filter-name>
<filter-class>
org.extremecomponents.table.filter.ExportFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>eXtremeExport</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!-- 钁楀悕 Character Encoding filter -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
鐪嬩笉鍑烘湁浠涔堥棶棰?鍙綋鎴戞彃鍏ユ祴璇曟暟鎹椂鍏ㄦ槸涔辯爜.
鏁版嵁搴撴湰韜槸娌℃湁闂鐨?
鍚庢潵緇堜簬鎵懼埌浜嗚В鍐崇殑鏂規硶,鍘熷垱鍒楄〃緇勪歡鐨刦ilter瀵?br />
CharacterEncodingFilter鐨勮繃婊ゆ湁褰卞搷.璋冩暣涓涓嬮『搴忓氨琛屼簡.
<!-- 钁楀悕 Character Encoding filter -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 鍒楄〃緇勪歡瀵煎嚭榪囨護鍣?nbsp;-->
<filter>
<filter-name>eXtremeExport</filter-name>
<filter-class>
org.extremecomponents.table.filter.ExportFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>eXtremeExport</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
璋冩暣鍚嶤haracterEncodingFilter琛ㄧ幇鑹ソ,涓鍒囨甯?灝變笉浼氬啀鍑烘潵
涔辯爜鐨勯棶棰樹簡.
]]>
濡傛病鏈夊彲鍒版垜鐨勭綉鐩樹笅杞?
bean.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
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-2.0.xsd">
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- mail鎻愪緵鍟?nbsp;-->
<property name="host">
<value>smtp.163.com</value>
</property>
<property name="javaMailProperties">
<props>
<!-- 鐢ㄦ埛璁よ瘉 -->
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
<!-- 鐢ㄦ埛鍚?nbsp;-->
<property name="username">
<value>78688287</value>
</property>
<!-- 瀵嗙爜 -->
<property name="password">
<value>******</value>
</property>
</bean>
</beans>
MailTest.java:
package com;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
public class MailTest
{
public static void main(String[] args)
{
//寰楀埌spring鐨刢ontext瀵硅薄
ApplicationContext ctx = new FileSystemXmlApplicationContext("/src/com/bean.xml");
//mail鎻愪緵鑰?/span>
MailSender sender = (MailSender) ctx.getBean("mailSender");
//鍒涘緩涓涓畝鍗昺ail娑堟伅瀵硅薄
SimpleMailMessage smm = new SimpleMailMessage();
//鏀朵歡浜?/span>
smm.setTo("zdw@live.cn");
//鍙戜歡浜哄湴鍧
smm.setFrom("78688287@163.com");
//鏍囬
smm.setSubject("test");
//鍐呭
smm.setText("榪欐槸鍏充簬Spring Mail鎶借薄灞傜殑綆鍗曟祴璇?/span>");
//鍙戦?/span>
sender.send(smm);
//鎻愮ず淇℃伅
System.out.println("Send Ok!!");
}
}
]]>package com;
public class MyClass
{
public void foo(int age, String name)
{
System.out.println("Inside foo(int,String)");
}
public static void main(String[] args)
{
MyClass myClass = new MyClass();
myClass.foo(1, "zdw");
}
}
package com;
public aspect HelloWorld
{
//鍒囧叆鐐?/span>
pointcut callPointcut() : call(void MyClass.foo(int,String));
//鍓嶇疆閫氱煡
before() : callPointcut()
{
System.out.println("Hello World");
System.out.println("In the advice attached to the call pointcut");
}
}
]]>
]]>
涓轟簡鐞嗚ВAOP濡備綍鍋氬埌榪欑偣錛岃冭檻涓涓嬭鏃ュ織鐨勫伐浣溿傛棩蹇楁湰韜笉澶彲鑳芥槸浣犲紑鍙戠殑涓葷▼搴忕殑涓昏浠誨姟銆傚鏋滆兘灝?#8220;涓嶅彲瑙佺殑”銆侀氱敤鐨勬棩蹇椾唬鐮佹敞鍏ヤ富紼嬪簭涓紝閭h澶氬ソ鍟娿侫OP鍙互甯姪浣犲仛鍒般?
Spring framework鏄緢鏈夊墠閫旂殑AOP鎶鏈備綔涓轟竴縐嶉潪渚電暐鎬х殑錛岃交鍨嬬殑AOP framework錛屼綘鏃犻渶浣跨敤棰勭紪璇戝櫒鎴栧叾浠栫殑鍏冩爣絳撅紝渚垮彲浠ュ湪Java紼嬪簭涓嬌鐢ㄥ畠銆傝繖鎰忓懗鐫寮鍙戝洟闃熼噷鍙渶涓浜鴻瀵逛粯AOP framework錛屽叾浠栦漢榪樻槸璞″線甯鎬竴鏍風紪紼嬨?
AOP鏄緢澶氱洿瑙夐毦浠ョ悊瑙g殑鏈鐨勬牴婧愩傚垢榪愮殑鏄紝浣犲彧瑕佺悊瑙d笁涓蹇碉紝灝卞彲浠ョ紪鍐橝OP妯″潡銆傝繖涓変釜姒傚康鏄細advice錛宲ointcut鍜?advisor銆俛dvice鏄綘鎯沖悜鍒殑紼嬪簭鍐呴儴涓嶅悓鐨勫湴鏂規敞鍏ョ殑浠g爜銆俻ointcut瀹氫箟浜嗛渶瑕佹敞鍏dvice鐨勪綅緗紝閫氬父鏄煇涓壒瀹氱殑綾葷殑涓涓?public鏂規硶銆俛dvisor鏄痯ointcut鍜宎dvice鐨勮閰嶅櫒錛屾槸灝哸dvice娉ㄥ叆涓葷▼搴忎腑棰勫畾涔変綅緗殑浠g爜銆?
鏃㈢劧鎴戜滑鐭ラ亾浜嗛渶瑕佷嬌鐢╝dvisor鍚戜富瑕佷唬鐮佷腑娉ㄥ叆“涓嶅彲瑙佺殑”advice錛岃鎴戜滑瀹炵幇涓涓猄pring AOP鐨勪緥瀛愩傚湪榪欎釜渚嬪瓙涓紝鎴戜滑灝嗗疄鐜頒竴涓猙efore advice錛岃繖鎰忓懗鐫advice鐨勪唬鐮佸湪琚皟鐢ㄧ殑public鏂規硶寮濮嬪墠琚墽琛屻備互涓嬫槸榪欎釜before advice鐨勫疄鐜頒唬鐮侊細
package com.company.springaop.test;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class TestBeforeAdvice implements MethodBeforeAdvice {
public void before(Method m, Object[] args, Object target)
throws Throwable {
System.out.println("Hello world! (by "
+ this.getClass().getName()
+ ")");
}
}
鎺ュ彛MethodBeforeAdvice鍙湁涓涓柟娉昩efore闇瑕佸疄鐜幫紝瀹冨畾涔変簡advice鐨勫疄鐜般俠efore鏂規硶鍏辯敤涓変釜鍙傛暟錛屽畠浠彁渚涗簡鐩稿綋涓板瘜鐨勪俊鎭傚弬鏁癕ethod m鏄痑dvice寮濮嬪悗鎵ц鐨勬柟娉曘傛柟娉曞悕縐板彲浠ョ敤浣滃垽鏂槸鍚︽墽琛屼唬鐮佺殑鏉′歡銆侽bject[] args鏄紶緇欒璋冪敤鐨刾ublic鏂規硶鐨勫弬鏁版暟緇勩傚綋闇瑕佽鏃ュ織鏃訛紝鍙傛暟args鍜岃鎵ц鏂規硶鐨勫悕縐幫紝閮芥槸闈炲父鏈夌敤鐨勪俊鎭備綘涔熷彲浠ユ敼鍙樹紶緇檓鐨勫弬鏁幫紝浣嗚灝忓績浣跨敤榪欎釜鍔熻兘錛涚紪鍐欐渶鍒濅富紼嬪簭鐨勭▼搴忓憳騫朵笉鐭ラ亾涓葷▼搴忓彲鑳戒細鍜屼紶鍏ュ弬鏁扮殑鍙戠敓鍐茬獊銆侽bject target鏄墽琛屾柟娉昺瀵硅薄鐨勫紩鐢ㄣ?
鍦ㄤ笅闈㈢殑BeanImpl綾諱腑錛屾瘡涓猵ublic鏂規硶璋冪敤鍓嶏紝閮戒細鎵цadvice錛?
package com.company.springaop.test;
public class BeanImpl implements Bean {
public void theMethod() {
System.out.println(this.getClass().getName()
+ "." + new Exception().getStackTrace()[0].getMethodName()
+ "()"
+ " says HELLO!");
}
}
綾籅eanImpl瀹炵幇浜嗕笅闈㈢殑鎺ュ彛Bean錛?
package com.company.springaop.test;
public interface Bean {
public void theMethod();
}
铏界劧涓嶆槸蹇呴』浣跨敤鎺ュ彛錛屼絾闈㈠悜鎺ュ彛鑰屼笉鏄潰鍚戝疄鐜扮紪紼嬫槸鑹ソ鐨勭紪紼嬪疄璺碉紝Spring涔熼紦鍔辮繖鏍峰仛銆?
pointcut鍜宎dvice閫氳繃閰嶇疆鏂囦歡鏉ュ疄鐜幫紝鍥犳錛屾帴涓嬫潵浣犲彧闇緙栧啓涓繪柟娉曠殑Java浠g爜錛?
package com.company.springaop.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//Read the configuration file
ApplicationContext ctx
= new FileSystemXmlApplicationContext("springconfig.xml");
//Instantiate an object
Bean x = (Bean) ctx.getBean("bean");
//Execute the public method of the bean (the test)
x.theMethod();
}
}
鎴戜滑浠庤鍏ュ拰澶勭悊閰嶇疆鏂囦歡寮濮嬶紝鎺ヤ笅鏉ラ┈涓婅鍒涘緩瀹冦傝繖涓厤緗枃浠跺皢浣滀負綺樺悎紼嬪簭涓嶅悓閮ㄥ垎鐨?#8220;鑳舵按”銆傝鍏ュ拰澶勭悊閰嶇疆鏂囦歡鍚庯紝鎴戜滑浼氬緱鍒頒竴涓垱寤哄伐鍘俢tx銆備換浣曚竴涓猄pring綆$悊鐨勫璞¢兘蹇呴』閫氳繃榪欎釜宸ュ巶鏉ュ垱寤恒傚璞¢氳繃宸ュ巶鍒涘緩鍚庝究鍙甯鎬嬌鐢ㄣ?
浠呬粎鐢ㄩ厤緗枃浠朵究鍙妸紼嬪簭鐨勬瘡涓閮ㄥ垎緇勮璧鋒潵銆?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--CONFIG-->
<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.company.springaop.test.Bean</value>
</property>
<property name="target">
<ref local="beanTarget"/>
</property>
<property name="interceptorNames">
<list>
<value>theAdvisor</value>
</list>
</property>
</bean>
<!--CLASS-->
<bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/>
<!--ADVISOR-->
<!--Note: An advisor assembles pointcut and advice-->
<bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="theBeforeAdvice"/>
</property>
<property name="pattern">
<value>com\.company\.springaop\.test\.Bean\.theMethod</value>
</property>
</bean>
<!--ADVICE-->
<bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/>
</beans>
鍥涗釜bean瀹氫箟鐨勬搴忓茍涓嶉噸瑕併傛垜浠幇鍦ㄦ湁浜嗕竴涓猘dvice錛屼竴涓寘鍚簡姝e垯琛ㄨ揪寮弍ointcut鐨刟dvisor錛屼竴涓富紼嬪簭綾誨拰涓涓厤緗ソ鐨勬帴鍙o紝閫氳繃宸ュ巶ctx錛岃繖涓帴鍙h繑鍥炶嚜宸辨湰韜疄鐜扮殑涓涓紩鐢ㄣ?
BeanImpl鍜孴estBeforeAdvice閮芥槸鐩存帴閰嶇疆銆傛垜浠敤涓涓敮涓鐨処D鍒涘緩涓涓猙ean鍏冪礌錛屽茍鎸囧畾浜嗕竴涓疄鐜扮被銆傝繖灝辨槸鍏ㄩ儴鐨勫伐浣溿?
advisor閫氳繃Spring framework鎻愪緵鐨勪竴涓猂egexMethodPointcutAdvisor綾繪潵瀹炵幇銆傛垜浠敤advisor鐨勪竴涓睘鎬ф潵鎸囧畾瀹冩墍闇鐨?advice-bean銆傜浜屼釜灞炴у垯鐢ㄦ鍒欒〃杈懼紡瀹氫箟浜唒ointcut錛岀‘淇濊壇濂界殑鎬ц兘鍜屾槗璇繪с?
鏈鍚庨厤緗殑鏄痓ean錛屽畠鍙互閫氳繃涓涓伐鍘傛潵鍒涘緩銆俠ean鐨勫畾涔夌湅璧鋒潵姣斿疄闄呬笂瑕佸鏉傘俠ean鏄疨roxyFactoryBean鐨勪竴涓疄鐜幫紝瀹冩槸Spring framework鐨勪竴閮ㄥ垎銆傝繖涓猙ean鐨勮涓洪氳繃涓涓嬬殑涓変釜灞炴ф潵瀹氫箟錛?
Spring宸ュ叿
铏界劧浣犲彲浠ユ墜宸ヤ慨鏀笰nt鏋勫緩鑴氭湰錛屼絾浣跨敤SpringUI錛堣瘧娉細SpringUI鐜板湪鏄疭pring framework鐨勪竴閮ㄥ垎錛屽茍鏀瑰悕涓簊pring-ide錛夛紝浣跨敤Spring AOP鍙樺緱寰堢畝鍗曪紝鍙鐐圭偣榧犳爣鍗沖彲銆備綘鍙互鎶奡pringUI瀹夎鎴怑clipse鐨勪竴涓猵lug-in銆傜劧鍚庯紝浣犲彧闇鍦ㄤ綘鐨刾roject涓婂彸鍑婚紶鏍囷紝騫墮夋嫨“add Spring Project Nature”銆傚湪project灞炴т腑錛屼綘鍙互鍦?#8220;Spring Project”涓嬫坊鍔燬pring閰嶇疆鏂囦歡銆傚湪緙栬瘧鍓嶆妸涓嬮潰鐨勭被搴撳姞鍏roject錛歛opalliance.jar錛宑ommons- logging.jar錛宩akarta-oro-2.0.7.jar鍜宻pring.jar銆傝繍琛岀▼搴忔椂浣犱細鐪嬪埌涓嬮潰鐨勪俊鎭細
(logging information)
Hello world! (by com.company.springaop.test.TestBeforeAdvice)
com.company.springaop.test.BeanImpl.theMethod() says HELLO!
浼樼偣鍜岀己鐐?/span>
Spring姣旇搗鍏朵粬鐨刦ramework鏇存湁浼樺娍錛屽洜涓洪櫎浜咥OP浠ュ錛屽畠鎻愪緵浜嗘洿澶氬埆鐨勫姛鑳姐備綔涓轟竴涓交鍨媐ramework錛屽畠鍦↗2EE 涓嶅悓鐨勯儴鍒嗛兘鍙互鍙戞尌浣滅敤銆傚洜姝わ紝鍗充嬌涓嶆兂浣跨敤Spring AOP錛屼綘鍙兘榪樻槸鎯充嬌鐢⊿pring銆傚彟涓涓紭鐐規槸錛孲pring騫朵笉瑕佹眰寮鍙戝洟闃熸墍鏈夌殑浜哄憳閮戒細鐢ㄥ畠銆傚涔燬pring搴旇浠嶴pring reference鐨勭涓欏靛紑濮嬨傝浜嗘湰鏂囧悗錛屼綘搴旇鍙互鏇村ソ鍦扮悊瑙pring reference浜嗐係pring鍞竴鐨勭己鐐規槸緙轟箯鏇村鐨勬枃。锛屼絾瀹冪殑mailing list鏄釜寰堝ソ鐨勮ˉ鍏咃紝鑰屼笖浼氫笉鏂湴鍑虹幇鏇村鐨勬枃。銆?/span>
]]>
銆銆鍦↗2EE鐨勬暣涓彂灞曞巻紼嬩腑錛岀幇鍦ㄦ鏄竴涓潪甯告椂鍒匯備粠寰堝鏂歸潰鏉ヨ錛孞2EE閮芥槸涓涓紵澶х殑鎴愬姛錛氬畠鎴愬姛鍦板湪浠庡墠娌℃湁鏍囧噯鐨勫湴鏂瑰緩绔嬩簡鏍囧噯錛涘ぇ澶ф彁鍗囦簡浼佷笟綰ц蔣浠剁殑寮鏀劇▼搴︼紝騫朵笖寰楀埌浜嗘暣涓涓氬拰寮鍙戣呯殑騫挎硾璁ゅ彲銆傜劧鑰岋紝J2EE鍦ㄤ竴浜涙柟闈㈠凡緇忓紑濮嬫崏瑗熻鑲樸侸2EE搴旂敤寮鍙戠殑鎴愭湰閫氬父寰堥珮銆侸2EE搴旂敤欏圭洰鑷沖皯鍜屼粠鍓嶇殑闈濲2EE欏圭洰涓鏍峰鏄撳け璐モ斺斿鏋滀笉鏄洿瀹規槗澶辮觸鐨勮瘽銆傝繖鏍風殑澶辮觸鐜囬珮寰楄浜洪毦浠ユ帴鍙椼傚湪榪欐牱鐨勫け璐ョ巼涔嬩笅錛岃蔣浠跺紑鍙戝嚑涔庡彉鎴愪簡紕拌繍姘斻傝屽湪J2EE閬亣澶辮觸鐨勫満鏅腑錛孍JB閫氬父閮芥壆婕旂潃閲嶈鐨勮鑹層傚洜姝わ紝J2EE紺劇兢涓嶆柇鍦板悜鐫鏇寸畝鍗曠殑瑙e喅鏂規銆佹洿灝戜嬌鐢‥JB鐨勬柟鍚戝彂灞?sup>[1]銆傜劧鑰岋紝姣忎釜搴旂敤紼嬪簭閮介渶瑕佷竴浜涘熀紜璁炬柦錛屾嫆緇濅嬌鐢‥JB騫朵笉鎰忓懗鐫鎷掔粷EJB鎵閲囩敤鐨勫熀紜璁炬柦瑙e喅鏂規銆傞偅涔堬紝濡備綍鍒╃敤鐜版湁鐨勬鏋舵潵鎻愪緵榪欎簺鍩虹璁炬柦鏈嶅姟鍛紝浼撮殢鐫榪欎釜闂鐨勬彁鍑猴紝涓涓交閲忕駭鐨凧2EE瑙e喅鏂規鍑虹幇浜嗭紝榪欏氨鏄疭pring Framework銆?br />
銆銆Spring鏄負綆鍖栦紒涓氱駭緋葷粺寮鍙戣岃癁鐢熺殑錛孲pring妗嗘灦涓篔2EE搴旂敤甯歌鐨勯棶棰樻彁渚涗簡綆鍗曘佹湁鏁堢殑瑙e喅鏂規錛屼嬌鐢⊿pring錛屼綘鍙互鐢ㄧ畝鍗曠殑POJO(Plain Old Java Object)鏉ュ疄鐜伴偅浜涗互鍓嶅彧鏈塃JB鎵嶈兘瀹炵幇鐨勫姛鑳姐傝繖鏍蜂笉鍙槸鑳界畝鍖栨湇鍔″櫒绔紑鍙戯紝浠諱綍Java緋葷粺寮鍙戦兘鑳戒粠Spring鐨勭畝鍗曘佸彲嫻嬭瘯鍜屾澗鑰﹀悎鐗瑰緛涓彈鐩娿傚彲浠ョ畝鍗曠殑璇達紝Spring鏄竴涓交閲忕駭鐨勫弽鍚戞帶鍒訛紙IoC錛夊拰闈㈠悜鍒囬潰緙栫▼錛圓OP錛夊鍣ㄦ鏋?sup>[3]銆係pring IoC錛屽熷姪浜庝緷璧栨敞鍏ヨ璁℃ā寮忥紝浣垮緱寮鍙戣呬笉鐢ㄧ悊浼氬璞¤嚜韜殑鐢熷懡鍛ㄦ湡鍙婂叾鍏崇郴錛岃屼笖鑳藉鏀瑰杽寮鍙戣呭J2EE妯″紡鐨勪嬌鐢紱Spring AOP錛屽熷姪浜嶴pring瀹炵幇鐨勬嫤鎴櫒錛屽紑鍙戣呰兘澶熷疄鐜頒互澹版槑鐨勬柟寮忎嬌鐢ㄤ紒涓氱駭鏈嶅姟錛屾瘮濡傚畨鍏ㄦф湇鍔°佷簨鍔℃湇鍔$瓑銆係pring IoC鍜?Spring ; AOP緇勫悎錛屼竴璧峰艦鎴愪簡Spring錛岃繖鏍蜂竴涓湁鏈烘暣浣擄紝浣垮緱鏋勫緩杞婚噺綰х殑J2EE鏋舵瀯鎴愪負鍙兘錛岃屼笖浜嬪疄璇佹槑錛岄潪甯告湁鏁堛傛病鏈塖pring IoC鐨凷pring AOP鏄笉瀹屽杽鐨勶紝娌℃湁Spring AOP鐨凷pring IoC鏄笉鍋ュ.鐨勩傛湰鏂囨槸浠pring鏋舵瀯鐨勬垚鍔熺殑瀹為檯鍟嗗姟緋葷粺欏圭洰涓鴻儗鏅紝闃愯堪浜嗗弽鍚戞帶鍒跺師鐞嗗拰闈㈠悜鍒囬潰鐨勭紪紼嬫妧鏈湪Spring妗嗘灦涓殑搴旂敤錛屽悓鏃舵娊鍙栭傞噺浠g爜紺烘剰鍏蜂綋搴旂敤錛屽茍鍜屼紶緇熷紑鍙戞ā寮忚繘琛屽姣旓紝灞曠ず浜哠pring framework鐨勭畝鍗曪紝楂樻晥錛屽彲緇存姢絳変紭鐐廣?br />
銆銆1銆丼pring IoC 1.1 鍙嶅悜鎺у埗鍘熺悊
銆銆鍙嶅悜鎺у埗鏄疭pring妗嗘灦鐨勬牳蹇冦備絾鏄紝鍙嶅悜鎺у埗鏄粈涔堟剰鎬濓紵鍒板簳鎺у埗鐨勪粈涔堟柟闈㈣鍙嶅悜浜嗗憿錛?004騫寸編鍥戒笓瀹禡artin Fowler鍙戣〃浜嗕竴綃囪鏂囥奍nversion of Control Containers and the Dependency Injection pattern銆嬮槓榪頒簡榪欎釜闂錛屼粬鎬葷粨璇存槸鑾峰緱渚濊禆瀵硅薄鐨勬柟寮忓弽鍚戜簡錛屾牴鎹繖涓惎紺猴紝浠栬繕涓哄弽鍚戞帶鍒舵彁鍑轟簡涓涓洿璐村垏鐨勫悕瀛楋細Dependency Injection(DI 渚濊禆娉ㄥ叆)銆?br />
銆銆閫氬父錛屽簲鐢ㄤ唬鐮侀渶瑕佸憡鐭ュ鍣ㄦ垨妗嗘灦,璁╁畠浠壘鍒拌嚜韜墍闇瑕佺殑綾?鐒跺悗鍐嶇敱搴旂敤浠g爜鍒涘緩寰呬嬌鐢ㄧ殑瀵硅薄瀹炰緥銆傚洜姝わ紝搴旂敤浠g爜鍦ㄤ嬌鐢ㄥ疄渚嬩箣鍓嶏紝闇瑕佸垱寤哄璞″疄渚嬨傜劧鑰岋紝IoC妯″紡涓?鍒涘緩瀵硅薄瀹炰緥鐨勪換鍔′氦緇橧oC瀹瑰櫒鎴栨鏋?瀹炵幇浜咺oC璁捐妯″紡鐨勬鏋朵篃琚О涓篒oC瀹瑰櫒)錛屼嬌寰楀簲鐢ㄤ唬鐮佸彧闇瑕佺洿鎺ヤ嬌鐢ㄥ疄渚嬶紝榪欏氨鏄疘oC銆傜浉瀵笽oC 鑰岃█錛?#8220;渚濊禆娉ㄥ叆”鐨勭‘鏇村姞鍑嗙‘鐨勬弿榪頒簡榪欑璁捐鐞嗗康銆傛墍璋撲緷璧栨敞鍏ワ紝鍗崇粍浠朵箣闂寸殑渚濊禆鍏崇郴鐢卞鍣ㄥ湪榪愯鏈熷喅瀹氾紝褰㈣薄鐨勬潵璇達紝鍗崇敱瀹瑰櫒鍔ㄦ佺殑灝嗘煇縐嶄緷璧栧叧緋繪敞鍏ュ埌緇勪歡涔嬩腑銆?br />
銆銆1.2 IoC鍦⊿pring涓殑瀹炵幇
銆銆浠諱綍閲嶈鐨勭郴緇熼兘闇瑕佽嚦灝戜袱涓浉浜掑悎浣滅殑綾繪潵瀹屾垚涓氬姟閫昏緫銆傞氬父錛屾瘡涓璞¢兘瑕佽嚜宸辮礋璐e緱鍒板畠鐨勫悎浣滐紙渚濊禆錛夊璞°備綘浼氬彂鐜幫紝榪欐牱浼氬鑷翠唬鐮佽﹀悎搴﹂珮鑰屼笖闅句簬嫻嬭瘯銆備嬌鐢↖oC錛屽璞$殑渚濊禆閮芥槸鍦ㄥ璞″垱寤烘椂鐢辮礋璐e崗璋冪郴緇熶腑鍚勪釜瀵硅薄鐨勫閮ㄥ疄浣撴彁渚涚殑錛岃繖鏍蜂嬌杞歡緇勪歡鏉炬暎榪炴帴鎴愪負鍙兘銆備笅闈㈢ず鎰忎簡Spring IoC 搴旂敤錛屾楠ゅ涓嬶細
銆銆錛?錛夊畾涔堿ction鎺ュ彛錛屽茍涓哄叾瀹氫箟涓涓猠xecute鏂規硶錛屼互瀹屾垚鐩爣閫昏緫銆傚騫村墠錛孏oF鍦ㄣ奃esign Pattern錛欵lements of Reusable Object-Oriented Software銆嬩竴涔︿腑鎻愬嚭“Programming to an Interface錛宯ot an implementation”鐨勫師鍒欙紝榪欓噷棣栧厛灝嗕笟鍔″璞℃娊璞℃垚鎺ュ彛錛屾鏄負浜嗗疄鏂借繖涓師鍒欍?br />
銆銆錛?錛夌被UpperAction瀹炵幇Action鎺ュ彛錛屽湪姝ょ被涓紝瀹氫箟涓涓猄tring鍨嬬殑鍩焟essage錛屽茍鎻愪緵鐩稿簲鐨剆etter鍜実etter鏂規硶錛屽疄鐜扮殑execute鏂規硶濡備笅錛?br />
public String execute (String str) {
銆return (getMessage () + str).toUpperCase () ;
}
銆銆錛?錛夌紪鍐橲pring閰嶇疆鏂囦歡錛坆ean.xml錛?br />
錛渂eans錛?br />
錛渂ean id="TheAction" class="net.chen.spring.qs.UpperAction"錛?br />
錛減roperty name="message"錛?br />
錛渧alue錛濰eLLo錛?/span>/value錛?br />
錛?/span>/property錛?br />
錛?/span>/bean錛?br />
錛?/span>/beans錛?/span>
銆銆錛?錛夋祴璇曚唬鐮?br />
public void testQuickStart () {
銆ApplicationContext ctx=new
銆FileSystemXmlApplicationContext ("bean.xml");
銆Action a= (Action) ctx.getBean ("TheAction");
銆System.out.println (a. execute ("Rod Johnson"));
}
銆銆涓婇潰鐨勬祴璇曚唬鐮佷腑錛屾垜浠牴鎹?bean.xml"鍒涘緩浜嗕竴涓狝pplicationContext瀹炰緥錛屽茍浠庢瀹炰緥涓幏鍙栨垜浠墍闇鐨凙ction瀹炵幇錛岃繍琛屾祴璇曚唬鐮侊紝鎴戜滑鐪嬪埌鎺у埗鍙拌緭鍑猴細
……
HELLO ROD JOHNSON
銆銆浠旂粏瑙傚療涓涓嬩笂闈㈢殑浠g爜錛屽彲浠ョ湅鍒幫細
銆銆錛?錛夋垜浠殑緇勪歡騫朵笉闇瑕佸疄鐜版鏋舵寚瀹氱殑鎺ュ彛錛屽洜姝ゅ彲浠ヨ交鏉劇殑灝嗙粍浠朵粠Spring涓劚紱伙紝鐢氳嚦涓嶉渶瑕佷換浣曚慨鏀癸紝榪欏湪鍩轟簬EJB妗嗘灦瀹炵幇鐨勫簲鐢ㄤ腑鏄毦浠ユ兂璞$殑銆?br />
銆銆錛?錛夌粍浠墮棿鐨勪緷璧栧叧緋誨噺灝戯紝鏋佸ぇ鏀瑰杽浜嗕唬鐮佺殑鍙噸鐢ㄦс係pring鐨勪緷璧栨敞鍏ユ満鍒訛紝鍙互鍦ㄨ繍琛屾湡涓虹粍浠墮厤緗墍闇璧勬簮錛岃屾棤闇鍦ㄧ紪鍐欑粍浠朵唬鐮佹椂灝卞姞浠ユ寚瀹氾紝浠庤屽湪鐩稿綋紼嬪害涓婇檷浣庝簡緇勪歡涔嬮棿鐨勮﹀悎銆?br />
銆銆Spring緇欐垜浠甫鏉ヤ簡濡傛榪欒埇鐨勫ソ澶勶紝閭d箞錛屽弽榪囨潵錛岃鎴戜滑璇曟兂涓涓嬶紝濡傛灉涓嶄嬌鐢⊿pring妗嗘灦錛屽洖鍒版垜浠紶緇熺殑緙栫爜妯″紡錛屾儏鍐典細鏄庢牱鍛紵
銆銆棣栧厛錛屾垜浠繀欏葷紪鍐欎竴涓厤緗枃浠惰鍙栫被錛屼互瀹炵幇Message灞炴х殑鍙厤緗寲銆?br />
銆銆鍏舵錛屽緱鏈変竴涓狥actory妯″紡鐨勫疄鐜幫紝騫剁粨鍚堥厤緗枃浠剁殑璇誨啓瀹屾垚Action鐨勫姩鎬佸姞杞姐備簬鏄紝鎴戜滑瀹炵幇浜嗕竴涓狝ctionFactory鏉ュ疄鐜拌繖涓姛鑳斤細
public class ActionFactory {
銆public static Action getAction (String actionName) {Properties pro = new Properties ();
銆try {
銆銆pro.load (new FileInputStream ("config.properties"));
銆銆String actionImplName =(String)pro.get(actionName);
銆銆String actionMessage =(String) pro.get (actionName+"_msg");
銆銆Object obj =Class.forName (actionImplName).newInstance ();
銆銆BeanUtils.setProperty(obj,"message",actionMessage);
銆銆return (Action) obj;
銆} catch (FileNotFoundException e) {
銆銆……
銆}
}
銆銆閰嶇疆鏂囦歡鍒欓噰鐢╬roperties鏂囦歡褰㈠紡濡備笅鎵紺猴細
TheAction=net.chen.spring.qs.UpperAction
TheAction_msg=HeLLo
銆銆嫻嬭瘯浠g爜涔熶綔鐩稿簲淇敼銆傜幇鍦ㄤ笉璁哄疄鐜扮殑濂藉潖錛屾諱箣閫氳繃涓婇潰鏂板鐨勫琛屼唬鐮侊紝緇堜簬瀹炵幇浜嗙被浼肩殑鍔熻兘銆傚鏋滅幇鍦ㄦ湁浜嗕竴涓柊鐨勯渶姹傦紝榪欐牱榪欎釜ActionFactory姣忔閮芥柊寤轟竴涓被鐨勫疄渚嬶紝鏄劇劧榪欏緋葷粺鎬ц兘涓嶅埄錛岃冭檻鍒版垜浠殑涓や釜Action閮芥槸綰跨▼瀹夊叏鐨勶紝淇敼涓涓婣ctionFactory錛屼繚鎸佺郴緇熶腑鍙湁涓涓狝ction瀹炰緥渚涘叾瀹冪嚎紼嬭皟鐢ㄣ傚彟澶朅ction瀵硅薄鍒涘緩鍚庯紝闇瑕佸仛涓浜涘垵濮嬪寲宸ヤ綔銆備慨鏀逛竴涓婣ctionFactory錛屼嬌鍏跺湪鍒涘緩Action瀹炰緥涔嬪悗錛岄殢鍗沖氨璋冪敤Action.init鏂規硶鎵ц鍒濆鍖栥侫ction鐨勫鐞嗚繖鏍峰氨宸笉澶氫簡銆備笅闈㈡垜浠潵鐪嬬湅鍙﹀涓涓狥actory
銆銆……
銆銆寰寰榪欎簺緋葷粺寮鍙戜腑鏈甯歌鐨勯渶姹傦紝浼氬鑷存垜浠殑浠g爜榪呴熻啫鑳錛岃孲pring IoC鐨勫嚭鐜幫紝鍒欏ぇ澶х紦瑙d簡榪欐牱鐨勭獦澧冦傞氳繃浠ヤ笂瀹炰緥錛屽彲浠ョ湅鍑猴紝Spring IoC涓烘垜浠彁渚涗簡濡備笅鍑犳柟闈㈢殑浼樺娍錛?br />
銆銆錛?錛夊簲鐢ㄧ粍浠朵笉闇瑕佸湪榪愯鏃跺鎵懼叾鍗忎綔鑰咃紝鍥犳鏇存槗浜庡紑鍙戝拰緙栧啓搴旂敤錛?br />
銆銆錛?錛夌敱浜庡熷姪浜嶪oC瀹瑰櫒綆$悊緇勪歡鐨勪緷璧栧叧緋伙紝浣垮緱搴旂敤鐨勫崟鍏冩祴璇曞拰闆嗘垚嫻嬭瘯鏇村埄浜庡睍寮錛?br />
銆銆錛?錛夐氬父錛屽湪鍊熷姪浜嶪oC瀹瑰櫒鍏崇郴涓氬姟瀵硅薄鐨勫墠鎻愪笅錛屽緢灝戦渶瑕佷嬌鐢ㄥ叿浣揑oC瀹瑰櫒鎻愪緵鐨凙PI錛岃繖浣垮緱闆嗘垚鐜版湁鐨勯仐鐣欏簲鐢ㄦ垚涓哄彲鑳姐?br />
銆銆鍥犳錛岄氳繃浣跨敤IoC鑳藉闄嶄綆緇勪歡涔嬮棿鐨勮﹀悎搴︼紝鏈緇堬紝鑳藉鎻愰珮綾葷殑閲嶇敤鎬э紝鍒╀簬嫻嬭瘯錛岃屼笖鏇村埄浜庢暣涓駭鍝佹垨緋葷粺闆嗘垚鍜岄厤緗?br />
]]>
1.絎竴縐嶏紝浣跨敤鏁扮粍
浠g爜
2.絎簩縐嶏紝鍙敤閫氶厤絎?/span>
浠g爜
//浣嗘縐嶆柟娉曞彧瀵規枃浠剁郴緇熶腑鐨剎ml鏂囦歡鏈夋晥錛岄拡瀵筳ar鍖呬腑鐨勬棤鏁?
3.絎笁縐嶏紝寮曞叆
浠g爜
//鍦╝1.xml涓?
鎵цresource璺緞涓虹浉瀵筧1.xml鐨勮礬寰?
闇鏄庣‘鐨勫嚑涓蹇?
1銆侀氱煡(Advice)錛氱敤浜庡憡鐭ョ郴緇熷皢鏈夊摢浜涙柊鐨勮涓恒?br />
2銆佸垏鍏ョ偣(Pointcut):瀹氫箟浜嗛氱煡搴旇鍦ㄥ簲鐢ㄥ埌閭d簺榪炴帴鐐?br />
3銆佺洰鏍囧璞?/span>(Target)錛氳閫氱煡鐨勫璞°?br />
4銆?/span> 浠g悊(Proxy)錛氬皢閫氱煡搴旂敤鍒扮洰鏍囧璞″悗鍒涘緩鐨勫璞°?/span>
Spring鏈変袱縐嶄唬鐞嗗垱寤烘柟寮忥細
1.濡傛灉鐩爣瀵硅薄瀹炵幇浜嗕竴涓垨澶氫釜鎺ュ彛鏆撮湶鐨勬柟娉曪紝Spring灝嗕嬌鐢?/span>JDK鐨?/span>java.lang.reflect.Proxy鍒涘緩浠g悊銆傝繖涓被璁?/span>Spring鍔ㄦ佷駭鐢熶竴涓柊鐨勭被錛屽畠瀹炵幇浜嗘墍闇鐨勬帴鍙o紝緇囧叆浜嗛氱煡錛屽茍涓斾唬鐞嗙洰鏍囩殑鎵鏈夎姹傘傦紙榪欑瘒涓昏浠嬬粛榪欎釜鏂瑰紡錛?/span>
2.濡傛灉鐩爣瀵硅薄娌℃湁瀹炵幇浠諱綍鎺ュ彛錛?span style="font-family: 'Courier New'">Spring浣跨敤CGLIB搴撶敓鎴愮洰鏍囧璞$殑瀛愮被銆傚湪鍒涘緩榪欎釜瀛愮被鐨勬椂鍊欙紝Spring灝嗛氱煡緇囧叆錛屽茍涓斿皢瀵圭洰鏍囧璞$殑璋冪敤濮旀墭緇欒繖涓瓙綾匯?/span>
涓嬮潰浠ヤ竴涓疄渚嬭鏄?span style="font-family: 'Courier New'">Spring AOP鐨勫熀鏈紑鍙戞柟娉曪細
涓錛?/span>鍒涘緩閫氱煡
Spring榪炴帴鐐規ā鍨嬫槸寤虹珛鍦ㄦ柟娉曟嫤鎴笂錛岃繖鎰忓懗鐫浣犵紪鍐欑殑Spring閫氱煡浼氬湪鏂規硶璋冪敤鍛ㄥ洿鐨勫悇涓湴鏂圭粐鍏ョ郴緇熶腑銆?/span>
鍥?/span>1
TestAopServiceAdvice瀹炵幇浜嗘帴鍙?/span>MethodBeforeAdvice(鍓嶇疆閫氱煡)錛屽茍瀹炵幇瀹冪殑鎯熶竴鐨勬柟娉?/span>before錛岃繖涓被灝卞彲浠ュ湪璋冪敤鐩爣瀵硅薄鍓嶈璋冪敤銆傚悓鏍風殑榪樻湁AfterReturningAdvice(鍚庣疆閫氱煡)錛?/span>MethodInterceptor(鐜粫閫氱煡)錛屽紓甯擱氱煡(ThrowsAdvice)錛屽紩鍏ラ氱煡絳夈?/span>
鍦ㄨ繖涓柟娉曚腑鎴戜滑杈撳嚭浜嗕竴涓瓧絎︿覆TestAopServiceAdvice錛岀敤浜庨獙璇佽繖涓柟娉曟槸鍚﹀湪鐩爣瀵硅薄鍓嶈皟鐢ㄤ簡銆?/span>
娉ㄦ剰錛?/span>鎴戜滑鏃犳硶鏀瑰彉before鏂規硶涓殑鍙傛暟args鍜?/span>target涓殑鍊鹼紝args涓瓨鐨勬槸鍘熸潵瑕佷紶鍏ョ洰鏍囧璞$殑鍙橀噺錛?/span>target鍗蟲寚鐩爣瀵硅薄銆?/span>
浜岋紟閰嶇疆Spring XML閰嶇疆鏂囦歡
瑕佸湪Spring涓疄鐜?/span>AOP錛屼竴鑸儏鍐典笅闇瑕侀厤緗?/span>4涓?/span>bean錛?/span>
1錛?/span>鐩爣瀵硅薄錛?/span>target錛?/span>
2錛?/span>閫氱煡(advice)
3錛?/span>鍒囧叆鐐?/span>(pointcut)
4錛?/span>浠g悊(proxy)
鍥?/span>2
鍒囧叆鐐瑰張鍒嗕負闈欐佸垏鍏ョ偣鍜屽姩鎬佸垏鍏ョ偣
1銆?/span> 闈欐佸垏鍏ョ偣鐨勬剰鎬濇槸閫氱煡鎬繪槸琚墽琛?/span>,涔熸槸鏈甯哥敤鐨勪竴縐嶅垏鍏ョ偣銆?br />
2銆?/span> 鍔ㄦ佸垏鍏ョ偣鏍規嵁榪愯鏃舵柟娉曠殑鍙傛暟鍊煎喅瀹氶氱煡鏄惁琚墽琛屻?/span>
鍦ㄥ浘2涓紝瀹氫箟浜嗕嬌鐢ㄤ簡涓涓?/span>Spring鎻愪緵鐨勯潤鎬佸垏鍏ョ偣
NameMatchMethodPointAdvisor錛屽畠淇濊瘉浜嗗綋琚皟鐢ㄧ殑鏂規硶鐨勫悕瀛椾笌緇欏嚭鐨勬槧灝勫悕瀛楃浉鍖歸厤鐨勬椂鍊欙紝榪欎釜鍒囧叆鐐規墠鍖歸厤銆?/span>
Spring鎻愪緵鐨勫彟涓涓潤鎬佸垏鍏ョ偣涓?/span>RegexpMethodPointcutAdvisor錛岃浣犲彲浠ュ埄鐢ㄦ鍒欒〃杈懼紡鏉ュ畾涔夊垏鍏ョ偣.
浣跨敤ProxyBeanFactory鍙互鍒涘緩涓涓閫氱煡鐨勭被錛屽嵆浠g悊瀵硅薄銆傚畠鐨勬渶甯哥敤鐨?/span>浜?/span>涓帶鍒惰涓虹殑灞炴ф槸:
1銆?/span>proxyInterfaces錛氫唬鐞嗗簲璇ュ疄鐜扮殑鎺ュ彛鍒楄〃
2銆?/span>interceptorNames錛氶渶瑕佸簲鐢ㄥ埌鐩爣瀵硅薄涓婄殑閫氱煡Bean鐨勫悕瀛椼傚彲浠ユ槸鎷︽埅鍣ㄣ?/span>Advisor鎴栧叾浠栭氱煡綾葷殑鍚嶅瓧銆?/span>
娉細鍦ㄧ敤瀹瑰櫒鐨?/span>getBean鏂規硶鏃訛紝搴旇鏄?/span>getBean(浠g悊綾葷殑鍚嶅瓧)錛岃屼笉鏄?/span>getBean(鐩爣瀵硅薄鐨勫悕瀛?/span>)錛屽惁鍒?/span>AOP鏃犳硶宸ヤ綔銆?/span>
getBean()
鏂規硶錛夐兘浼氫駭鐢熶竴涓柊鐨刡ean瀹炰緥錛岀浉褰撲竴涓猲ew鐨勬搷浣滐紝瀵逛簬prototype浣滅敤鍩熺殑bean錛屾湁涓鐐歸潪甯擱噸瑕侊紝閭e氨鏄疭pring涓嶈兘瀵逛竴涓猵rototype bean鐨勬暣涓敓鍛藉懆鏈熻礋璐o紝瀹瑰櫒鍦ㄥ垵濮嬪寲銆侀厤緗佽楗版垨鑰呮槸瑁呴厤瀹屼竴涓?span>prototype瀹炰緥鍚庯紝灝嗗畠浜ょ粰瀹㈡埛绔紝闅忓悗灝卞璇rototype瀹炰緥涓嶉椈涓嶉棶浜嗐備笉綆′綍縐嶄綔鐢ㄥ煙錛屽鍣ㄩ兘浼氳皟鐢ㄦ墍鏈夊璞$殑鍒濆鍖栫敓鍛藉懆鏈熷洖璋冩柟娉曪紝鑰屽prototype鑰岃█錛屼換浣曢厤緗ソ鐨勬瀽鏋勭敓鍛藉懆鏈熷洖璋冩柟娉曢兘灝嗕笉浼氳璋冪敤銆傛竻闄rototype浣滅敤鍩熺殑瀵硅薄騫墮噴鏀句換浣昿rototype bean鎵鎸佹湁鐨勬槀璐佃祫婧愶紝閮芥槸瀹㈡埛绔唬鐮佺殑鑱岃矗銆傦紙璁㏒pring瀹瑰櫒閲婃斁琚玸ingleton浣滅敤鍩焍ean鍗犵敤璧勬簮鐨勪竴縐嶅彲琛屾柟寮忔槸錛岄氳繃浣跨敤bean鐨勫悗緗鐞嗗櫒錛岃澶勭悊鍣ㄦ寔鏈夎琚竻闄ょ殑bean鐨勫紩鐢ㄣ傦級