最后一種方式就是聲明控制的事務處理了,這里面基本上都是在xml文件中配置,在代碼中見不到任何有關事務的類型,實現了非侵入。其原理用到了Ioc對象反轉控制和AOP,到現在我還沒弄清楚Aop是怎么個玩意兒,哈哈,還得好好學。
在spring的配置文件中設置一個代理類對象,其中的屬性包括,要代理類的接口,要代理的哪個類,事務的處理方式,這樣在數據實現類中調用數據庫的方法中就像沒有用事務一樣寫代碼,另外在控制器中調用這個處理方法的時候,以前是要通過Ioc獲得一個數據實現類的對象,現在,這個實現類被代理的,我們只需得到這個代理類的對象,然后用這個代理類的對象調用相應的數據處理方法。
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>