1. 程式人生 > >關於spring事務管理的配置方式

關於spring事務管理的配置方式

Spring事務配置方式有兩種:javaConfig的配置方式和基於Xml的配置方式,下面將介紹著兩種配置方式:

一,基於xml的配置方式 ①在xml檔案中配置資料來源:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
    <property name="driverClassName" value="com.mysql,jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/userdbcp?characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
    <property name="maxActive" value="20"/>
</bean>

②配置事務管理器:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 資料來源 -->
    <property name="dataSource" ref="dataSource"></property>
</bean>

③宣告事務切面的通知

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <!-- 傳播行為 -->
        <tx:method name="save*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="insert*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
        <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
        <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
</tx:advice>

④宣告事務切面

<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.zjh.e.service..*.*(..))"/>
</aop:config>

二,基於javaConfig的配置方式: ①配置資料來源:

@PropertySource(value = "classpath:config/dbconfig.properties")
@Configuration
/**在同樣的DataSource中,首先使用被標註的DataSource*/
@Primary
public class DruidDataSourceConfig{

    private Logger logger = LoggerFactory.getLogger(DruidDataSourceConfig.class);

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.name}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Value("${jdbc.driverClassName}")
    private String driverClassName;

    @Value("${jdbc.initialSize}")
     private Integer initialSize;

    @Value("${jdbc.minIdle}")
    private Integer minIdle;

    @Value("${jdbc.maxActive}")
    private Integer maxActive;

    @Value("${jdbc.maxWait}")
    private Integer maxWait;

    @Value("${jdbc.timeBetweenEvictionRunsMillis}")
    private Integer timeBetweenEvictionRunsMillis;

    @Value("${jdbc.minEvictableIdleTimeMillis}")
    private Integer minEvictableIdleTimeMillis;

    @Value("${jdbc.validationQuery}")
    private String validationQuery;

    @Value("${jdbc.testWhileIdle}")
    private Boolean testWhileIdle;

    @Value("${jdbc.testOnBorrow}")
    private Boolean testOnBorrow;

    @Value("${jdbc.testOnReturn}")
    private Boolean testOnReturn;

    @Value("${jdbc.poolPreparedStatements}")
    private Boolean poolPreparedStatements;

    @Value("${jdbc.maxPoolPreparedStatementPerConnectionSize}")
    private Integer maxPoolPreparedStatementPerConnectionSize;

    @Value("${jdbc.filters}")
    private String filters;

    @Value("${jdbc.connectionProperties}")
    private String connectionProperties;

    @Value("${jdbc.type}")
    private String type;

    @Bean(name = "dataSource")
    public DataSource dataSource() {
    DruidDataSource dataSource = new DruidDataSource();

    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setDriverClassName(driverClassName);
    dataSource.setInitialSize(initialSize);
    dataSource.setMinIdle(minIdle);
    dataSource.setMaxActive(maxActive);
    dataSource.setMaxWait(maxWait);
    dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
    dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
    dataSource.setValidationQuery(validationQuery);
    dataSource.setTestWhileIdle(testWhileIdle);
    dataSource.setTestOnBorrow(testOnBorrow);
    dataSource.setTestOnReturn(testOnReturn);
    dataSource.setPoolPreparedStatements(poolPreparedStatements);
    dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
    try{
        dataSource.setFilters(filters);
    }catch (SQLException e) {
        logger.error("druid configuration initialization filter", e);
    }
        dataSource.setConnectionProperties(connectionProperties);

        return dataSource;
    }

}

②配置事務管理器:


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.zjh.blog.dao")
@Import(ServiceConfig.class)
public class TransactionManagerConfig {

    @Bean
    public JpaTransactionManager transactionManager(
    EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager jpa = new JpaTransactionManager();
    jpa.setEntityManagerFactory(entityManagerFactory);
    return jpa;
    }

}

其中:@EnableTransactionManagement是開啟事務管理,在service層使用 @Transactional即可開啟對該方法或類的事務管理

兩者比較: ①xml配置: 優勢:集中配置,程式碼配置分離更加方便管理,支援目前所有的spring版本 劣勢:繁雜,編譯期不容易發現錯誤 ②javaConfig配置 優勢:程式碼簡潔, 劣勢:國內xml配置方式比較多,不容易被人接受,且必須使用spring3.0以上版本