spring 事务配置的五种方法
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个Bean都有一个代理
1
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
2
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
3
????
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
4
????
xmlns:context
=
"http://www.springframework.org/schema/context"
5
????
xmlns:aop
=
"http://www.springframework.org/schema/aop"
6
????
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
>
7
?8
????
<
bean
id
=
"sessionFactory"
9
????????????
class
=
"org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
10
????????
<
property
name
=
"configLocation"
value
=
"classpath:hibernate.cfg.xml"
/>
11
????????
<
property
name
=
"configurationClass"
value
=
"org.hibernate.cfg.AnnotationConfiguration"
/>
12
????
</
bean
>?
13
?14
????
<!-- 定义事务管理器(声明式的事务) -->
15
????
<
bean
id
=
"transactionManager"
16
????????
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
17
????????
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
18
????
</
bean
>
19
?20
????
<!-- 配置DAO -->
21
????
<
bean
id
=
"userDaoTarget"
class
=
"com.bluesky.spring.dao.UserDaoImpl"
>
22
????????
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
23
????
</
bean
>
24
?25
????
<
bean
id
=
"userDao"
26
????????
class
=
"org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
>
27
???????????
<!-- 配置事务管理器 -->
28
???????????
<
property
name
=
"transactionManager"
ref
=
"transactionManager"
/>
29
????????
<
property
name
=
"target"
ref
=
"userDaoTarget"
/>
30
?????????
<
property
name
=
"proxyInterfaces"
value
=
"com.bluesky.spring.dao.GeneratorDao"
/>
31
????????
<!-- 配置事务属性 -->
32
????????
<
property
name
=
"transactionAttributes"
>
33
????????????
<
props
>
34
????????????????
<
prop
key
=
"*"
>PROPAGATION_REQUIRED</
prop
>
35
????????????
</
props
>
36
????????
</
property
>
37
????
</
bean
>
38
</
beans
>
第二种方式:所有Bean共享一个代理基类
1
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
2
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
3
????
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
4
????
xmlns:context
=
"http://www.springframework.org/schema/context"
5
????
xmlns:aop
=
"http://www.springframework.org/schema/aop"
6
????
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
>
7
?8
????
<
bean
id
=
"sessionFactory"
9
????????????
class
=
"org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
10
????????
<
property
name
=
"configLocation"
value
=
"classpath:hibernate.cfg.xml"
/>
11
????????
<
property
name
=
"configurationClass"
value
=
"org.hibernate.cfg.AnnotationConfiguration"
/>
12
????
</
bean
>?
13
?14
????
<!-- 定义事务管理器(声明式的事务) -->
15
????
<
bean
id
=
"transactionManager"
16
????????
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
17
????????
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
18
????
</
bean
>
19
?20
????
<
bean
id
=
"transactionBase"
21
????????????
class
=
"org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
22
????????????
lazy-init
=
"true"
abstract
=
"true"
>
23
????????
<!-- 配置事务管理器 -->
24
????????
<
property
name
=
"transactionManager"
ref
=
"transactionManager"
/>
25
????????
<!-- 配置事务属性 -->
26
????????
<
property
name
=
"transactionAttributes"
>
27
????????????
<
props
>
28
????????????????
<
prop
key
=
"*"
>PROPAGATION_REQUIRED</
prop
>
29
????????????
</
props
>
30
????????
</
property
>
31
????
</
bean
>???
32
?33
????
<!-- 配置DAO -->
34
????
<
bean
id
=
"userDaoTarget"
class
=
"com.bluesky.spring.dao.UserDaoImpl"
>
35
????????
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
36
????
</
bean
>
37
?38
????
<
bean
id
=
"userDao"
parent
=
"transactionBase"
>
39
????????
<
property
name
=
"target"
ref
=
"userDaoTarget"
/>
40
????
</
bean
>
41
</
beans
>
第三种方式:使用拦截器
1
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
2
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
3
????
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
4
????
xmlns:context
=
"http://www.springframework.org/schema/context"
5
????
xmlns:aop
=
"http://www.springframework.org/schema/aop"
6
????
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
>
7
?8
????
<
bean
id
=
"sessionFactory"
9
????????????
class
=
"org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
10
????????
<
property
name
=
"configLocation"
value
=
"classpath:hibernate.cfg.xml"
/>
11
????????
<
property
name
=
"configurationClass"
value
=
"org.hibernate.cfg.AnnotationConfiguration"
/>
12
????
</
bean
>?
13
?14
????
<!-- 定义事务管理器(声明式的事务) -->
15
????
<
bean
id
=
"transactionManager"
16
????????
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
17
????????
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
18
????
</
bean
>
19
?20
????
<
bean
id
=
"transactionInterceptor"
21
????????
class
=
"org.springframework.transaction.interceptor.TransactionInterceptor"
>
22
????????
<
property
name
=
"transactionManager"
ref
=
"transactionManager"
/>
23
????????
<!-- 配置事务属性 -->
24
????????
<
property
name
=
"transactionAttributes"
>
25
????????????
<
props
>
26
????????????????
<
prop
key
=
"*"
>PROPAGATION_REQUIRED</
prop
>
27
????????????
</
props
>
28
????????
</
property
>
29
????
</
bean
>
30
?31
????
<
bean
class
=
"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
>
32
????????
<
property
name
=
"beanNames"
>
33
????????????
<
list
>
34
????????????????
<
value
>*Dao</
value
>
35
????????????
</
list
>
36
????????
</
property
>
37
????????
<
property
name
=
"interceptorNames"
>
38
????????????
<
list
>
39
????????????????
<
value
>transactionInterceptor</
value
>
40
????????????
</
list
>
41
????????
</
property
>
42
????
</
bean
>?
43
?44
????
<!-- 配置DAO -->
45
????
<
bean
id
=
"userDao"
class
=
"com.bluesky.spring.dao.UserDaoImpl"
>
46
????????
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
47
????
</
bean
>
48
</
beans
>
第四种方式:使用tx标签配置的拦截器
1
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
2
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
3
????
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
4
????
xmlns:context
=
"http://www.springframework.org/schema/context"
5
????
xmlns:aop
=
"http://www.springframework.org/schema/aop"
6
????
xmlns:tx
=
"http://www.springframework.org/schema/tx"
7
????
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
>
8
?9
????
<
context:annotation-config
/>
10
????
<
context:component-scan
base-package
=
"com.bluesky"
/>
11
?12
????
<
bean
id
=
"sessionFactory"
13
????????????
class
=
"org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
14
????????
<
property
name
=
"configLocation"
value
=
"classpath:hibernate.cfg.xml"
/>
15
????????
<
property
name
=
"configurationClass"
value
=
"org.hibernate.cfg.AnnotationConfiguration"
/>
16
????
</
bean
>?
17
?18
????
<!-- 定义事务管理器(声明式的事务) -->
19
????
<
bean
id
=
"transactionManager"
20
????????
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
21
????????
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
22
????
</
bean
>
23
?24
????
<
tx:advice
id
=
"txAdvice"
transaction-manager
=
"transactionManager"
>
25
????????
<
tx:attributes
>
26
????????????
<
tx:method
name
=
"*"
propagation
=
"REQUIRED"
/>
27
????????
</
tx:attributes
>
28
????
</
tx:advice
>
29
?30
????
<
aop:config
>
31
????????
<
aop:pointcut
id
=
"interceptorPointCuts"
32
????????????
expression
=
"execution(* com.bluesky.spring.dao.*.*(..))"
/>
33
????????
<
aop:advisor
advice-ref
=
"txAdvice"
34
????????????
pointcut-ref
=
"interceptorPointCuts"
/>
35
????
</
aop:config
>
36
</
beans
>
第五种方式:全注解
1
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
2
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
3
????
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
4
????
xmlns:context
=
"http://www.springframework.org/schema/context"
5
????
xmlns:aop
=
"http://www.springframework.org/schema/aop"
6
????
xmlns:tx
=
"http://www.springframework.org/schema/tx"
7
????
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
>
8
?9
????
<
context:annotation-config
/>
10
????
<
context:component-scan
base-package
=
"com.bluesky"
/>
11
?12
????
<
tx:annotation-driven
transaction-manager
=
"transactionManager"
/>
13
?14
????
<
bean
id
=
"sessionFactory"
15
????????????
class
=
"org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
16
????????
<
property
name
=
"configLocation"
value
=
"classpath:hibernate.cfg.xml"
/>
17
????????
<
property
name
=
"configurationClass"
value
=
"org.hibernate.cfg.AnnotationConfiguration"
/>
18
????
</
bean
>?
19
?20
????
<!-- 定义事务管理器(声明式的事务) -->
21
????
<
bean
id
=
"transactionManager"
22
????????
class
=
"org.springframework.orm.hibernate3.HibernateTransactionManager"
>
23
????????
<
property
name
=
"sessionFactory"
ref
=
"sessionFactory"
/>
24
????
</
bean
>
25
?26
</
beans
>
此时在DAO上需加上@Transactional注解,如下:
1
package
com.bluesky.spring.dao;
2
?3
import
java.util.List;
4
?5
import
org.hibernate.SessionFactory;
6
import
org.springframework.beans.factory.annotation.Autowired;
7
import
org.springframework.orm.hibernate3.support.HibernateDaoSupport;
8
import
org.springframework.stereotype.Component;
9
?10
import
com.bluesky.spring.domain.User;
11
?12
@Transactional
13
@Component
(
"userDao"
)
14
public
class
UserDaoImpl
extends
HibernateDaoSupport
implements
UserDao {
15
?16
????
public
List<User> listUsers() {
17
????????
return
this
.getSession().createQuery(
"from User"
).list();
18
????
}
19
?20
}