SpringBoot的自动配置真的让人又爱又恨,但还是爱更多一点。
SpringBoot想要帮我们自动配置好一切,但是有时候配置的却并不是我们需要的,甚至有时候会默默的坑我们。
我的项目是一个多数据源的项目(多数据源戳这里),其中有一个主数据源configDataSource,用来存放配置的库,我又新建了一个activitiDataSource,想要存放activiti的工作表。但是springboot却把configDataSource配置为了Activiti的库。
不想把activiti的自动配置关掉,毕竟用起来还是很方便的。那么只能更改springboot对activiti的默认配置了,经过实践可以使用如下方式:注释解释的很清楚了,就不啰嗦了。
/**
* @author kingboy--KingBoyWorld@163.com
* @date 2017/8/30 上午12:54
* @desc Activiti的数据和事物配置.
*/
@Configuration//声名为配置类,继承Activiti抽象配置类
public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration {
@Resource
DataSource activitiDataSource;//注入配置好的数据源
@Resource
PlatformTransactionManager activitiTransactionManager;//注入配置好的事物管理器
//注入数据源和事务管理器
@Bean
public SpringProcessEngineConfiguration springProcessEngineConfiguration(
SpringAsyncExecutor springAsyncExecutor) throws IOException {
return this.baseSpringProcessEngineConfiguration(activitiDataSource, activitiTransactionManager, springAsyncExecutor);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
到这里就搞定了,springboot就会使用我们声名的数据源来配置Activiti了。
下面附上我的数据源和事物管理器的配置。
配置文件:
#-----------------------------------数据源配置-----------------------------
#activiti数据源
spring.datasource.activiti.url=jdbc:mysql://localhost:3306/activiti?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.activiti.username=root
spring.datasource.activiti.password=123456
spring.datasource.activiti.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.activiti.maxActive=20
spring.datasource.activiti.initialSize=5
spring.datasource.activiti.minIdle=5
spring.datasource.activiti.maxWait=60000
spring.datasource.activiti.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.activiti.timeBetweenEvictionRunsMillis=60000
spring.datasource.activiti.minEvictableIdleTimeMillis=300000
spring.datasource.activiti.poolPreparedStatements=true
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
配置类
1.属性读取 ActivitiDataSourceProperties.java
package com.kingboy.activiti.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author kingboy
* @date 2017/6/19 下午5:15
* @desc configuration的数据池属性
*/
@ConfigurationProperties(prefix = "spring.datasource.activiti")
@Data
@Component
public class ActivitiDataSourceProperties {
private String url;
private String username;
private String password;
private String driverClassName;
private Integer maxActive;
private Integer initialSize;
private Integer minIdle;
private Integer maxWait;
private Integer maxPoolPreparedStatementPerConnectionSize;
private Integer timeBetweenEvictionRunsMillis;
private Integer minEvictableIdleTimeMillis;
private Boolean poolPreparedStatements;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 数据源和事物配置ActivitiJPAConfig.java
/**
* @author kingboy
* @date 2017/6/18 下午11:13
* @desc 数据源配置
*/
@Configuration
@EnableTransactionManagement//开启事物管理
@EnableJpaRepositories(//自定义数据管理的配置
//指定EntityManager的创建工厂Bean
entityManagerFactoryRef = "activitiEntityManagerFactory",
//指定事物管理的Bean
transactionManagerRef = "activitiTransactionManager",
//指定管理的实体位置
basePackages = {"com.kingboy.activiti.domain"})
public class ActivitiJPAConfig {
<span class="hljs-comment">/*
* 配置数据源
*/</span>
<span class="hljs-annotation">@Bean</span>
<span class="hljs-keyword">public</span> DataSource <span class="hljs-title">activitiDataSource</span>() {
DruidDataSource dataSource = <span class="hljs-keyword">new</span> DruidDataSource();
<span class="hljs-comment">//设置数据源的属性</span>
setDruidProperties(dataSource);
<span class="hljs-keyword">return</span> dataSource;
}
<span class="hljs-comment">//注入数据源配置信息</span>
<span class="hljs-annotation">@Autowired</span>
ActivitiDataSourceProperties config;
<span class="hljs-comment">//设置数据源的属性的方法</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setDruidProperties</span>(DruidDataSource dataSource) {
dataSource.setUrl(config.getUrl());
dataSource.setUsername(config.getUsername());
dataSource.setPassword(config.getPassword());
dataSource.setDriverClassName(config.getDriverClassName());
dataSource.setMaxActive(config.getMaxActive());
dataSource.setInitialSize(config.getInitialSize());
dataSource.setMinIdle(config.getMinIdle());
dataSource.setMaxWait(config.getMaxWait());
dataSource.setMaxPoolPreparedStatementPerConnectionSize(config.getMaxPoolPreparedStatementPerConnectionSize());
dataSource.setTimeBetweenEvictionRunsMillis(config.getTimeBetweenEvictionRunsMillis());
dataSource.setMinEvictableIdleTimeMillis(config.getMinEvictableIdleTimeMillis());
dataSource.setPoolPreparedStatements(config.getPoolPreparedStatements());
}
<span class="hljs-comment">/*
* 配置实体管理工厂Bean
*/</span>
<span class="hljs-annotation">@Bean</span>
<span class="hljs-keyword">public</span> LocalContainerEntityManagerFactoryBean <span class="hljs-title">activitiEntityManagerFactory</span>(EntityManagerFactoryBuilder builder) {
<span class="hljs-keyword">return</span> builder
.dataSource(activitiDataSource())
.packages(<span class="hljs-string">"com.kingboy.activiti.domain"</span>)<span class="hljs-comment">//设置实体类所在位置</span>
.persistenceUnit(<span class="hljs-string">"activiti"</span>)
.properties(getProperties(activitiDataSource()))<span class="hljs-comment">//设置hibernate通用配置</span>
.build();
}
<span class="hljs-comment">//注入spring自带的jpa属性类</span>
<span class="hljs-annotation">@Autowired</span>
<span class="hljs-keyword">private</span> JpaProperties jpaProperties;
<span class="hljs-comment">/*
*拿到hibernate的通用配置
*/</span>
<span class="hljs-keyword">private</span> Map<String, String> <span class="hljs-title">getProperties</span>(DataSource dataSource) {
<span class="hljs-keyword">return</span> jpaProperties.getHibernateProperties(dataSource);
}
<span class="hljs-comment">/*
*配置事物管理的Bean
*/</span>
<span class="hljs-annotation">@Bean</span>
<span class="hljs-keyword">public</span> PlatformTransactionManager <span class="hljs-title">activitiTransactionManager</span>(EntityManagerFactoryBuilder builder) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> JpaTransactionManager(activitiEntityManagerFactory(builder).getObject());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83