关于Spring中的开启事物有两种方式:
一种是配置文件,一种是通过注解。
一种是通过接口来进行开启事物,代理类是通过jdk动态代理生成。
一种是通过自身类来开启事物,代理类是通过cblib技术来生成。
一种是通过jdbc,myBaist来实现事物,一种是hibernate3来实现事物。
(不知道上面的读者能听懂不?)
如何配置,网上例子很多,我只说一个问题:你配置完成以后,你确定该类就是能生成代理类吗?
-----------------------------------------------------
我以注解的配置来测试说明:
bean配置如下:
<!-- 扫描让注解的生效 -->
<context:component-scan base-package="com.feng.*" />
<context:annotation-config />
<!-- 读取jdbc属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
<property name="maxPoolSize" value="${maxPoolSize}"/>
<property name="minPoolSize" value="${minPoolSize}"/>
<property name="initialPoolSize" value="${initialPoolSize}"/>
</bean>
<!-- 注册一个jdbc模板对象,用于操作数据库 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userDao" class="com.feng.dao.UserDao">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<!-- 配置DataSourceTransactionManager 只是针对JDBC或者myBatis -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事务的注解驱动,支持事务注解 -->
<tx:annotation-driven transaction-manager="txManager"/>
通过该段配置,并可以在类上通过注解,来设置事物了。测试类如下:
形式一:
package com.feng.service;
@Service
@Transactional
public class UserService {
}
测试如下:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
@SuppressWarnings("unused")
UserService userService = (UserService) ctx.getBean("userService");
//userService.test();
System.out.println("ssssss");
单步调试结果说明:生成的userService不是代理类。
形式二:
package com.feng.service;
@Service
@Transactional
public class UserService {
public void test() {
}
}
单步调试说明:生成的userService是代理类。
结论:若想让开启的事物的是代理类(只有代理类才能实现事物),里面必须要有方法,这点在接口继承的时候一定要注解,父类接口也一定要加上@Transactional。
http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html(注解详细说明)