關於spring事務管理的配置方式
阿新 • • 發佈:2018-12-12
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以上版本