springboot中的数据源自动配置以及druid的整合
作者:互联网
一、springboot中使用数据源的依赖
(1)、JDBC启动器
(2)、数据库连接依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
二、数据源自动装配源码查看逻辑
在springboot自动装配原理中已经大概整理了springboot自动装配的逻辑,springboot已经内置了DataSourceAutoConfiguration这个自动配置类。找到自动配置类以后,重点看两个东西:①、@EnableConfigurationProperties注解,这个注解能帮助我们了解能够在springboot配置文件中设置哪些参数。②、去找@Bean注解修饰的方法或者@Configuration修饰的内部类,这个注解能够帮助我们了解springboot托管了哪些bean。
按照上述逻辑,一个个去找,首先是自动配置类。
@Configuration(proxyBeanMethods = false) // 需要导入DataSource类,还得确保有EmbeddedDatabaseType类 @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory") // 第一个重点,需要配数据源参数时候,就去找DataSourceProperties @EnableConfigurationProperties(DataSourceProperties.class) @Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class }) public class DataSourceAutoConfiguration {}
接下来,循着之前的逻辑,点进去看看DataSourceProperties.class , 这里注意一下,最好去看set方法后面的参数名,真正注入还是看他
// 看到这里我们就知道了,配置前缀为spring.datasource @ConfigurationProperties(prefix = "spring.datasource") public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean { // 这里我只挑了最基本的、最重要的四个参数 // 也就是配置数据库连接的驱动、url、用户名以及密码 // 比如配驱动 spirng.datasource.driverClassName = com.mysql.jbdc.Driver private String driverClassName; private String url; private String username; private String password; }
看完配置,接下来看看springboot默认是怎么去装配数据源的,这里主要是使用了@Configuration,因为有个筛选的过程
@Configuration(proxyBeanMethods = false) @Conditional(PooledDataSourceCondition.class) @ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) // Import的作用就不说了,这里看到了居然要去配置这么多数据源?但其是,里面有个筛选的逻辑,springboot默认使用hikari数据源,和c3p0、druid、dbcp都是一个东西,就是管理数据库连接的池子 @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class, DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class }) protected static class PooledDataSourceConfiguration { }
点Hikari.class进去看看,里面有筛选的逻辑
// 这里的configuration是对hikari的装配 @Configuration(proxyBeanMethods = false) // 去使用hikari首先需要有hikari的依赖,starter中正好集成了hikari @ConditionalOnClass(HikariDataSource.class) // IOC中不能有数据源,避免产生混淆 @ConditionalOnMissingBean(DataSource.class) // 最关键的一步,你可以引入多个数据源,但需要在配置文件中说明使用的类型,默认使用的是hikari @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true) static class Hikari { // 这里的实例化还是很简单的,就是去配置properties @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") HikariDataSource dataSource(DataSourceProperties properties) { HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class); if (StringUtils.hasText(properties.getName())) { dataSource.setPoolName(properties.getName()); } return dataSource; } }
三、总结
相较于其他的自动装配,数据源的自动装配逻辑就是最常规的那一套,而且整体源代码简单,可以通过这个例子对Springboot的自动装配有个更深入的逻辑理解。
总结一下,要让sb帮你完成数据源的自动装配,你需要完成这几部:导入必须的依赖以及想要使用的数据源依赖,配置选定的数据源类型,根据业务需要配置数据源参数。
四、Druid与springboot的整合
相关的starter已经有了,所以要使用可以去直接导入。这里主要是按照上面的逻辑尝试自己去注册druid数据源,并完成后台监控的设置。
大概整理一下思路:首先需要一个java configuration类去注册DruidDataSource;然后由于druid有自己的一些参数,所以需要去指定一下配置文件中的参数设置;然后再去设置后台监控,这里也有一个有意思的点,就是springboot怎么和java web中的servlet和filter进行统一。
// 放弃autoConfiguration , 自己管理druid // 主要为了配置那些DataSourceProperties中缺失的参数 @Bean
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.alibaba.druid.pool.DruidDataSource",
matchIfMissing = true)
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource dataSource(){ DruidDataSource dataSource = new DruidDataSource(); return dataSource; }
开启后台监控,druid最优先的一点就是可以进行监控、过滤以及防护(差不多那意思)。要想使用后台监控,需要做这么两点:1、允许使用后台监控(网上一大堆);2、注册servlet。
提到了servlet注册,就来说说这个知识点,其实filter也是一样的。spring使用一个DispatcherServlet帮助我们进行原来的servlet访问,sb通过controller和视图解析器简化了我们原来的工作。但我们其实还是能够注册自己的servlet。这里就用druid的监控servlet来说明。
// springboot中配置servlet的操作 // 这里是为配置druid的后台操作 // 需要一个注册bean对象 @Bean public ServletRegistrationBean statViewServlet(){ // 实例化注册bean对象 // 这里的StatViewServlet就是alibaba提供的一个servlet // 第二参数是配置路由 ServletRegistrationBean<StatViewServlet> registration = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); // 登录这个页面肯定需要密码吧 // 我们可以通过类似于web.xml中的init-param来配置参数 HashMap<String, String> initMap = new HashMap<>(); // 看源码!! // druid后台需要登录密码
// 这些都可以去查看ali提供的源码来知道可以配哪些参数啦
initMap.put("loginUsername", "admin"); initMap.put("loginPassword", "123456"); // 还可以配置访问权限 initMap.put("allow", ""); // 设置禁止访问 // initMap.put("deny", ""); registration.setInitParameters(initMap); return registration; }
访问监控页面:ip:port/druid/*即可
标签:springboot,数据源,配置,druid,hikari,class 来源: https://www.cnblogs.com/averson33/p/14458710.html