spring4配置文件詳解


轉自:

spring4配置文件詳解

一、配置數據源

基本的加載properties配置文件

<context:property-placeholder location="classpath*:/appConfig.properties" />

1、JNDI方式

<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/mysqlDS" resource-ref="true"/>

l  jndi-name:指定JNDI中資源名稱

l  resource-ref:如果應用程序運行在java應用程序服務器中,值設為true,這樣jndi-name會自動加上java:comp/env/前綴

 

2、數據連接池方式

DBCP連接池:

使用:org.apache.commons.dbcp.BasicDataSource進行配置

 1 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 2 
 3    <!-- 【必須】  數據庫驅動-->
 4 
 5    <property name="driverClassName" value="${jdbc.driver}" />
 6 
 7    <!-- 【必須】 數據庫連接地址 -->
 8 
 9    <property name="url" value="${jdbc.url}" />
10 
11    <!-- 【必須】 數據庫用戶名 -->
12 
13    <property name="username" value="${jdbc.username}" />
14 
15    <!-- 【必須】 數據庫密碼 -->
16 
17    <property name="password" value="${jdbc.password}" />
18 
19    <!-- 可選 啟動時創建的連接數 -->
20 
21    <property name="initialSize" value="5"/>
22 
23    <!-- 可選 同時可從池中分配的最多連接數,0無限制 -->
24 
25    <property name="maxActive" value="10"/>
26 
27    <!-- 可選 池中不會被釋放的最多空閑連接數 0無限制 -->
28 
29    <property name="maxIdle" value=""/>
30 
31    <!-- 可選 同時能從語句池中分配的預處理語句最大值,0無限制 -->
32 
33    <property name="maxOpenPreparedStatement" value="100"/>
34 
35    <!-- 可選 拋異常前池等待連接回收最大時間(當無可用連接),-1無限等待 -->
36 
37    <property name="maxWait" value="1000"/>
38 
39    <!-- 可選 連接在池中保持空閑而不被回收的最大時間 -->
40 
41    <property name="minEvictableIdleTimeMillis" value="2000"/>
42 
43    <!-- 可選 不創建新連接情況下池中保持空閑的最小連接數 -->
44 
45    <property name="minIdle" value="2"/>
46 
47    <!-- 可選 布爾值,是否對預處理語句進行池管理 -->
48 
49    <property name="poolPreparedStatements" value="true"/>
50 
51 </bean>

C3P0連接池:

使用:com.mchange.v2.c3p0.ComboPooledDataSource進行配置

 1 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
 2 
 3    <property name="driverClass" value="${jdbc.driver}" />
 4 
 5    <property name="jdbcUrl" value="${jdbc.url}" />
 6 
 7    <property name="user" value="${jdbc.username}" />
 8 
 9    <property name="password" value="${jdbc.password}" />
10 
11 </bean>

alibaba DRUID連接池:

使用:com.alibaba.druid.pool.DruidDataSource進行配置

 1 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">  
 2 
 3     <!-- 基本屬性 url、user、password --> 
 4 
 5     <property name="url" value="${jdbc_url}" /> 
 6 
 7     <property name="username" value="${jdbc_user}" /> 
 8 
 9     <property name="password" value="${jdbc_password}" /> 
10 
11     <!-- 配置初始化大小、最小、最大 --> 
12 
13     <property name="initialSize" value="1" /> 
14 
15     <property name="minIdle" value="1" />  
16 
17     <property name="maxActive" value="20" /> 
18 
19     <!-- 配置獲取連接等待超時的時間 --> 
20 
21     <property name="maxWait" value="60000" /> 
22 
23     <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> 
24 
25     <property name="timeBetweenEvictionRunsMillis" value="60000" /> 
26 
27     <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> 
28 
29     <property name="minEvictableIdleTimeMillis" value="300000" /> 
30 
31     <property name="validationQuery" value="SELECT 'x'" /> 
32 
33     <property name="testWhileIdle" value="true" /> 
34 
35     <property name="testOnBorrow" value="false" /> 
36 
37     <property name="testOnReturn" value="false" /> 
38 
39     <!-- 打開PSCache,並且指定每個連接上PSCache的大小 --> 
40 
41     <property name="poolPreparedStatements" value="true" /> 
42 
43     <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> 
44 
45     <!-- 配置監控統計攔截的filters,去掉后監控界面sql無法統計 --> 
46 
47     <property name="filters" value="stat" />  
48 
49 </bean>

3、JDBC驅動的數據源

使用:

org.springframework.jdbc.datasource.SingleConnectionDataSource【每個鏈接請求會返回同一個連接,不推薦】

org.springframework.jdbc.datasource.DriverManagerDataSource進行配置

 1 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 2 
 3    <property name="driverClassName" value="${jdbc.driver}" />
 4 
 5    <property name="url" value="${jdbc.url}" />
 6 
 7    <property name="username" value="${jdbc.username}" />
 8 
 9    <property name="password" value="${jdbc.password}" />
10 
11 </bean>

二、操作數據庫

1、spring JDBC模板

模板類選擇:

JdbcTemplate:提供最簡單的數據訪問等功能。

NamedParameterJdbcTemplate:通過該模板,可以把參數作為查詢的條件傳入方法中。

SimpleJdbcTemplate(推薦):結合了一些自動裝箱等功能,2.5以后,整合了NamedParameterJdbcTemplate。

配置方式:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">

   <constructor-arg ref="dataSource"/>

</bean>

2、與ORM框架集成

    主要是配置spring的Session工廠(sessionFactory),可以使用到諸如延遲加載、預先抓取、級聯復雜特性。

spring對ORM框架的支持提供提供了一些附加服務:

l  spring聲明式事務集成支持

l  透明的異常處理

l  線程安全、輕量級的模板類

l  DAO支持

l  資源管理

2.1、集成Hibernate方式:[hibernate4為例]

hibernate的HBM文件配置方式(Xxx.hbm.xml):

 1 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
 2 
 3    <!-- 數據源 -->
 4 
 5    <property name="dataSource" ref="dataSource" />
 6 
 7    <!-- 映射文件形式-->
 8 
 9    <property name="mappingResources">
10 
11       <list>
12 
13          <value>User.hbm.xml</value>
14 
15       </list>
16 
17    </property>
18 
19    <!-- Hibernate屬性配置 -->
20 
21    <property name="hibernateProperties">
22 
23       <props>
24 
25          <prop key="dialect">
26 
27 org.hibernate.dialect.MySQLDialect</prop><!-- 數據庫方言 -->
28 
29          <!-- ……其他 -->
30 
31       </props>
32 
33    </property>
34 
35 </bean>

 


代碼中使用注解的方式: 

 1 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
 2 
 3    <!-- 數據源 -->
 4 
 5    <property name="dataSource" ref="dataSource" />  
 6 
 7    <!-- 自動掃描實體對象 tdxy.bean的包結構中存放實體類  -->
 8 
 9    <property name="packagesToScan" value="com.test.entity"/>
10 
11    <!-- hibernate的相關屬性配置 -->
12 
13    <property name="hibernateProperties">
14 
15       <value>
16 
17          <!-- 設置數據庫方言 -->
18 
19          hibernate.dialect=org.hibernate.dialect.MySQLDialect                
20 
21          <!-- 設置自動創建|更新|驗證數據庫表結構 -->
22 
23          hibernate.hbm2ddl.auto=update                 
24 
25          <!-- 是否在控制台顯示sql -->
26 
27          hibernate.show_sql=true                 
28 
29          <!-- 是否格式化sql,優化顯示 -->
30 
31          hibernate.format_sql=true                
32 
33          <!-- 是否開啟二級緩存 -->
34 
35          hibernate.cache.use_second_level_cache=false                
36 
37          <!-- 是否開啟查詢緩存 -->
38 
39          hibernate.cache.use_query_cache=false                
40 
41          <!-- 數據庫批量查詢最大數 -->
42 
43          hibernate.jdbc.fetch_size=50
44 
45          <!-- 數據庫批量更新、添加、刪除操作最大數  -->
46 
47          hibernate.jdbc.batch_size=50                
48 
49          <!-- 是否自動提交事務  -->
50 
51          hibernate.connection.autocommit=true
52 
53          <!-- 指定hibernate在何時釋放JDBC連接  -->
54 
55          hibernate.connection.release_mode=auto
56 
57          <!-- 創建session方式 hibernate4.x 的方式  -->
58 
59          hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
60 
61          <!-- javax.persistence.validation.mode默認情況下是auto的,就是說如果不設置的話它是會自動去你的classpath下面找一個bean-validation**包,所以把它設置為none即可  -->
62 
63          javax.persistence.validation.mode=none            
64 
65       </value>
66 
67    </property>
68 
69 </bean>

 

針對少量實體類,還可以通過annotatedClasses屬性來講應用程序中所有的持久化類以全局定名的方式明確列出: 

 1 <property name="annotatedClasses">
 2 
 3    <list>
 4 
 5       <value>com.demo.entity.User</value>
 6 
 7       <value>com.demo.entity.Blog</value>
 8 
 9    </list>
10 
11 </property>

 

 推薦使用packagesToScan屬性掃描包方式。

【構建不依賴於spring的Hibernate代碼】

 1 package com.demo.dao;
 2 
 3  
 4 
 5 import org.hibernate.Session;
 6 
 7 import org.hibernate.SessionFactory;
 8 
 9 import org.springframework.beans.factory.annotation.Autowired;
10 
11 import org.springframework.stereotype.Repository;
12 
13  
14 
15 import com.demo.entity.User;
16 
17  
18 
19 @Repository
20 
21 public class UserDaoImpl implements IUserDao  {
22 
23  
24 
25    private SessionFactory sessionFactory;
26 
27   
28 
29    // 構造注入
30 
31    @Autowired
32 
33    public UserDaoImpl(SessionFactory sessionFactory) {
34 
35       this.sessionFactory = sessionFactory;
36 
37    }
38 
39   
40 
41    private Session currentSession(){
42 
43       return sessionFactory.getCurrentSession();
44 
45    }
46 
47   
48 
49    @Override
50 
51    public void addUser(User param) {
52 
53       Session session = currentSession();
54 
55       session.save(param);
56 
57       System.out.println("Add User");
58 
59    }
60 
61  
62 
63    @Override
64 
65    public User get(Integer id) {
66 
67       return (User) currentSession().get(User.class, id);
68 
69    }
70 
71  
72 
73    @Override
74 
75    public void save(User user) {
76 
77       currentSession().update(user);
78 
79    }
80 
81 }

 


還需配置: 

<context:component-scan base-package="com.demo.dao"/>

 

就會像掃描其他注解一樣掃描帶@Repository注解的類到容器中。

 

2.2、集成MyBatis方式

 1 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
 2 
 3    p:dataSource-ref="dataSource" p:configLocation="classpath:mybatis-config.xml"
 4 
 5    p:mapperLocations="classpath:com/demo/dao/*.xml" />
 6 
 7 <!-- spring與mybatis整合配置,掃描所有dao -->
 8 
 9 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
10 
11    p:basePackage="com.demo.dao" p:sqlSessionFactoryBeanName="sqlSessionFactory" />

 

3、與其他JPA集成方式 

3.1、配置實體管理工廠

l  應用程序管理類型的JPA(LocalEntityManagerFactoryBean):它的EntityManager是由EntityManagerFactory創建的;

l  容器管理類型的JPA(LocalContainerEntityManagerFactoryBean):通過PersistenceProvider的createEntityManagerFactory()方法得到,即它的EntityManagerFactory是通過PersistenceProvider的createContainerEntityManagerFactory()方法得到。

3.1.1、使用應用程序管理類型的JPA

絕大部分配置文件來源於名為persistence.xml的配置文件,這個文件位置必須位於類路徑下的WETA-INF目錄下


1
<?xml version="1.0" encoding="UTF-8"?> 2 3 <persistence version="2.0" 4 5 xmlns="http://java.sun.com/xml/ns/persistence" 6 7 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 8 9 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 10 11 12 13 <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 14 15 <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 16 17 <properties> 18 19 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 20 21 <property name="hibernate.max_fetch_depth" value="3"/> 22 23 <property name="hibernate.hbm2ddl.auto" value="update"/> 24 25 <property name="hibernate.jdbc.fetch_size" value="18"/> 26 27 <property name="hibernate.jdbc.batch_size" value="10"/> 28 29 <property name="hibernate.show_sql" value="false"/> 30 31 <property name="hibernate.format_sql" value="false"/> 32 33 </properties> 34 35 <class>com.demo.entity.User</class> 36 37 <class>com.demo.entity.Blog</class> 38 39 <!-- …… ……--> 40 41 </persistence-unit> 42 43 </persistence>

這樣在spring的配置文件中配置的信息就很少了:

1 <bean id="demo" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
2 
3    <property name="persistenceUnit" >
4 
5 </bean>

 

【TIPS】上面persistence.xml文件中的配置會出現問題: 

如果每次請求EntityManagerFactory時都要定義持久化單元,代碼回迅速膨脹,

借助spring對JPA的支持,不再需要直接處理PersistenceProvider了,就是下面的容器管理的JPA!

 

3.1.2、使用容器管理類型的JPA

    將數據源信息配置在spring的應用上下文中,而不是在persistence.xml文件中。

1 <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
2 
3    <property name="dataSource" ref="dataSource"/>
4 
5     <!-- 指定使用的是哪一個廠商的JPA實現 如Hibernate -->
6 
7    <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
8 
9 </bean>

 

配置JPA實現:

可選的有:EclipseLinkJpaVendorAdapter、HibernateJpaVendorAdapter、OpenJpaVendorAdapter、TopLinkJpaVendorAdapter

 

 1 <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
 2 
 3    <property name="database" value="MYSQL"/>
 4 
 5    <property name="showSql" value="true"/>
 6 
 7    <property name="generateDdl" value="true"/>
 8 
 9    <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
10 
11 </bean>

 

【TIPS】database屬性:屬性值表示支持哪種數據庫,下面Hibernate的JPA是一些支持的數據庫:

數據庫平台

屬性databased 

IBM DB2

DB2

H2

H2

MySQL

MYSQL

Oracle

ORACLE

SQL Server

SQLSERVER

Sybase

SYBASE

PostgresQL

POSTGRESQL

Hypersonic

HSQL

Apache Derby

DERBY

Informix

INFOMIX

 

【注】JNDI獲取實體管理工廠:

如果spring應用部署在應用服務器中,Spring可能已經創建好EntityManagerFactory並將其置於JNDI中等飯查詢使用,這種情況可使用JNDI來獲取對EntityManagerFactory的引用:

 1 <jee:jndi-lookup id="emf" jndi-name="persistence/testDS"/>  

3.1.3、編寫基於JPA的DAO

例子:

 1 package com.demo.dao;
 2 
 3  
 4 
 5 import javax.persistence.EntityManager;
 6 
 7 import javax.persistence.PersistenceContext;
 8 
 9  
10 
11 import org.springframework.stereotype.Repository;
12 
13 import org.springframework.transaction.annotation.Transactional;
14 
15  
16 
17 import com.demo.entity.User;
18 
19  
20 
21 @Repository
22 
23 @Transactional
24 
25 public class JpaDao implements IUserDao {
26 
27  
28 
29    // 注入EntityManager
30 
31    @PersistenceContext
32 
33    private EntityManager em;
34 
35   
36 
37    // 使用EntityManager
38 
39    @Override
40 
41    public void addUser(User param) {
42 
43       em.persist(param);
44 
45  
46 
47    }
48 
49 
50    @Override
51 
52    public User get(Integer id) {
53 
54       return em.find(User.class, id);
55 
56    }
57 
58 
59    @Override
60 
61    public void save(User user) {
62 
63       em.merge(user);
64 
65    }
66 
67 }

 


這樣用需要在spring的上下文配置文件中配置一個PersistenceAnnotationBeanPostProcessor:上面使用到了@PersistenceContext注解將EntityManager注入。

1 <!-- 使用EntityManager -->
2 
3 <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

 


以上,是如何使用JDBC、Hibernate或JPA為spring應用程序構建持久層,至於選擇哪種方案完全取決於偏好。 

 

三、Spring事務管理

通過回調機制將實際事務實現從事務性代碼中抽象出來。

3.1、選擇事務管理器

事務管理器結構

 

事務處理流程:

 

開始事務->綁定資源->使用資源->完成事務->釋放資源

3.1.1、JDBC事務
1 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
2 
3       <property name="dataSource" ref="dataSource"/>
4 
5 </bean>

 


3.1.2、Hibernate事務
DataSourceTransactionManager通過調用java.sql.Connection來管理事務,由java.sql.Connection對象來提交、回滾事務。

1 <bean id="transactionManager"
2 
3 class="org.springframework.orm.hibernate4.HibernateTransactionManager">
4 
5    <property name="sessionFactory" ref="sessionFactory" />
6 
7 </bean>

 

HibernateTransactionManager通過將事務管理的職責委托給org.hibernate.Transaction對象,org.hibernate.Transaction對象從Hibernate Session中獲取,然后由Transaction對象來提交、回滾事務。

3.1.3、JPA事務
1 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
2 
3    <property name="entityManagerFactory" ref="entityManagerFactory"/>
4 
5 </bean>

 

         如果你還希望將事務應用於簡單JDBC操作(JDBC操作使用的datasource和EntityManagerFactory使用的dataSource必須相同),那么JpaTransactionManager必須裝配一個JpaDialect的實現:JpaTransactionManager只需要裝配一個JPA實體管理工廠(EntityManagerFactory的任意實現),然后與由工廠產生的JPA EntityManager合作構建事務。

 1 <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
 2 
 3 <!--然后將jpaDialect裝配到transactionManager中 -->
 4 
 5 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
 6 
 7    <property name="entityManagerFactory" ref="entityManagerFactory"/>
 8 
 9    <property name="jpaDialect" ref="jpaDialect"/>
10 
11 </bean>

 

3.1.4、JTA事務

如果前面的事務管理器不能滿足需求或事物需要跨多個事務資源(兩個及以上數據庫),需要使用JtaTrasactionManager了:

1 <bean id="transactionManager"
2 
3    class="org.springframework.transaction.jta.JtaTransactionManager">
4 
5    <property name="transactionManagerName" value="java:/TrasactionManager"/>
6 
7 </bean>

 

         JtaTransactionManager將事務委托給一個JTA的實現(java.transaction.UserTransaction和javax.transaction.TransactionManager),通過UserTransaction來操作事務。JTA規定了應用程序暈一個或多個數據源之間協調事務的標准API,transactionManagerName屬性指定了要在JNDI上查找JTA事務管理器。

        

3.2、Spring事務實現方式

3.2.1、編碼事務

通過TransactionTemplate的回調機制,例如:(UserSeriveImpl.java)


1
public void addUser(final User u) { 2 3 TransactionTemplate temp = new TransactionTemplate(); 4 5 temp.execute(new TransactionCallback<Void>() { 6 7 @Override 8 9 public Void doInTransaction(TransactionStatus txtStatus) { 10 11 // 要執行的事務代碼 12 13 try { 14 15 userDao.save(u); 16 17 } catch (RuntimeException e) { 18 19 e.printStackTrace(); 20 21 txtStatus.setRollbackOnly(); 22 23 } 24 25 return null; 26 27 } 28 29 }); 30 31 }

此時UserService需要如下裝配:

 1 <bean id="userSerive" class="com.demo.service.UserServiceImpl">
 2 
 3    <property name="transactionTemplate">
 4 
 5       <bean class="org.springframework.transaction.support.TransactionTemplate">
 6 
 7          <property name="transactionManager" ref="transactionManager"/>
 8 
 9       </bean>
10 
11    </property>
12 
13 </bean>

 


缺點:侵入性的,事務控制在代碼中實現,耦合度高優點:可以完全控制事務邊界,精確控制事務。

3.2.2、聲明式事務

傳播行為

傳播行為回答了新的事務是該被啟動還是被掛起,或者方法是否要在事務環境中運行。

事務的傳播行為都在org.springframework.transaction.TransactionDefinition接口中以常量的方式定義出來。

隔離級別

隔離級別定義了一個事務可能受其他並發事務影響的程度。

隔離級別都在org.springframework.transaction.TransactionDefinition接口中以常量的方式定義出來。

只讀

事務啟動的時候由數據庫實施的,只有針對具備啟動一個新事務傳播行為(PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_NESTED)的方法來說才有意義。【tips】如果使用Hibernate,將事務聲明為只讀會導致flush模式被設置為FLUSH_NEVER,這會告訴hibernate避免和數據庫進行不必要的對象同步,並將所有的更新延遲到事務結束。

事務超時

         長時間事務會導致一些不必要的數據庫資源占用。

         超時時鍾會在事務開始時啟動,只有針對具備啟動一個新事務傳播行為(PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_NESTED)的方法來說才有意義。

回滾規則

         這些規則定義了哪些異常會導致事務回滾哪些不會,默認情況下,運行時異常會回滾,檢查異常不回滾,但是可以聲明事務遇到檢查異常回滾,運行時異常不回滾。

3.2.3、Spring在XML中定義事務

需要包括beans、aop、tx命名空間。


1
<tx:advice id="txAdvice" transaction-manager="transactionManager"> 2 3 <tx:attributes> 4 5 <!-- 事務執行方式 REQUIRED:指定當前方法必需在事務環境中運行, 6 7 如果當前有事務環境就加入當前正在執行的事務環境, 8 9 如果當前沒有事務,就新建一個事務。 這是默認值。 --> 10 11 <tx:method name="create*" propagation="REQUIRED" /> 12 13 <tx:method name="save*" propagation="REQUIRED" /> 14 15 <tx:method name="add*" propagation="REQUIRED" /> 16 17 <tx:method name="update*" propagation="REQUIRED" /> 18 19 <tx:method name="remove*" propagation="REQUIRED" /> 20 21 <tx:method name="del*" propagation="REQUIRED" /> 22 23 <tx:method name="import*" propagation="REQUIRED" /> 24 25 <!-- 指定當前方法以非事務方式執行操作,如果當前存在事務,就把當前事務掛起,等我以非事務的狀態運行完,再繼續原來的事務。 查詢定義即可 26 27 read-only="true" 表示只讀 --> 28 29 <tx:method name="*" propagation="NOT_SUPPORTED" read-only="true" /> 30 31 </tx:attributes> 32 33 </tx:advice>

其中<tx:method />有很多屬性用來幫助定義方法的事務策略:

隔離級別

含義

isolation

指定事務隔離級別

propagation

指定事務傳播規則

read-only

指定事務只讀

rollback-for

no-rollback-for

對哪些檢查異常進行回滾不提交

指定對哪些異常繼續執行不回滾

timeout

定義事務超時時間

 

3.2.4、定義注解驅動的事務

在XML配置文件中添加:

<tx:annotation-driven/>

 

可通過transaction-manager屬性(默認值"transactionManager")來指定事務管理器,如:

<tx:annotation-driven transaction-manager="txManager"/>

 

<tx:annotation-driven/>告訴Spring檢查上下文中所有bean並檢查使用到@Transactional注解的bean。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM