锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浣滆? 鍐頒簯
鏁寸悊:robbin
鍘熺悊錛氬埄鐢℉ibernate3鎻愪緵鐨凱ostLoadEventListener鍦╨oadHibernate瀹炰綋綾葷殑鏃跺欒Е鍙慞ostLoadEvent浜嬩歡錛岀紪鍐欎竴涓嚜瀹氫箟鐨勪簨浠剁洃鍚櫒錛屾敞鍏ヤ緷璧栫殑Spring Bean瀵硅薄
import org.hibernate.event.PostLoadEvent; import org.hibernate.event.PostLoadEventListener; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; public class SpringHibernateInjector implements PostLoadEventListener, BeanFactoryAware{ AutowireCapableBeanFactory beanFactory; public void onPostLoad(PostLoadEvent event) { Object hibernateObject = event.getEntity(); beanFactory.autowireBeanProperties(hibernateObject, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false); } public void setBeanFactory(BeanFactory factory) { beanFactory = (AutowireCapableBeanFactory) factory; } }
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="mappingResources"> <list> ...domains.hbm.xml here... </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9Dialect </prop> <prop key="hibernate.query.substitutions"> true 1, false 0 </prop> <prop key="hibernate.show_sql">false</prop> </props> </property> <property name="eventListeners"> <map> <entry key="post-load"> <!-- This hibernate interceptor allows us to use Spring to inject services into Hibernate managed domain objects --> <bean class="yourpackage.SpringHibernateInjector"/> </entry> </map> </property> </bean>
娉細(xì)姝ゆ柟娉曟潵鑷簬ThoughtWorks鐨?PerrynFowler
錛屼亢鍙槸鎽樻妱涓涓?/P>
![]() |
![]() ![]() |
| |
鎴戞槑鐧絩obbin浣犵殑鎰忔濓紝鎴戣鐨勬儏鍐靛氨鏄綉緇滀紶杈撳鑷寸殑15縐掋傛湰韜〉闈㈡墽琛岀殑鏃墮棿錛屾瘮濡俧reemarker娓叉煋涓涓嬫ā鏉匡紝榪欎釜閫熷害鏄潪甯稿揩鐨勶紝娌¢棶棰橈紝鍙槸鎴戠殑鐤戦棶灝卞湪浜庡鏋滅綉緇滀紶杈撶嫚鎱紝浼?xì)涓嶄細(xì)濯勫搷鍒版暟鎹簱杩炴帴銆? 鍋囪W(wǎng)ebWork+Hibernate+FreeMarker鏋舵瀯妯″瀷鏄繖鏍風(fēng)殑 Request | |---other filters... | |---OpenSessionInView Filter | |-----WebWork Controller | |---Action | |---FreeMarker Result(瀵箁esponse.getWriter()鍋歱rocess()鎿嶄綔) | | |---OpenSessionInView Filter | |---other filters... | Request 榪欓噷鏈変袱縐嶆儏鍐點? 涓鏄〉闈㈢紦鍐插尯瓚沖澶э紝瓚沖涓嬈℃у綰蟲墍鏈夌殑欏甸潰錛岃繖鏍鋒覆鏌撻〉闈㈠氨浼?xì)涓嬈℃ц繘鍏ョ紦鍐插尯錛岀劧鍚庤繑鍥炲埌OpenSessionInView Filter錛屽叧闂璖ession錛屾暟鎹簱榪炴帴榪斿洖姹犱腑錛屼竴鍒嘜K銆? 絎簩縐嶆儏鍐墊垜鏄噸鐐規(guī)兂璁ㄨ鐨勶紝涔熸槸鎴戠殑鐤戣檻鎵鍦ㄣ傞偅灝辨槸鍋囧榪欎釜欏甸潰姣旇緝澶э紝瓚呭嚭鍙婚〉闈㈢紦鍐插尯鐨勫ぇ灝忥紝閭d箞娓叉煋欏甸潰鏃訛紝灝辨嬁FreeMarker/Velocity榪欐牱鐨勬ā鏉胯璦鏉ヨ錛屽畠鎵цprocess/merge鏂規(guī)硶錛屽線servlet鐨剅esponse writer/outputStream閲岄潰鍐欎笢瑗匡紝鍐欑潃鍐欑潃錛屽彂鐜板啓涓嶅姩鍙伙紝鏄紦鍐插尯婊″徎錛岃岃繖涓獁riter/outputStream錛屾鏄湇鍔″櫒鍚岀敤鎴蜂箣闂村緩绔嬬殑socket璇鋒眰錛屼簬鏄簳灞備唬鐮佸紑濮嬪厛鍚戠敤鎴蜂紶杈撲竴閮ㄥ垎欏甸潰錛屼紶濂藉悗錛屽張鏈夊徎鏂扮殑緙撳啿鍖猴紝FreeMarker/Velocity鐨勬柟娉曞張鑳藉悜緙撳啿鍖洪噷鍐欎笢瑗垮徎銆傝屼紶杈撻〉闈㈣繖涓繃紼嬶紝鍙堣楄垂鍙誨嚑縐掗挓鐨勬椂闂達(dá)紝灝卞鑷村徎鏁版嵁搴撹繛鎺ヨ鍗犵敤鍙葷嫚闀跨殑鏃墮棿銆? 鍙兘鎴戞弿榪扮殑鏄敊璇殑錛屽笇鏈況obbin鎸囨錛侊細(xì)錛?/SPAN> |
![]() |
![]() ![]() |
| |
鎴戣寰楄繖涓棶棰樺綊鏍圭粨搴曞氨鏄疉ppServer絀剁珶浼?xì)濡備綍瀹炵幇椤甸潰杈撳嚭銆傞偅涔堝繀鐒跺拰鍏蜂綋鐨勫簲鐢ㄦ湇鍔″櫒瀹炵幇鏈夊叧緋匯傞偅涔堣嚦浜庢瘡涓狝ppServer絀剁珶浼?xì)鎬庢牱鍘誨疄鐜幫紝鎴戝氨涓嶅緱鑰岀煡浜嗐傝搗鐮佸ぇ瀹跺彲浠ョ爺絀朵竴涓婽omcat婧愪唬鐮佺湅鐪媡omcat鏄浣曞疄鐜扮殑銆? confluence閲囩敤鐨勫氨鏄疕ibernate/Spring/Webwork鏋舵瀯錛孫penSessionInView錛屼互confluence榪欎箞騫跨殑浣跨敤錛屽ソ鍍忎篃娌℃湁鍚繃榪欐柟闈㈢殑闂鎶曡瘔銆?/SPAN> |
![]() |
![]() ![]() |
| |
鎴戝啓浜嗕竴涓畝鍗曠殑webapp鍦═omcat5.5.12涓婇潰鍋氫簡涓涓皬嫻嬭瘯銆傚湪JSP欏甸潰閲岄潰寰幆1涓囨杈撳嚭瀛楃涓詫紝紼嬪簭鍦ㄨ繙紼嬫湇鍔″櫒涓婇潰榪愯錛岀綉緇滄槸ADSL瀹藉甫錛宖ilter紜疄琚樆濉炰簡20縐掑乏鍙熾傜劧鍚庢垜鍙﹀寮浜嗕竴涓猣lashget鍘諱笅杞芥湇鍔″櫒涓婄殑澶ф枃浠訛紝妯℃嫙緗戠粶閫熷害姣旇緝鎱㈢殑鐜錛宖ilter琚樆濉炰簡50縐掑乏鍙熾傚垎鍒仛浜嗕笁嬈℃祴璇曘傚彟澶栧綋欏甸潰涓嬭澆榪囩▼涓洿鎺ョ偣鍑?yán)L祻瑙堝櫒stop鎸夐挳錛屽垯JSP鎵ц琚墦鏂紝filter绔嬪埢瑙i櫎闃誨錛岃鎵ц瀹屾瘯銆? 緇撹璇佹槑錛屼嬌鐢∣penSessionInView鐨勬椂鍊欙紝濡傛灉render鐨勯〉闈㈡暟鎹噺闈炲父澶э紝騫朵笖瀹㈡埛绔綉緇滈熷害寰堟參鐨勬儏鍐典笅錛岀敱浜庨〉闈㈢殑杈撳嚭鏃墮棿榪囩▼寰堥暱錛岀‘瀹炰細(xì)閫犳垚filter琚暱鏃墮棿闃誨銆傚浜嶰penSessionInViewFilter鏉ヨ錛屽氨浼?xì)閫犳垚鏁版嵁搴撹繛鎺ヨ淇濇寔寰堥暱鐨勬椂闂達(dá)紝鎵嶈兘琚叧闂? 涓嶈繃錛屽浜嶴pring鐨凮penSessionInViewFilter鏉ヨ錛岃櫧鐒舵暟鎹簱榪炴帴琚繚鎸佷簡榪囬暱鐨勬椂闂達(dá)紝浣嗘槸騫舵病鏈夐攣瀹氭暟鎹簱璧勬簮錛岀壒鍒槸浜嬪姟璧勬簮銆傚洜涓篠pring鐨勪簨鍔℃槸閫氳繃TransactionInterceptor鏉ュ疄鐜扮殑錛屽湪MVC緇撴瀯涓紝褰撴渶鍚庝竴涓笟鍔ean琚皟鐢ㄧ粨鏉熶互鍚庯紝Transaction灝卞凡緇忚鎻愪氦浜嗐傛鍚庯紝铏界劧鏁版嵁搴撹繛鎺ヨ繕淇濇寔涓紝浣嗘槸鏁版嵁搴撹祫婧愭病鏈夐攣瀹氶棶棰樸? 瀹屾暣鐨勮皟鐢ㄧず鎰忓浘錛? request -> (OpenSessionInViewFilter鎵撳紑Session) -> ServletDispatcher -> Action -> (鎵撳紑Connection錛屽惎鍔ㄤ簨鍔? -> spring bean -> another spring bean -> (鎻愪氦浜嬪姟) -> bean鎵ц瀹屾瘯錛岃繑鍥濧ction -> render view(JSP/Template) -> (OpenSessionInViewFilter鍏抽棴Session鍜孋onnection) |
![]() |
![]() ![]() | ||
| |||
robbin鐨勫垎鏋愬緢閫忓交錛屽浜庢渶鍚庝竴鐐癸紝鎴戠◢鏈夌枒闂?
鍏跺疄鎴戣涓烘暟鎹簱榪炴帴琚繚鎸佽繃闀挎椂闂存湁鏃跺欎細(xì)鏈夊緢澶х殑闂銆傚挨鍏舵槸瀵逛簬閲囩敤鏁版嵁榪炴帴姹犵殑鎯呭喌錛屽鏋滀綘鐨勬暟鎹簱榪炴帴涓鐩磋淇濇寔錛岄偅涔堣繖涓祫婧愬氨鏈閲婃斁銆傚亣璁捐榪欎釜鏁版嵁榪炴帴姹犵殑鏈澶ц繛鎺ユ暟涓?5錛屾垜鎰熻寰堝鏄撻犳垚鏁版嵁搴撶殑榪炴帴涓嶅鐢ㄣ? 涓嶆竻妤氬簳灞傜殑瀹炵幇鏄浣曞仛鐨勶紝鎴栬鎴戠殑鐤戦棶鏈変簺澶氳檻銆?/SPAN> |
![]() |
![]() ![]() | ||||
| |||||
鎸夐亾鐞嗘潵璇達(dá)紝鏁版嵁搴撹繛鎺ュ簲璇ュ敖鏃╄閲婃斁錛屼互緙撹В鏁版嵁搴撹祫婧愮殑鍘嬪姏錛屽歡榪熷緢涔呮墠閲婃斁錛岀‘瀹炰細(xì)瀵艱嚧闇瑕佹洿澶氱殑鏁版嵁搴撹繛鎺ャ傝繖涓氨鍙兘鎵╁ぇ榪炴帴姹犳暟閲忥紝澧炲姞鏁版嵁搴撴渶澶у厑璁歌繛鎺ユ暟鏉ヨВ鍐充簡銆? 姝ゅ錛孲ession琚歡榪熷緢涔呴噴鏀撅紝閭d箞Session鍗犵敤鐨勪竴綰х紦瀛樹篃浼?xì)鍗犵敤姣旇緝闀挎棄櫁村Q岃繖鎰忓懗鐫浼?xì)鏃犺皳娑堣楁洿澶氱殑JVM鍐呭瓨銆? 鍥犳錛孫penSessionInView铏界劧紜疄鏂逛究錛屼絾鏄ぇ瀹惰繕鏄厧鐢ㄥ惂銆傚浜庨偅浜涢〉闈㈡覆鏌撻熷害寰堟參錛屾嫧鍙瘋繛鎺ョ敤鎴鋒暟閲忚繃澶氱殑緗戠珯灝辨渶濂戒笉瑕佷嬌鐢ㄣ?/SPAN> |
![]() |
![]() ![]() | ||
| |||
紜垏鐨勫簲璇ユ槸澶у茍鍙戠敤鎴烽噺鐨勬儏鍐靛惂銆傝繖涓棶棰樹竴鐩撮兘瀛樺湪錛屽湪1騫村鍓嶆垜鍜宺obbin浜夎涓氨鎻愬嚭鏉ヤ簡榪囥俬ibernate2鐨勪唬鐮佸彲浠ョ湅鍒皊ession鏄拰connection绱у瘑鑰﹀悎鐨勶紙Hibernate3娌$湅榪囷級銆備絾hibernate澶ч儴鍒嗚鐢ㄤ簬騫跺彂鐢ㄦ埛鍙瑙佺殑intranet搴旂敤錛屾墍浠ラ棶棰樹篃涓嶆槸寰堝ぇ銆傚鏋滃茍鍙戠敤鎴峰錛屽connection pool璧勬簮, opensession in view鍦╤ibernate涓嬌鐢ㄤ細(xì)鏋勬垚杈冨ぇ鍘嬪姏銆傚鏋渏boss j2ee5 server閲囩敤hibernate浣滀負(fù)ejb3瀹炵幇錛屾病鏈夊仛淇鐨勮瘽錛屽悓鏍風(fēng)殑闂涔熶細(xì)瀛樺湪浜巎boss j2ee5 server涓?/SPAN> 涓婁竴嬈$敱Charlesxp浜?005-12-14 鍛ㄤ笁, 涓婂崍10:25淇敼錛屾誨叡淇敼浜?嬈?/SPAN> |
![]() |
![]() ![]() | ||
| |||
鍦╠ao涓瑕乺ender鐨勯泦鍚堝己鍒跺垵濮嬪寲銆?/SPAN> |
![]() |
![]() ![]() | ||
| |||
Hibernate.initialize(foo.getBars); |
浠g爜: |
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() + ")"); } } |
浠g爜: |
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!"); } } |
浠g爜: |
package com.company.springaop.test; public interface Bean { public void theMethod(); } |
浠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(); } } |
浠g爜: |
<?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> |