在spring中经常用TransactionProxyFactoryBean完成声明式事务管理
使用TransactionProxyFactoryBean 需要注入它所依赖的事务管理器,设置代理的目标对象,代理对象的生成方式和事务属性.代理对象时再目标对象上生成的包含事务和AOP切面的新对象,它可以赋给目标的引用来替代目标对象,以支持事务或AOP提供的切面功能
利用TransactionPrxyFactory来实现spring声明式事务管理
首先,在配置文件中定义数据源和事务管理器.
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/hibernate"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 声明式的事务 -->
<bean id="transaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"></property>
<property name="target">
<bean id="addDao" class="transaction.AddDao">
<property name="dataSource" ref="dataSource"></property>
</bean>
</property>
<property name="proxyTargetClass" value="true"></property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
编写操作数据库的AddDao类,同时编写addUser()函数,在该函数中一次性实现两次数据的插入操作
public class AddDao extends JdbcDaoSupport {
public void addUser(User user){
String sql="insert into mw_person(name,age)values('"+user.getUsername()+"',"+23+")";
getJdbcTemplate().execute(sql);
getJdbcTemplate().execute(sql);
}
}
测试类:
public class Test { public static void main(String[] args) { Resource resource=new ClassPathResource("transaction/beam.xml"); BeanFactory factory=new XmlBeanFactory(resource); AddDao addDao=(AddDao)factory.getBean("transaction"); User user=new User(); user.setUsername("abc"); user.setAge(34); addDao.addUser(user); } }