Spring Boot 自动配置数据源

6 篇文章 0 订阅
4 篇文章 0 订阅

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;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值