學記:spring boot使用官網推薦以外的其他資料來源druid

Gin.p發表於2016-12-20

  雖然spring boot提供了4種資料來源的配置,但是如果要使用其他的資料來源怎麼辦?例如,有人就是喜歡druid可以監控的強大功能,有些人專案的需要使用c3p0,那麼,我們就沒辦法了嗎?我們就要程式設計式新建一個資料來源了嗎?不用了!spring boot 1.4.1.RELEASE為我們提供了簡潔的方式使用自己想要的資料來源。

  網上也有其他資料來源的配置方法,但是都是程式設計式新建一個資料來源,太繁瑣了。我在這裡記錄一下官網的做法:

1、Configure a DataSource

官網介紹:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-configure-a-datasource

@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DruidConfiguration {

    @Bean
    @ConfigurationProperties(prefix="spring.datasource.druid")
    public DataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder()
                // additional customizations
                .build();
    }
}

說明:@ConfigurationProperties(prefix="spring.datasource.druid"),字首可以自己隨意。

2、配置檔案

spring:
    datasource:
        name: test
        url: jdbc:mysql://localhost:3306/test
        username: root
        password: root
        # 使用druid資料來源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        druid:
          filters: stat,wall,log4j
          maxActive: 20
          initialSize: 1
          maxWait: 60000
          minIdle: 1
          timeBetweenEvictionRunsMillis: 60000
          minEvictableIdleTimeMillis: 300000
          validationQuery: SELECT 1 FROM DUAL
          testWhileIdle: true
          testOnBorrow: false
          testOnReturn: false
          poolPreparedStatements: true
          maxOpenPreparedStatements: 20

  以上步驟就配置好druid了,在驗證druid的配置屬性是否有成功注入的時候,可以注入DataSource,斷點觀察DataSource的屬性validationQuery是否和你寫的一樣。

3、配置提示

有強迫症可以看看,這個是配置提示的功能,不是必要項。

新增依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

在resources下新建META-INF,在建一個additional-spring-configuration-metadata.json檔案

{
  "properties": [
    {
      "name": "spring.datasource.druid.maxActive",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.maxActive."
    },
    {
      "name": "spring.datasource.druid.initialSize",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.initialSize."
    },
    {
      "name": "spring.datasource.druid.filters",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.filters."
    },
    {
      "name": "spring.datasource.druid.maxWait",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.maxWait."
    },
    {
      "name": "spring.datasource.druid.minIdle",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.minIdle."
    },
    {
      "name": "spring.datasource.druid.timeBetweenEvictionRunsMillis",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.timeBetweenEvictionRunsMillis."
    },
    {
      "name": "spring.datasource.druid.minEvictableIdleTimeMillis",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.minEvictableIdleTimeMillis."
    },
    {
      "name": "spring.datasource.druid.validationQuery",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.validationQuery."
    },
    {
      "name": "spring.datasource.druid.testWhileIdle",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.testWhileIdle."
    },
    {
      "name": "spring.datasource.druid.testOnBorrow",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.testOnBorrow."
    },
    {
      "name": "spring.datasource.druid.testOnReturn",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.testOnReturn."
    },
    {
      "name": "spring.datasource.druid.poolPreparedStatements",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.poolPreparedStatements."
    },
    {
      "name": "spring.datasource.druid.maxOpenPreparedStatements",
      "type": "java.lang.String",
      "description": "Description for spring.datasource.druid.maxOpenPreparedStatements."
    }
  ]
}
View Code

這樣在使用druid的時候IDEA就會出現提示了。

注意:如果沒有出現提示,可以斷點資料來源,觀察相應的配置就行了(大概):)

 4、druid監控

網上有很多例子,這個就不多說了。

/**
     * 註冊一個StatViewServlet
     * @return
     */
    @Bean
    public ServletRegistrationBean druidStatViewServle(){
        //org.springframework.boot.context.embedded.ServletRegistrationBean提供類的進行註冊.
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");

        //新增初始化引數:initParams

        //白名單:
        //servletRegistrationBean.addInitParameter("allow","127.0.0.1");
        //IP黑名單 (存在共同時,deny優先於allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
        //servletRegistrationBean.addInitParameter("deny","192.168.1.73");
        //登入檢視資訊的賬號密碼.
        //servletRegistrationBean.addInitParameter("loginUsername","admin2");
        //servletRegistrationBean.addInitParameter("loginPassword","123456");
        //是否能夠重置資料.
        servletRegistrationBean.addInitParameter("resetEnable","false");
        return servletRegistrationBean;
    }

    /**
     * 註冊一個:filterRegistrationBean
     * @return
     */
    @Bean
    public FilterRegistrationBean druidStatFilter(){

        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());

        //新增過濾規則.
        filterRegistrationBean.addUrlPatterns("/*");

        //新增不需要忽略的格式資訊.
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
View Code

怎麼使用可以看druid官網。

相關文章