This commit is contained in:
trang
2017-11-23 17:44:26 +08:00
parent 7b79dbccff
commit d5cfda3daa
12 changed files with 24 additions and 119 deletions
@@ -7,7 +7,7 @@
<parent>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot-actuator</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>
<artifactId>druid-spring-boot-actuator-autoconfigure</artifactId>
@@ -7,7 +7,7 @@
<parent>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot-actuator</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>
<artifactId>druid-spring-boot-actuator-starter</artifactId>
+1 -1
View File
@@ -7,7 +7,7 @@
<parent>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot-parent</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>
<artifactId>druid-spring-boot-actuator</artifactId>
@@ -7,7 +7,7 @@
<parent>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot-example</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>
<artifactId>druid-spring-boot-mybatis-example</artifactId>
@@ -14,7 +14,7 @@ import org.springframework.context.ApplicationContext;
*
* @author trang
*/
@SpringBootApplication(scanBasePackages = "com.github.trang.druid.example")
@SpringBootApplication
@MapperScan("com.github.trang.druid.example.mapper")
public class DruidSpringBootStarterApplication implements CommandLineRunner {
+1 -1
View File
@@ -7,7 +7,7 @@
<parent>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot-parent</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>
<artifactId>druid-spring-boot-example</artifactId>
@@ -7,7 +7,7 @@
<parent>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>
<artifactId>druid-spring-boot-autoconfigure</artifactId>
@@ -12,27 +12,20 @@ import com.alibaba.druid.wall.WallFilter;
import com.github.trang.druid.autoconfigure.datasource.DruidDataSource2;
import com.github.trang.druid.autoconfigure.properties.DruidDataSourceProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.*;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.bind.PropertySourcesBinder;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.*;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Import;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -49,12 +42,9 @@ import static com.github.trang.druid.autoconfigure.properties.DruidDataSourcePro
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DataSourceProperties.class, DruidDataSourceProperties.class})
@Import({DruidServletConfiguration.class, DruidStatConfiguration.class})
@Import({DruidDataSourceConfiguration.class, DruidServletConfiguration.class, DruidStatConfiguration.class})
@Slf4j
public class DruidAutoConfiguration implements BeanFactoryAware, EnvironmentAware {
private DefaultListableBeanFactory beanFactory;
private ConfigurableEnvironment environment;
public class DruidAutoConfiguration {
@Bean
@ConditionalOnProperty(prefix = DRUID_STAT_FILTER_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
@@ -120,52 +110,9 @@ public class DruidAutoConfiguration implements BeanFactoryAware, EnvironmentAwar
return new CommonsLogFilter();
}
/**
* 自动注入单数据源
*
* @condition 1. BeanFactory 中不存在 DruidDataSource 类型的 bean
* @condition 2. BeanFactory 中不存在 'dataSource' 名称的 bean
* @condition 3. 配置文件中不存在以 'spring.datasource.druid.data-source' 开头的属性
* @return DruidDataSource dataSource
*/
@Bean(initMethod = "init", destroyMethod = "close")
@ConditionalOnMissingBean(value = DataSource.class, name = "dataSource")
@Conditional(DataSourceCondition.class)
public DruidDataSource dataSource() {
log.debug("druid data-source init...");
return new DruidDataSource2();
}
/**
* 自动注入多数据源
*
* @condition 1. BeanFactory 中不存在 DruidDataSource 类型的 bean
* @condition 2. 配置文件中存在以 'spring.datasource.druid.data-source' 开头的属性
* @return Map dataSourceMap/druidDataSourceMap
*/
@Bean
@Conditional(DataSourcesCondition.class)
public Map<String, DruidDataSource> dataSourceMap(DruidDataSourceProperties druidDataSourceProperties) {
druidDataSourceProperties.getDataSources().forEach((dataSourceName, dataSourceConfig) -> {
// 构造 BeanDefinition,通过 DruidDataSource2 实现继承 'spring.datasource.druid' 的配置
BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DruidDataSource2.class)
.setInitMethodName("init")
.setDestroyMethodName("close")
.getBeanDefinition();
// 注册 BeanDefinition
beanFactory.registerBeanDefinition(dataSourceName, beanDefinition);
String lowerCaseName = dataSourceName.toLowerCase();
// 当 beanName 不是以 datasource 结尾时,增加别名
if (!lowerCaseName.endsWith("datasource") && !lowerCaseName.endsWith("data-source")) {
// 注册 Alias
beanFactory.registerAlias(dataSourceName, dataSourceName + "DataSource");
}
// 将 'spring.datasource.druid.data-sources.$dataSourceName' 的配置绑定到 Bean
DruidDataSource2 dataSource = beanFactory.getBean(dataSourceName, DruidDataSource2.class);
PropertySourcesBinder propertySourcesBinder = new PropertySourcesBinder(environment);
propertySourcesBinder.bindTo("spring.datasource.druid.data-sources." + dataSourceName, dataSource);
log.debug("druid {}-data-source init...", dataSourceName);
});
@ConditionalOnBean(DruidDataSource.class)
public Map<String, DruidDataSource> dataSourceMap(ConfigurableListableBeanFactory beanFactory) {
return new HashMap<>(beanFactory.getBeansOfType(DruidDataSource2.class));
}
@@ -183,42 +130,4 @@ public class DruidAutoConfiguration implements BeanFactoryAware, EnvironmentAwar
return new ArrayList<>(dataSourceMap.values());
}
static class DataSourceCondition extends SpringBootCondition {
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(context.getEnvironment(), "spring.datasource.druid.");
Map<String, Object> properties = resolver.getSubProperties("data-sources");
if (!properties.isEmpty()) {
return ConditionOutcome.noMatch("find 'data-sources' properties");
}
return ConditionOutcome.match();
}
}
static class DataSourcesCondition extends SpringBootCondition {
@Override
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(context.getEnvironment(), "spring.datasource.druid.");
Map<String, Object> properties = resolver.getSubProperties("data-sources");
if (properties.isEmpty()) {
return ConditionOutcome.noMatch("can't find 'data-sources' properties");
}
return ConditionOutcome.match();
}
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = (DefaultListableBeanFactory)beanFactory;
}
@Override
public void setEnvironment(Environment environment) {
this.environment = (ConfigurableEnvironment)environment;
}
}
@@ -4,7 +4,6 @@ import com.github.trang.druid.autoconfigure.datasource.DruidDataSource2;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import java.util.HashMap;
import java.util.Map;
@@ -33,17 +32,14 @@ public class DruidDataSourceProperties {
public static final String DRUID_WEB_STAT_PREFIX = "spring.datasource.druid.web-stat";
public static final String DRUID_AOP_STAT_PREFIX = "spring.datasource.druid.aop-stat";
@NestedConfigurationProperty
DruidConfigFilterProperties config = new DruidConfigFilterProperties();
@NestedConfigurationProperty
DruidStatViewServletProperties statViewServlet = new DruidStatViewServletProperties();
@NestedConfigurationProperty
DruidWebStatProperties webStat = new DruidWebStatProperties();
@NestedConfigurationProperty
DruidAopStatProperties aopStat = new DruidAopStatProperties();
Map<String, DruidDataSource2> dataSources = new HashMap<>(16);
@Getter@Setter
@Getter
@Setter
public static class DruidConfigFilterProperties {
/** 是否开启 druid config-filter,默认否 */
private boolean enabled;
@@ -7,7 +7,7 @@
<parent>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>
<artifactId>druid-spring-boot-starter</artifactId>
+1 -1
View File
@@ -7,7 +7,7 @@
<parent>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot-parent</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
</parent>
<artifactId>druid-spring-boot</artifactId>
+1 -1
View File
@@ -5,7 +5,7 @@
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot-parent</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Druid Spring Boot Starter</name>