最后一種方式就是聲明控制的事務(wù)處理了,這里面基本上都是在xml文件中配置,在代碼中見(jiàn)不到任何有關(guān)事務(wù)的類(lèi)型,實(shí)現(xiàn)了非侵入。其原理用到了Ioc對(duì)象反轉(zhuǎn)控制和AOP,到現(xiàn)在我還沒(méi)弄清楚Aop是怎么個(gè)玩意兒,哈哈,還得好好學(xué)。
在spring的配置文件中設(shè)置一個(gè)代理類(lèi)對(duì)象,其中的屬性包括,要代理類(lèi)的接口,要代理的哪個(gè)類(lèi),事務(wù)的處理方式,這樣在數(shù)據(jù)實(shí)現(xiàn)類(lèi)中調(diào)用數(shù)據(jù)庫(kù)的方法中就像沒(méi)有用事務(wù)一樣寫(xiě)代碼,另外在控制器中調(diào)用這個(gè)處理方法的時(shí)候,以前是要通過(guò)Ioc獲得一個(gè)數(shù)據(jù)實(shí)現(xiàn)類(lèi)的對(duì)象,現(xiàn)在,這個(gè)實(shí)現(xiàn)類(lèi)被代理的,我們只需得到這個(gè)代理類(lèi)的對(duì)象,然后用這個(gè)代理類(lèi)的對(duì)象調(diào)用相應(yīng)的數(shù)據(jù)處理方法。
Xml配置文件中的部分配置:
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>springmvcwebapp.UserLoginInterface</value>
</list>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="target">
<ref bean="oneUserLoginImple"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="doUpdateUserInfo*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED, readOnly</prop>
</props>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=WebStudyDB</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>