Spring Boot 自动配置数据源
SpringBoot连接数据库无论是关系型数据库mysql、 oracle 还是非关系型数据库redis 、mongdb等都非常方便,只需要在配置文件中添加需要的配置信息,在pom中添加相应的数据库starter启动器和Driver连接器。springBoot在启动的时候就自动给我们进行配置组装好了,用起来非常方便,可是springBoot自动配置的原理到底是什么,下面简要说明一下:
1. Spring Boot 配置
Spring Boot配置的包路径在org.springframework.boot.autoconfigure.jdbc
下面。
- 参考
DataSourceConfiguration
类,根据配置创建数据源,默认是使用Tomcat数据源,在DataSourceConfiguration.class
中配置Tomcat数据源如下:
@ConditionalOnClass({org.apache.tomcat.jdbc.pool.DataSource.class})
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"},
havingValue = "org.apache.tomcat.jdbc.pool.DataSource",
matchIfMissing = true
)
static class Tomcat {
Tomcat() {
}
@Bean
@ConfigurationProperties(
prefix = "spring.datasource.tomcat"
)
public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) {
org.apache.tomcat.jdbc.pool.DataSource dataSource = (org.apache.tomcat.jdbc.pool.DataSource)DataSourceConfiguration.createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class);
DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());
String validationQuery = databaseDriver.getValidationQuery();
if (validationQuery != null) {
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery(validationQuery);
}
return dataSource;
}
}
其中 spring.datasource.type
就指定数据源,比如常用的数据源有c3p0数据源,dbcp数据源等。这里tomcat的数据源为org.apache.tomcat.jdbc.pool.DataSource
。那么SpringBoot默认支持多少种数据源呢,在DataSourceConfiguration都有配置,除了默认的数据源,SpringBoot还可以支持自定义配置数据源,代码如下:
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"}
)
static class Generic {
Generic() {
}
@Bean
public DataSource dataSource(DataSourceProperties properties)
return properties.initializeDataSourceBuilder().build();
}
}
Spring Boot支持自定义数据源有一种机制:使用DataSourceBuilder创建数据源,利用反射创建对应type的数据源,并且绑定相关属性。这里使用的是建造者模式:properties.initializeDataSourceBuilder().build()
public DataSourceBuilder<?> initializeDataSourceBuilder() {
return DataSourceBuilder.create(this.getClassLoader()).type(this.getType()).driverClassName(this.determineDriverClassName()).url(this.determineUrl()).username(this.determineUsername()).password(this.determinePassword());
}
public T build() {
Class<? extends DataSource> type = this.getType();
DataSource result = (DataSource)BeanUtils.instantiateClass(type);
this.maybeGetDriverClassName();
this.bind(result);
return result;
}
2.数据库初始化 DataSourceInitialer:ApplicationListener
作用:
-
runSchemaScriptes()
:运行建表语句 -
runDataScripts()运行插入建表语句
默认只需要将文件命名为:
schema-*.sql 、data-*.sql
默认规则: schema.sql,shcema-all.sql
可以使用
schema:
-classpath:department.sql来制定位置
3.使用自定义Druid数据源
Druid数据源是阿里巴巴开发的一整套自动配置数据源模块,该模块整合了安全、监控、性能检测等功能,使用非常方便。
- 引入Druid数据源的Maven坐标
- yml文件中设置数据源类型为
type: com.alibaba.druid.pool.DruidDataSource
- 添加Servlet
-
//配置一个后台的Servlet @Bean public ServletRegistrationBean stateServlet() { ServletRegistrationBean servletRegistration = new ServletRegistrationBean (new StatViewServlet (), "/druid/*"); Map<String, String> initParams = new HashMap<> (); initParams.put ("jmxUsername", "admin"); initParams.put ("jmxPassword", "123456"); servletRegistration.setInitParameters (initParams); return servletRegistration; } ```
添加Filter
public FilterRegistrationBean getwebStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean ();
bean.setFilter (new WebStatFilter ());
Map<String, String> initParams = new HashMap<> ();
initParams.put ("exclusions", "*.js,*.css,*.html,/druid/*");
bean.setInitParameters (initParams);
bean.setUrlPatterns (Arrays.asList ("/*"));
return bean;
}