Õ¾ÄÚËÑË÷: ÇëÊäÈëËÑË÷¹Ø¼ü´Ê

µ±Ç°Ò³Ãæ: ¿ª·¢×ÊÁÏÊ×Ò³ ¡ú Java רÌâ ¡ú Spring¿ò¼ÜµÄÊÂÎñ¹ÜÀíÓ¦Ó÷ÖÎö

Spring¿ò¼ÜµÄÊÂÎñ¹ÜÀíÓ¦Ó÷ÖÎö

ÕªÒª: ½éÉÜÁËJ2EEƽ̨ÉÏJava Web¿ª·¢µÄSpring¿ò¼ÜµÄÔ­ÀíºÍÌØÐÔ£¬¶ÔÆäÊÂÎñ¹ÜÀí·½ÃæµÄÓ¦ÓýøÐÐÁË·ÖÎö¡£
¡¡¡¡Õª Òª ½éÉÜÁËJ2EEƽ̨ÉÏJava Web¿ª·¢µÄSpring¿ò¼ÜµÄÔ­ÀíºÍÌØÐÔ£¬¶ÔÆäÊÂÎñ¹ÜÀí·½ÃæµÄÓ¦ÓýøÐÐÁË·ÖÎö¡£

¡¡¡¡¹Ø¼ü´Ê Spring; J2EE; ¿ØÖÆ·´×ª; ÊÂÎñ´¦Àí

¡¡¡¡Òý ÑÔ

¡¡¡¡ÔÚÈí¼þ¿ª·¢ÖгöÏÖ¹ý¸÷ÖÖ¸÷ÑùµÄ¿ò¼Ü£¬¿ªÔ´Èí¼þµÄÐËÆð£¬Ê¹µÃ¸÷ÖÖ¸÷ÑùµÄ¿ò¼Ü·×·×³öÏÖ£¬ÀýÈ磬Apache×é֯ϾÍÓµÓÐÖî¶àµÄ¿ò¼ÜÀà²úÆ·¡£¿ò¼Ü¾ÍÊÇÒ»×éЭͬ¹¤×÷µÄÀ࣬ËüÃÇΪÌض¨ÀàÐ͵ÄÈí¼þ¹¹ÖþÁËÒ»¸ö¿ÉÖØÓõÄÉè¼Æ¡£È»¶ø£¬´«Í³µÄ¿ò¼ÜʹµÃÓ¦ÓóÌÐò×é¼þ¹ý·ÖÒÀÀµÓÚ¿ò¼ÜÖеÄÀ࣬ÕâÖÖñîºÏ¶ÈµÄÌá¸ß½µµÍÁË×é¼þµÄ¸´ÓÃÐÔ¡£Spring¿ò¼ÜµÄ³öÏÖ£¬Ê¹µÃ×é¼þÖ®¼ä¸üËÉÉ¢µÄñîºÏ³ÉΪÁË¿ÉÄÜ¡£

¡¡¡¡Spring¿ò¼Ü¼ò½é

¡¡¡¡Spring¿ò¼ÜÊÇÒ»¸ö2003Äê2Ô²ųöÏֵĿªÔ´ÏîÄ¿£¬¸Ã¿ªÔ´ÏîÄ¿ÆðÔ´×ÔRod JohnsonÔÚ2002ÄêÄ©³ö°æµÄ¡¶Expert One-on-One J2EE Design and Development¡·Ò»ÊéÖеĻù´¡ÐÔ´úÂë¡£ÔÚ¸ÃÊéÖУ¬Rod Johnson³«µ¼J2EEʵÓÃÖ÷ÒåµÄÉè¼Æ˼Ï룬¶øSpring¿ò¼ÜÕýÊÇÕâһ˼ÏëµÄ¸üÈ«ÃæºÍ¾ßÌåµÄʵÏÖ¡£Spring¿ò¼ÜÓÉÒ»¸öÈÝÆ÷£¬Ò»¸öÅäÖúÍ×éÖ¯×é¼þµÄ¿ò¼Ü£¬ºÍÒ»×éÄÚÖõÄΪÊÂÎñ¡¢³Ö¾Ã»¯ºÍWebÓû§½Ó¿ÚÌṩµÄ·þÎñ×é³É¡£×÷ΪһÖÖÇáÁ¿¼¶µÄJ2EE¿ò¼Ü£¬SpringÌṩÁËÒ»ÖÖÓÐЧµÄ·½Ê½À´½¨Á¢ºÍ×éÖ¯J2EEÓ¦ÓóÌÐò¡£

¡¡¡¡1¡¢SpringÌØÐÔ

¡¡¡¡IoC(Inversion of Control£»¿ØÖÆ·´×ª)£»ÓÖ³ÆDI(Dependency Injection£»ÒÀÀµ×¢Èë)£»ÊÇÃæÏò¶ÔÏóÁìÓòÐÂÐ˵ıà³Ì˼Ï룻ҲÊÇSpringµÄ¾«ËèËùÔÚ¡£¼òµ¥µØ˵£»IoC¾ÍÊÇÖ¸³ÌÐòÖ®¼äµÄ¹ØϵÓÉÈÝÆ÷À´¿ØÖÆ£»¶ø²»ÊÇ´«Í³ÊµÏÖÖÐÓɳÌÐò´úÂëÖ±½Ó²Ù¿Ø¡£ÕâÒ²¾ÍÊÇËùν¡°¿ØÖÆ·´×ª¡±µÄ¸ÅÄîËùÔÚ£º¿ØÖÆȨÓÉÓ¦ÓôúÂëתµ½ÍⲿÈÝÆ÷£¬¿ØÖÆȨµÄתÒÆ£¬Ò²¾ÍÊÇËùνµÄ·´×ª¡£IoC½«¿ØÖÆ´´½¨µÄÖ°Ôð°á½øÁË¿ò¼ÜÖУ»²¢°ÑËü´ÓÓ¦ÓôúÂëÍÑÀ뿪À´¡£µ±Ê¹ÓÃSpringµÄIoCÈÝÆ÷ʱֻÐèÖ¸³ö×é¼þÐèÒªµÄ¶ÔÏó£¬ÔÚÔËÐÐʱSpringµÄIoCÈÝÆ÷»á¸ù¾ÝXMLÅäÖÃÊý¾ÝÌṩ¸øËü¡£

¡¡¡¡Spring IoC£¬½èÖúÓÚÒÀÀµ×¢ÈëÉè¼Æģʽ£¬Ê¹µÃ¿ª·¢Õß²»ÓÃÀí»á¶ÔÏó×ÔÉíµÄÉúÃüÖÜÆÚ¼«Æä¹Øϵ£¬¶øÇÒÄܹ»¸ÄÉÆ¿ª·¢Õ߶ÔģʽµÄʹÓ᣶ÔÓÚÒ»¸ö¶ÔÏóµÄ¹ÜÀí²»ÊÇʲôÀ§ÄÑ£¬ÄѾÍÄÑÔÚ¶ÔÕû¸ö¶ÔÏóȺµÄ¹ÜÀí¡£ÒÀÀµ×¢Èë¿ÉÒÔÈÃÈÝÆ÷¹ÜÀí¶ÔÏ󣬼´¡°Don¡¯t call me, I will call you¡±¡£ÕâÑù¶ÔÏó±¾ÉíµÄÉúÃüÖÜÆÚÒÔ¼°¶ÔÏóÖ®¼äµÄ¹Øϵ¾Í²»ÔÙÈÿª·¢Õß·ÑÉñÁË¡£

¡¡¡¡Spring AOP£¬½èÖúÓÚSpringʵÏÖÀ¹½ØÆ÷£¬¿ª·¢ÕßÄܹ»ÊµÏÖÒÔÉùÃû·½Ê½Ê¹ÓÃÆóÒµ¼¶·þÎñ£¬±ÈÈ簲ȫÐÔ·þÎñ¡¢ÊÂÎñ·þÎñ¡£AOP ºÏÀíµÄ²¹³äÁËOOP£¬½èÖúÓÚSpring AOP£¬¿ª·¢ÕßÄܹ»¸ßЧµÄʹÓÃJ2EE·þÎñ¡£

¡¡¡¡Spring·þÎñ³éÏ󣬽èÖúÓÚ¸÷Ö ÖJ2EE API³éÏó£¬Ê¹µÃ¿ª·¢ÕßÄܹ»Ò»ÖµØʹÓÃJ2EE ¼¼Êõ£¬¶ø²»¹Ü¾ßÌåÊÇʹÓÃʲôJ2EE API£¬½èÖúÓÚSpring·þÎñ³éÏó£¬Ê¹´úÂë´ó´ó¼õÉÙ£¬Âú×ã¡°¸üÉÙ´úÂ룬¸üÉÙBUG¡±µÄÈí¼þÉè¼ÆÔ­Ôò¡£

¡¡¡¡Spring IoC+Spring AOP+Spring·þÎñ³éÏó£¬Ò»ÆðÐγÉSpring£¬ÕâÑùÒ»¸öÓлúÌ壬ʹ¹¹½¨ÇáÁ¿¼¶J2EE³ÉΪ¿ÉÄÜ¡£

¡¡¡¡SpringÌṩµÄÊÂÎñ¹ÜÀí

¡¡¡¡SpringÌṩµÄÊÂÎñ¹ÜÀí¿ÉÒÔ·ÖΪÁ½Àࣺ±à³ÌʽµÄºÍÉùÃ÷ʽµÄ¡£±à³ÌʽµÄ£¬±È½ÏÁé»î£¬µ«ÊÇ´úÂëÁ¿´ó£¬´æÔÚÖظ´µÄ´úÂë±È½Ï¶à£»ÉùÃ÷ʽµÄ±È±à³ÌʽµÄ¸üÁé»î·½±ã¡£

¡¡¡¡1¡¢´«Í³Ê¹ÓÃJDBCµÄÊÂÎñ¹ÜÀí

¡¡¡¡ÒÔÍùʹÓÃJDBC½øÐÐÊý¾Ý²Ù×÷£¬Ê¹ÓÃDataSource£¬´ÓÊý¾ÝÔ´Öеõ½Connection£¬ÎÒÃÇÖªµÀÊý¾ÝÔ´ÊÇḬ̈߳²È«µÄ£¬¶øÁ¬½Ó²»ÊÇḬ̈߳²È«µÄ£¬ËùÒÔ¶Ôÿ¸öÇëÇó¶¼ÊÇ´ÓÊý¾ÝÔ´ÖÐÖØÐÂÈ¡³öÒ»¸öÁ¬½Ó¡£Ò»°ãµÄÊý¾ÝÔ´ÓÉÈÝÆ÷½øÐйÜÀí£¬°üÀ¨Á¬½Ó³Ø¡£ÀýÈçTOMCAT£¬WEBSPHERE£¬WEBLOGICµÈÕâЩJ2EEÉÌÒµÈÝÆ÷¶¼ÌṩÁËÕâ¸ö¹¦ÄÜ¡£

¡¡¡¡ÒÔÍùµÄÎÒÃÇʹÓÃJDBCÔÚд´úÂëʱ£¬ÊÂÎñ¹ÜÀí¿ÉÄÜ»áÊÇÕâÑù£º

<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1> <tr> <td>Connection conn = null;
try{
¡¡conn = DBConnectionFactory.getConnection;
¡¡conn.setAutoCommit(false);
¡¡//do something
¡¡conn.commit(); //commit transcation
}catch(Exception e){
¡¡conn.rollback();
}
finally{
¡¡try{
¡¡¡¡conn.close();
¡¡} catch(SQLException se){ //do sth.}
¡¡//close ResultSet,PreparedStatement,Connection
¡¡//notice:Maybe ocurr Exception when u close rs,pstmt,conn
}</td></tr></table>
¡¡¡¡°´ÕÕÒÔÍùµÄ˼·À´Ð´´úÂ룬´úÂëÁ¿±È½Ï³¤£¬¶øÇÒÈÝÒ×Êèºö£¬ÍüµôһЩtry/catch£¬Òý·¢Ò»Ð©Òì³£ÎÞ·¨catch£¬ËäÈ»ÓÐʱºòÎÒÃÇ»áдDBToolÀ࣬À´¹Ø±ÕÕâЩ×ÊÔ´£¬²¢ÇÒ±£Ö¤ÔڹرÕÕâЩ×ÊԴʱ£¬²»ÏòÍâÅ×Òì³££¬µ«ÊÇÕâÑù×ö»áµ¼Ö¶îÍâµÄÂé·³¡£

¡¡¡¡2¡¢SpringÌṩµÄ±à³ÌʽµÄÊÂÎñ´¦Àí

¡¡¡¡SpringÌṩÁ˼¸¸ö¹ØÓÚÊÂÎñ´¦ÀíµÄÀࣺTransactionDefinition //ÊÂÎñÊôÐÔ¶¨Òå

¡¡¡¡TranscationStatus //´ú±íÁ˵±Ç°µÄÊÂÎñ£¬¿ÉÒÔÌá½»£¬»Ø¹ö¡£

¡¡¡¡PlatformTransactionManagerÕâ¸öÊÇspringÌṩµÄÓÃÓÚ¹ÜÀíÊÂÎñµÄ»ù´¡½Ó¿Ú£¬ÆäÏÂÓÐÒ»¸öʵÏֵijéÏóÀàAbstractPlatformTransactionManager£¬ÎÒÃÇʹÓõÄÊÂÎñ¹ÜÀíÀàÀýÈçDataSourceTransactionManagerµÈ¶¼ÊÇÕâ¸öÀàµÄ×ÓÀà¡£

¡¡¡¡ÎÒÃÇʹÓñà³ÌʽµÄÊÂÎñ¹ÜÀíÁ÷³Ì¿ÉÄÜÈçÏ£º

¡¡¡¡(1) ÉùÃ÷Êý¾ÝÔ´¡£

¡¡¡¡(2) ÉùÃ÷Ò»¸öÊÂÎñ¹ÜÀíÀ࣬ÀýÈ磺DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManagerµÈ

¡¡¡¡(3) ÔÚÎÒÃǵĴúÂëÖмÓÈëÊÂÎñ´¦Àí´úÂ룺

<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1> <tr> <td>TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try{
¡¡//do sth
¡¡transactionManager.commit(ts);
}catch(Exception e){transactionManager.rollback(ts);}</td></tr></table>
¡¡¡¡Ê¹ÓÃSpringÌṩµÄÊÂÎñÄ£°åTransactionTemplate£º

<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1> <tr> <td>void add()
{
¡¡transactionTemplate.execute( new TransactionCallback(){
¡¡¡¡pulic Object doInTransaction(TransactionStatus ts)
¡¡¡¡{ //do sth}
¡¡}
}</td></tr></table>
¡¡¡¡TransactionTemplateÒ²ÊÇΪÎÒÃÇÊ¡È¥Á˲¿·ÖÊÂÎñÌá½»¡¢»Ø¹ö´úÂ룻¶¨ÒåÊÂÎñÄ£°åʱ£¬Ðè×¢ÈëÊÂÎñ¹ÜÀí¶ÔÏó¡£

¡¡¡¡3¡¢SpringÉùÃ÷ʽÊÂÎñ´¦Àí

¡¡¡¡SpringÉùÃ÷ʽÊÂÎñ´¦ÀíÒ²Ö÷ҪʹÓÃÁËIoC£¬AOP˼Ï룬ÌṩÁËTransactionInterceptorÀ¹½ØÆ÷ºÍ³£ÓõĴúÀíÀàTransactionProxyFactoryBean£¬¿ÉÒÔÖ±½Ó¶Ô×é¼þ½øÐÐÊÂÎñ´úÀí¡£

¡¡¡¡Ê¹ÓÃTransactionInterceptorµÄ²½Ö裺

¡¡¡¡£¨1£©¶¨ÒåÊý¾ÝÔ´£¬ÊÂÎñ¹ÜÀíÀà

¡¡¡¡£¨2£©¶¨ÒåÊÂÎñÀ¹½ØÆ÷,ÀýÈ磺

<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1> <tr> <td>£¼bean id = "transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"£¾
£¼property name="transactionManager"£¾£¼ref bean="transactionManager"/£¾£¼/property£¾
£¼property name="transactionAttributeSource"£¾
£¼value£¾
com.test.UserManager.*r=PROPAGATION_REQUIRED
£¼/value£¾
£¼/property£¾
£¼/bean£¾</td></tr></table>
¡¡¡¡£¨3£©Îª×é¼þÉùÃ÷Ò»¸ö´úÀíÀࣺProxyFactoryBean

<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1> <tr> <td>£¼bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean"£¾
£¼property name="proxyInterfaces"£¾£¼value£¾com.test.UserManager£¼/value£¾£¼/property£¾
£¼property name="interceptorNames"£¾
£¼list£¾
£¼idref local="transactionInterceptor"/£¾
£¼/list£¾
£¼/property£¾
£¼/bean£¾</td></tr></table>
¡¡¡¡Ê¹ÓÃTransactionProxyFactoryBean£º

<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1> <tr> <td>£¼bean id="userManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"£¾
£¼property name="transactionManager"£¾£¼ref bean="transactionManager"/£¾£¼/property£¾
£¼property name="target"£¾£¼ref local="userManagerTarget"/£¾£¼/property£¾
£¼property name="transactionAttributes"£¾
£¼props£¾
£¼prop key="insert*"£¾PROPAGATION_REQUIRED£¼/prop£¾
£¼prop key="update*"£¾PROPAGATION_REQUIRED£¼/prop£¾
£¼prop key="*"£¾PROPAGATION_REQUIRED,readOnly£¼/prop£¾
£¼/props£¾
£¼/property£¾
£¼/bean£¾</td></tr></table>
¡¡¡¡TransactionProxyFactoryBeanÖ»ÊÇΪ×é¼þµÄÊÂÎñ´úÀí£¬Èç¹ûÎÒÃÇÒª¸ø×é¼þÌí¼ÓһЩҵÎñ·½ÃæµÄÑéÖ¤µÈ£¬¿ÉÒÔʹÓÃTransactionTemplate¼ÓÀ¹½ØÆ÷·½Ê½£¬Îª×é¼þÌí¼Ó¶à¸öÀ¹½ØÆ÷£¬spring AOPÖÐÌṩÁËÈýÀàAdvice,¼´Ç°ÔöÇ¿£¬ºóÔöÇ¿£¬Å׳öÒ쳣ʱµÄÔöÇ¿£¬¿ÉÒÔÁé»îʹÓá£

¡¡¡¡½áÊøÓï

¡¡¡¡Spring¿ÉÒÔ¼òµ¥µÄ°ÑÆÕͨµÄjava classÄÉÈëÊÂÎñ¹ÜÀí£¬ÉùÃ÷ÐÔµÄÊÂÎñ²Ù×÷ÆðÀ´Ò²ºÜÈÝÒס£ÓÐÁËSpringÖ®ºó£¬ÉùÃ÷ÐÔÊÂÎñ²»ÔÙÊÇEJB¶ÀÓУ¬ÎÒÃDz»±ØΪÁË»ñµÃÉùÃ÷ÐÔÊÂÎñµÄ¹¦ÄܶøÈ¥ÈÌÊÜEJB´øÀ´µÄÖÖÖÖ²»±ã¡£Spring»¹ÌṩÁËΩһµÄÊÂÎñ¹ÜÀí³éÏó£¬ËüÄܹ»ÔÚ¸÷ÖֵײãÊÂÎñ¹ÜÀí¼¼Êõ(ÈçJTA»òÕßJDBC)Ö®ÉÏÌṩһ¸öÒ»Öµıà³ÌÄ£ÐÍ¡£

¡ü·µ»ØĿ¼
ǰһƪ: JavaÉè¼ÆģʽÑо¿Ö®Flyweightģʽ
ºóһƪ: Ïò¸ßÊÖÇë½Ìant¹¹½¨¹¤¾ßµÄÀà×°ÔØÆ÷ÎÊÌâ