zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    KMP的next[]数组
    [Gauss]HDOJ3976 Electric resistance
    [Gauss]POJ2065 SETI
    [Gauss]POJ2947 Widget Factory
    更好的 SQL 模式的 10 条规则
    BZOJ2460: [BeiJing2011]元素
    BZOJ2115: [Wc2011] Xor
    洛谷P3164 [CQOI2014]和谐矩阵
    POJ1222熄灯问题
    POJ1830开关问题
  • 原文地址:https://www.cnblogs.com/Sunnor/p/6629063.html
Copyright © 2011-2022 走看看