1.DataSource配置

1.1 默认配置application.xml

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=root
spring.datasource.password=****spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

需要在pom.xml加入依赖(我使用了mybatis+mysql)

      <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis-spring.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>   

   <dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <exclusions>
      <exclusion>
        <artifactId>tools</artifactId>
        <groupId>com.sun</groupId>
      </exclusion>
    </exclusions>
  </dependency>

2.自定义DataSource

1.1 application.xml配置文件

spring:application:name: data-multidatasourcedatasource:type: com.zaxxer.hikari.HikariDataSourceurl: jdbc:mysql://localhost:3306/testusername: sapassword: ****second-datasource:driver-class-name: org.hsqldb.jdbc.JDBCDriverurl: jdbc:hsqldb:mem:db2username: sapassword:****

1.2 自定义DataSource配置

@Configurationpublic classSencondDataSourceConfiguration {@Bean@ConfigurationProperties(prefix= "spring.datasource")publicDataSource newDataSource() {returnDataSourceBuilder.create().build();}@Bean(name= "secondDatasource")@ConfigurationProperties(prefix= "spring.second-datasource")publicDataSource secondDataSource() {returnDataSourceBuilder.create().build();}
}

3.工作原理

spring boot的auto-configuration最具魔力的地方是@EnableAutoConfiguration注解

通常注解application应用使用@SpringBootApplication或者如下自定义的方式:

@Configuration@EnableAutoConfiguration@ComponentScanpublic classApplication{}

@EnableAutoConfiguration注解开启了spring ApplicationContext的自动配置功能,

它通过扫描classpath下的组件,满足不同Conditions的bean注册到容器中。

spring boot提供了不同的AutoConfiguration实现类,这些类都在spring-boot-autoconfigure-{version}.jar中,用来注册各种各样的组件。

通常,当AutoConfiguration实现类打上@Configuration标签,可以作为spring配置类,当AutoConfiguration实现类打上@EnableConfigurationProperties标签,可以绑定自定义属性或者更多Conditional bean注册方法。

下面就org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration来分析一下:

/*** {@linkEnableAutoConfiguration Auto-configuration} for {@linkDataSource}.**@authorDave Syer*@authorPhillip Webb*@authorStephane Nicoll*@authorKazuki Shimizu*/@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class})public classDataSourceAutoConfiguration {private static final Log logger =LogFactory.getLog(DataSourceAutoConfiguration.class);@Bean@ConditionalOnMissingBeanpublicDataSourceInitializer dataSourceInitializer(DataSourceProperties properties,ApplicationContext applicationContext) {return newDataSourceInitializer(properties, applicationContext);}/*** Determines if the {@codedataSource} being used by Spring was created from* {@linkEmbeddedDataSourceConfiguration}.*@parambeanFactory the bean factory*@returntrue if the data source was auto-configured.*/public static booleancontainsAutoConfiguredDataSource(ConfigurableListableBeanFactory beanFactory) {try{BeanDefinition beanDefinition= beanFactory.getBeanDefinition("dataSource");return EmbeddedDataSourceConfiguration.class.getName().equals(beanDefinition.getFactoryBeanName());}catch(NoSuchBeanDefinitionException ex) {return false;}}@Conditional(EmbeddedDatabaseCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class})@Import(EmbeddedDataSourceConfiguration.class)protected static classEmbeddedDatabaseConfiguration {}@Configuration@Conditional(PooledDataSourceCondition.class)@ConditionalOnMissingBean({ DataSource.class, XADataSource.class})@Import({ DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Hikari.class,DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class})protected static classPooledDataSourceConfiguration {}@Configuration@ConditionalOnProperty(prefix= "spring.datasource", name = "jmx-enabled")@ConditionalOnClass(name= "org.apache.tomcat.jdbc.pool.DataSourceProxy")@Conditional(DataSourceAutoConfiguration.DataSourceAvailableCondition.class)@ConditionalOnMissingBean(name= "dataSourceMBean")protected static classTomcatDataSourceJmxConfiguration {@BeanpublicObject dataSourceMBean(DataSource dataSource) {if (dataSource instanceofDataSourceProxy) {try{return((DataSourceProxy) dataSource).createPool().getJmxPool();}catch(SQLException ex) {logger.warn("Cannot expose DataSource to JMX (could not connect)");}}return null;}}/*** {@linkAnyNestedCondition} that checks that either {@codespring.datasource.type}* is set or {@linkPooledDataSourceAvailableCondition} applies.*/static class PooledDataSourceCondition extendsAnyNestedCondition {PooledDataSourceCondition() {super(ConfigurationPhase.PARSE_CONFIGURATION);}@ConditionalOnProperty(prefix= "spring.datasource", name = "type")static classExplicitType {}@Conditional(PooledDataSourceAvailableCondition.class)static classPooledDataSourceAvailable {}}/*** {@linkCondition} to test if a supported connection pool is available.*/static class PooledDataSourceAvailableCondition extendsSpringBootCondition {@OverridepublicConditionOutcome getMatchOutcome(ConditionContext context,AnnotatedTypeMetadata metadata) {ConditionMessage.Builder message=ConditionMessage.forCondition("PooledDataSource");if (getDataSourceClassLoader(context) != null) {returnConditionOutcome.match(message.foundExactly("supported DataSource"));}returnConditionOutcome.noMatch(message.didNotFind("supported DataSource").atAll());}/*** Returns the class loader for the {@linkDataSource} class. Used to ensure that* the driver class can actually be loaded by the data source.*@paramcontext the condition context*@returnthe class loader*/privateClassLoader getDataSourceClassLoader(ConditionContext context) {Class<?> dataSourceClass = newDataSourceBuilder(context.getClassLoader()).findType();return (dataSourceClass == null ? null: dataSourceClass.getClassLoader());}}/*** {@linkCondition} to detect when an embedded {@linkDataSource} type can be used.* If a pooled {@linkDataSource} is available, it will always be preferred to an* {@codeEmbeddedDatabase}.*/static class EmbeddedDatabaseCondition extendsSpringBootCondition {private final SpringBootCondition pooledCondition = newPooledDataSourceCondition();@OverridepublicConditionOutcome getMatchOutcome(ConditionContext context,AnnotatedTypeMetadata metadata) {ConditionMessage.Builder message=ConditionMessage.forCondition("EmbeddedDataSource");if (anyMatches(context, metadata, this.pooledCondition)) {returnConditionOutcome.noMatch(message.foundExactly("supported pooled data source"));}EmbeddedDatabaseType type=EmbeddedDatabaseConnection.get(context.getClassLoader()).getType();if (type == null) {returnConditionOutcome.noMatch(message.didNotFind("embedded database").atAll());}return ConditionOutcome.match(message.found("embedded database").items(type));}}/*** {@linkCondition} to detect when a {@linkDataSource} is available (either because* the user provided one or because one will be auto-configured).*/@Order(Ordered.LOWEST_PRECEDENCE- 10)static class DataSourceAvailableCondition extendsSpringBootCondition {private final SpringBootCondition pooledCondition = newPooledDataSourceCondition();private final SpringBootCondition embeddedCondition = newEmbeddedDatabaseCondition();@OverridepublicConditionOutcome getMatchOutcome(ConditionContext context,AnnotatedTypeMetadata metadata) {ConditionMessage.Builder message=ConditionMessage.forCondition("DataSourceAvailable");if (hasBean(context, DataSource.class)|| hasBean(context, XADataSource.class)) {returnConditionOutcome.match(message.foundExactly("existing data source bean"));}if (anyMatches(context, metadata, this.pooledCondition,this.embeddedCondition)) {returnConditionOutcome.match(message.foundExactly("existing auto-configured data source bean"));}returnConditionOutcome.noMatch(message.didNotFind("any existing data source bean").atAll());}private boolean hasBean(ConditionContext context, Class<?>type) {returnBeanFactoryUtils.beanNamesForTypeIncludingAncestors(context.getBeanFactory(), type,true, false).length > 0;}}}

从上面看到,

1. DataSourceAutoConfiguration打上了@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })标签,这意味着只有当DataSource.class和EmbeddedDatabaseType.class出现在classpath时,DataSourceAutoConfiguration内的自动配置bean才可能被注册。

2. DataSourceAutoConfiguration打上了@EnableConfigurationProperties(DataSourceProperties.class)标签,意味着application.properties中的属性和DataSourceProperties类自动绑定了。

@ConfigurationProperties(prefix =DataSourceProperties.PREFIX)public class DataSourceProperties implementsBeanClassLoaderAware, EnvironmentAware, InitializingBean {public static final String PREFIX = "spring.datasource";......privateString driverClassName;privateString url;privateString username;privateString password;...//setters and getters
}

上面的配置类中说明,在application.properties中以spring.datasource开头的属性将自动绑定到DataSourceProperties对象上。其他注解,如@ConditionalOnMissingBean, @ConditionalOnClass and @ConditionalOnProperty等,标识只要条件满足,bean definition将注册到ApplicationContext中。

参考文件:

【1】http://www.liaoxuefeng.com/article/001484212576147b1f07dc0ab9147a1a97662a0bd270c20000

【2】https://dzone.com/articles/how-springboot-autoconfiguration-magic-works

转载于:https://www.cnblogs.com/davidwang456/p/6600550.html

spring boot自动配置之jdbc相关推荐

  1. Spring Boot自动配置与Spring 条件化配置

    SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...

  2. spring boot自动配置

    首先,一般的java Web项目需要很多配置,web配置(web.xml).spring配置(默认叫applicationContext.xml),非常繁琐 而spring-boot-starter是 ...

  3. Spring Boot自动配置原理

    要了解Spring Boot的自动配置首先我需要先了解Spring Boot的两个机制,一个是配置文件如何进入到系统变成属性,二是如何将这些属性加入到容器中. 首先我们需要有一个组件,这个组件中的属性 ...

  4. Spring Boot - 自动配置实例解读

    文章目录 Pre 启用 debug=true输出自动配置 HttpEncodingAutoConfiguration 什么情况下,Spring Boot 会自动装配 HttpEncodingAutoC ...

  5. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  6. Spring Boot自动配置原理分析

    一.写在前面 随着时间的迁移Spring Boot 越来越多的出现在Java 后端程序员的视野中,Spring Boot 之所以会那么流行,很大的一个原因是自身集成了很多的Bean,简化了传统Srin ...

  7. 芋道 Spring Boot 自动配置原理

    转载自  芋道 Spring Boot 自动配置原理 1. 概述 友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验.如果还没使用过 ...

  8. Spring Boot 自动配置的 “魔法” 是如何实现的?

    转载自  Spring Boot 自动配置的 "魔法" 是如何实现的? Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数 ...

  9. springboot自动配置原理_今日份学习之Spring Boot自动配置实现原理

    通过前面章节的学习,我们掌握了使用Spring Boot框架进行实际应用开发的方法.在使用Spring Boot 的过程中,我们时常会为一些看似简单,但实际上蕴藏了强大功能的实现而惊呼,下面就让我们来 ...

最新文章

  1. 车牌识别学习资料整理
  2. 腐烂国度2巨霸版计算机学知识,《腐烂国度2巨霸版》新手攻略 新手入门玩法技巧大全...
  3. 巧用事件查看器维护服务器安全
  4. LeetCode Algorithm 203. 移除链表元素
  5. autpmapper映射忽略某个属性
  6. 微课|中学生可以这样学Python(例11.1):tkinter电子时钟程序(2)
  7. css 左边阴影_css揭秘-用户体验
  8. VSCode打开文件中文乱码
  9. (官方win10PE使用)微软官方win10PE取出文件操作教学
  10. 2021年下半年软件设计师上午真题及答案解析
  11. Reed-Solomon纠错码(RS码)(里德-所罗门码)
  12. (ONENET+阿里云+datav+node+js+MYSQL+STM32)基于ONENET的大数据可视化平台搭建
  13. RRC连接、RL、RB、RAB的本质是什么?
  14. MySQL 修改数据表sql语句
  15. Linux内核的五大模块
  16. 数据结构 —— 单链表(超详细图解 接口函数实现)
  17. 悲剧:国际品牌大部分手机打不通救命电话,只通“911”
  18. Ubuntu下将python程序打包成可执行文件
  19. Power BI--DAX函数高阶
  20. java版坦克大战源码分享

热门文章

  1. linux c 多态原理,看了所谓的面向对象中靠继承多态实现的所谓重用 哥笑了
  2. Android中的Fragment
  3. 文本编辑器中实现自定义编辑框中字体和大小的功能
  4. linux wc -l 对io,linux设备驱动归纳总结(五):2.操作硬件——IO内存
  5. a eraser eraser还是an_eraser前面用a还是an
  6. 关联规则算法php,科学网—加权关联规则权值的计算 - 叶文菁的博文
  7. php将配置信息写入文件,Php写入配置文件的经典漏洞
  8. java多数做增删改查_Java 实现一个 能够 进行简单的增删改查的 超市管理系统
  9. pipfile和pipfile.lock、virtualenv、pipenv、pip
  10. visual studio 2019配置OnnxRuntime+推理+vgg16