[TOC]html
先給咱們的項目添加Spring-JDBC依賴和須要訪問數據庫的驅動依賴。java
spring.datasource.prod.driverClassName=com.mysql.jdbc.Driver spring.datasource.prod.url=jdbc:mysql://127.0.0.1:3306/prod spring.datasource.prod.username=root spring.datasource.prod.password=123456 spring.datasource.dev.driverClassName=com.mysql.jdbc.Driver spring.datasource.dev.url=jdbc:mysql://127.0.0.1:3306/dev spring.datasource.dev.username=root spring.datasource.dev.password=123456
首先創建Java配置類,爲其添加上註解@Configuration
。mysql
@Configuration public class JdbcConfig { }
@Primary
。由於在Spring Boot Jdbc的自動配置過程當中,會對於開發者透明地使用dataSource進行一些相關配置,因此當有兩個Datasource實現類時,Spring Boot將沒法肯定使用哪個。prodDataSource
和devDataSource
。@Bean @Primary @ConfigurationProperties(prefix = "spring.datasource.prod") public DataSource prodDataSource(){ return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.dev") public DataSource devDataSource(){ return DataSourceBuilder.create().build(); }
配置文件裏的屬性名是不須要寫成
spring.datasource.xxx
的形式的,寫成a.b.c.url
也沒有問題,只要在配置bean時指定前綴爲a.b.c
spring
JdbcTemplate
的實現,而是其實現接口JdbcOperations
。@Qualifier
註解指定該注入哪一個bean,默認名字爲定義該bean的方法名。@Bean public JdbcOperations prodJdbcOperations(@Qualifier("prodDataSource") DataSource prodDataSource) { return new JdbcTemplate(prodDataSource); } @Bean public JdbcOperations devJdbcOperations(@Qualifier("devDataSource") DataSource devDataSource) { return new JdbcTemplate(devDataSource); }
JdbcOperations
便可@Autowired private JdbcOperations devJdbcOperations; @Autowired private JdbcOperations prodJdbcOperations;
在項目入口類,添加如下註解開啓事務管理功能。sql
@EnableTransactionManagement
@Bean public PlatformTransactionManager prodTransactionManager(@Qualifier("prodDataSource") DataSource prodDataSource) { return new DataSourceTransactionManager(prodDataSource); } @Bean public PlatformTransactionManager devTransactionManager(@Qualifier("devDataSource") DataSource sitDataSource) { return new DataSourceTransactionManager(sitDataSource); }
使用時只需在須要事務的方法添加註解@Transactional
,並指定其value值便可。一樣的,value值與相應的方法名相匹配便可。數據庫
@Transactional(value = "prodTransactionManager") public void prod() { prodJdbcOperations.queryForList("SELECT * FROM USER"); } @Transactional(value = "devTransactionManager") public void dev() { devJdbcOperations.queryForList("SELECT * FROM USER"); }
注意,@Transactional配置事務有不少限制,如方法必須爲public,同一個類中無該註解的方法調用有註解的方法事務不生效等。該註解還能夠配置在接口類等地方,具體用法請參考Spring官方文檔相應章節 http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.htmlui