一、 Spring+Hibernate整合:
Spring整合Hibernate,是做了一個很大的調整的,因爲spring可以把管理Hibernate的工作都做了,以前的hibernate.cfg.xml文件都去掉了,而將這些內容都交給了spring來管理了。
1、 applicationContext.xml文件中應該配置如下內容:
- //配置數據連接類
- <bean id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName"
- value="org.gjt.mm.mysql.Driver">
- </property>
- <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
- <property name="username" value="root"></property>
- </bean>
- //配置session工廠類
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- org.hibernate.dialect.MySQLDialect
- </prop>
- <prop key="hibernate.show_sql">true</prop>
- </props>
- </property>
- <property name="mappingResources">
- <value>com/hejianjiao/vo/Person.hbm.xml</value>
- </property>
- </bean>
2、可以使用spring中的HibernateDAOSupport與HibernateTemplate類來進行數據持久化操作:
A、HibernateDAOSupport類中定義了對session、sessionFactory的操作方法與getHibernateTemplate方法來獲得一個HibernateTemplate實例;
B、HibernateTemplate類中定義了對數據持久化的各種封裝的方法,我們可以用它來對數據進行操作。
因此在使用時,我們可以繼承HibernateDAOSupport類,然後實例化HibernateTemplate類來進行數據持久化。
二、 Spring+Struts2整合:
1、spring配置在web.xml文件中的上下文監聽器:
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext*.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframwork.web.content.ContextLoaderListener</listener-class>
- </listener>
2、struts2配置在web.xml文件中的過濾器:
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-patter>/*</url-patter>
- </filter-mapping>
3、設置struts.xml文件,就可以使用spring的IOC來管理struts的Action:
- <constent name="struts.objectFactory" value="spring" />
4、第三步設置後,以後在struts.xml 文件中配置一個action時,它的class就不是一個類了,而是在applicationContext.xml文件中定義過的類的ID,在struts.xml文件中就只需要引用定義好的類的id 就可以了。
然後特別要注意的一個問題:action是一個請求就是一個action對象,而在spring中則不是的,它是自動分配類的實例的,是使用的單態模式來生產類的實例的,不符合action,因此在applicationContext.xml文件中定義每個action時,都要在類後加上:
- scope="prototype" 屬性
三、 三者組合開發:
一般在組合開發時,沒有什麼難的,只要把上面兩步做好就可以是三個組合開發了。
[img]
[/img]
[img][/img]
上圖則是對於進行組合開發時,一般使用的系統架構:
1、 先從最底層開發,先開發POJO類,和Hibernate映射文件。它相當於系統的數據庫層。
2、 再開發DAO層,它是對於數據進行持久化的一層,專門處理各種數據增、刪、改、查的功能。並且使用DAO工廠模式,以保證和上層沒有任何的聯繫,並且可以方便於類與接口的擴展。
3、 第三是開發manager層,它相當於軟件的業務邏輯層,即專門處理各種業務邏輯。實現系統的業務處理功能。並且它隔離事務,使與下層的數據持久和上層的數據操作沒有任何的聯繫。
4、 Action層,也即軟件的表示層,處理action的接收與回覆。各action由spring管理。
五、 組合開發中的一些問題:
1、 在組合開發中,常見的一個問題就是session的管理,當我們使用HibernateTemplate操作數據庫時,可以不對session進行顯示的操作,spring可以自動處理session的打開與關閉。
我們可以在web.xml文件中顯示的配置一個session管理的過濾器,它專門幫助我們關閉session:
- <filter>
- <filter-name>lazyLoadingFilter</filter-name>
- <filter-class>
- org.springframwork.orm.hibernate3.support.OpenSessionInViewFilter
- </filter-class>
- </filter>
- <filter-mapping>
- <filter-name>lazyLoadingFilter</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
- 注:它一定要在struts2的過濾器之前。因爲web.xml文件的過濾器執行是有順序的。而session一定在前面進行。
它會在所有的action處理完了,頁面顯示完了,就會自動關閉session。
六、 spring事務處理
1、事務的處理也交給了spring來管理,要在applicationContext.xml文件中上配置事務管理類:
- //實施事務管理的bean
- <bean id=”transactionManager”
- class=”org.springframwork.orm.hibernate3.HibernateTransactionManager”>
- <property name=”sessionFactory”>
- <ref bean=”sessionFactory” />
- </property>
- </bean>
它是通過sessionFactory來管理,因此在傳進來一個sessionFactory來接管事務處理。
2、 聲明式事務處理:
在spring中對事務進行管理時,可以顯示地進行事務處理的定義:
- //給事務添加的屬性
- <tx:advice id=”txAdvice” transaction-manager=”transactionManager”>
- <tx:attributes >
- //propagation表示的是事務的傳播特性,使用required時,是當檢測到add開頭的方法時,就看此時有沒有開啓的事務,如果有則將方法放進事務中去,如果沒有,則新建一個事務。然後將方法放進去。
- <tx:method name=”add*” propagation=”REQUIRED”>
- <tx:method name=”delete*” propagation=”REQUIRED”>
- <tx:method name=”update*” propagation=”REQUIRED”>
- //如果檢測到其它的方法,則給其只讀數據庫的屬性。即當本方法在讀時,其它的方法不能再去寫了。保證一個事務的完整性。
- <tx:method name=”*” read-only=”true”>
- </tx:attributes>
- </tx:advice>
對於事務的其它傳播屬性,則可以參考其它文檔進行相關的瞭解。
上一個配置是針對於所有包中類的事務處理方法的設置。下面一段是<aop:config/> 的定義,它確保由 'txAdvice' bean定義的事務通知在應用中合適的點被執行。首先我們定義了 一個切面,它匹配 HibernateDAO 接口定義的所有操作,我們把該切面叫做 'allManagerMethod'。然後我們用一個通知器(advisor)把這個切面與 'txAdvice' 綁定在一起,表示當 'allManagerMethod' 執行時,'txAdvice' 定義的通知事務邏輯將被執行。這就是AOP切面工程:
- <aop:config>
- <aop:pointcut id=”allManagerMethod”
- expression=”execution(* com.hejianjiao.hibernate.HibernateDAO.*(..))”/>
- //調用上面配置的事務屬性,可以將它給本aop pointcut。
- <aop:advisor advice-ref=”txAdvice” pointcut-ref=”allManagerMethod”/>
- //如果還有其它的定義,則可以再加上pointcut、advisor來定義本切面點的事務邏輯。
- </aop:config>
//expression中的內容是要執行本切面的一個接口,中的所有方法:如:一個接口中定義了操作數據的方法:com.hejianjiao.hibernate.HibernateDAO,則下面execution括號中的內容就爲:* com.hejianjiao.hibernate.HibernateDAO.*(..)。而如果在com.hejianjiao.hibernate包中還有其它的類也有操作方法,我們要一起定義的話,就可以寫爲:* com.hejianjiao.*.*(..),其中(..)表示的是方法,前面的第一個*是操作的接口或者類。
上面的配置將爲由 'HibernateDAO' 定義的bean創建一個代理對象,這個代理對象被裝配了事務通知,所以當它的相應方法被調用時,一個事務將被啓動、掛起、被標記爲只讀,或者其它(根據該方法所配置的事務語義)。