Springcloud學習筆記38--讀取 .properties 配置文件的工具類PropertyUtils和@ConfigurationProperties讀取yaml文件中配置的數據庫連接池druid屬性


1.讀取 .properties 配置文件的工具類PropertyUtils

項目中經常將一些配置信息放到properties文件中,讀取非常方便,下面介紹幾種java讀取properties配置文件的方式。先看示例的properties文件:

通過jdk提供的java.util.Properties類,基於ClassLoder讀取配置文件,實現properties文件的讀取。

1.1 Properties類

public class Properties extends Hashtable<Object,Object>

此類繼承自java.util.HashTable,即實現了Map接口,所以,可使用相應的方法來操作屬性文件,但不建議使用像put、putAll這 兩個方法,因為put方法不僅允許存入String類型的value,還可以存入Object類型的。因此java.util.Properties類提 供了getProperty()和setProperty()方法來操作屬性文件,同時使用store或save(已過時)來保存屬性值(把屬性值寫 入.properties配置文件)

1.1.1 load方法

public void load(InputStream inStream) throws IOException

從輸入字節流讀取屬性列表(鍵和元素對)。

1.1.2 getProperty方法

public String getProperty(String key)

使用此屬性列表中指定的鍵搜索屬性。

1.2. 可根據不同的方式來獲取InputStream

(1)通過當前類加載器的getResourceAsStream方法獲取

InputStream inputStream=PropertyUtil.class.getClassLoader().getResourceAsStream("flep.properties");

(2)從文件獲取

InputStream inStream = new FileInputStream(new File("filePath"));  

1.3.案例

源碼:

package com.ttbank.flep.core.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @Author lucky
 * @Date 2021/12/7 18:15
 */
public class PropertyUtil {
    public static Properties properties;

    static {
        loadProperties();
    }

    synchronized private static void loadProperties() {
        properties=new Properties();
        InputStream inputStream=null;
        try {
            inputStream=PropertyUtil.class.getClassLoader().getResourceAsStream("flep.properties");
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String getProperties(String key){
        if(properties==null){
            loadProperties();
        }
        return properties.getProperty(key);
    }

    public static void main(String[] args) {
        System.out.println(getProperties("name"));
    }
}

項目結構:

 控制台輸出:

2.@ConfigurationProperties讀取yaml文件中配置的屬性

2.1 @Configuration、@ConfigurationProperties、@EnableConfigurationProperties

2.1.1 @Configuration

@Configuration用於定義配置類,可替換xml配置文件,被注解的類內部包含有一個或多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。

  • @Configuration配置spring並啟動spring容器
  • @Configuration啟動容器+@Bean注冊Bean
  • @Configuration啟動容器+@Component注冊Bean

使用 AnnotationConfigApplicationContext 注冊 AppContext 類的兩種方法
配置Web應用程序(web.xml中配置AnnotationConfigApplicationContext)

2.1.2 @Component和@Bean注解

(1)@Component

@Component注解表明一個類會作為組件類,並告知Spring要為這個類創建bean。

注意:如果一個類添加了@Component注解,則這個類可以使用@Autowired注解注入;

@Bean注解告訴Spring這個方法將會返回一個對象,這個對象要注冊為Spring應用上下文中的bean。通常方法體中包含了最終產生bean實例的邏輯。

兩者的目的是一樣的,都是注冊bean到Spring容器中。

2.1.3 @ConfigurationProperties

有時候有這樣子的情景,我們想把配置文件的信息,讀取並自動封裝成實體類,這樣子,我們在代碼里面使用就輕松方便多了,這時候,我們就可以使用@ConfigurationProperties,它可以把同類的配置信息自動封裝成實體類。

2.1.4 @EnableConfigurationProperties

@EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的類生效。

如果一個配置類只配置@ConfigurationProperties注解,而沒有使用@Component,那么在IOC容器中是獲取不到properties 配置文件轉化的bean。說白了 @EnableConfigurationProperties 相當於把使用 @ConfigurationProperties 的類進行了一次注入。

2.2 入門案例

(1)在配置文件中配置如下信息:

flep:
  cluster_name: cluster5
  subsys_code: STPM
  contentId: 10000001

(2)定義一個實體類在裝載配置文件信息

@Component
@ConfigurationProperties(prefix = "flep")
@Data
public class FileUaProperties {

    private String clusterName;

    private String subsysCode;

    private String contentId;

}

(3)在controller中進行實際使用測試。

/**
 * @Author lucky
 * @Date 2022/1/18 15:43
 */
@Slf4j
@RestController
@RequestMapping("/test/properties")
public class ConfigurationPropertiesController{
    @Autowired
    FileUaProperties fileUaProperties;

    @PostMapping("/getProperties")
    public void getProperties(){
        log.info(fileUaProperties.getClusterName());
        log.info(fileUaProperties.getSubsysCode());
        log.info(fileUaProperties.getContentId());
    }
}

控制台輸出:

注意:

(1) @ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的寫法更為方便。當需要注入多個前綴的內容考慮使用@Value注解

(2) @ConfigurationProperties 的 POJO類的命名比較嚴格,因為它必須和prefix的后綴名要一致, 不然值會綁定不上, 特殊的后綴名是“driver-class-name”這種帶橫杠的情況,在POJO里面的命名規則是 下划線轉駝峰 就可以綁定成功

 2.3 配置數據庫連接池DruidDataSource

(1)在配置文件中配置如下信息:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource

    #druid連接池配置
    druid:
      url: jdbc:mysql://localhost:3306/day1?serverTimezone=Asia/Shanghai&useSSL=false
      username: root
      password: plj***
      driver-class-name: com.mysql.cj.jdbc.Driver
      #初始化連接大小
      initial-size: 5
      #最大連接池數量
      max-active: 20
      #最小連接池數量
      min-idle: 3
      #配置獲取連接等待超時時間,單位毫秒
      max-wait: 60000
      #配置間隔多久才進行一次檢查看,檢查需要關閉的空閑連接,單位毫秒
      time-between-eviction-runs-millis: 60000
      #配置一個連接在池中最小的生存時間,單位毫秒
      min-evictable-idle-time-millis: 300000
      validation-query: select 'x'
      #建議配置為true,不影響性能,並且保證安全性,申請連接的時候檢測
      test-while-idle: true
      #獲取連接時執行檢測,建議關閉,影響性能
      test-on-borrow: false
      #歸還連接時執行檢測,建議關閉,影響性能
      test-on-return: false
      #檢測連接是否有效的超時時間
      validation-query-timeout: 10

(2)定義一個實體類在裝載配置文件信息

這個類中的每個注解用處說明:

@Data 生成get/set方法

@Component 將這個類交給spring容器管理,這樣就可以用@autowired注解自動注入

@ConfigurationProperties 讀取yaml文件的屬性項,將這些屬性值設置到spring 管理的這個類的bean中

package com.ttbank.flep.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @Author lucky
 * @Date 2022/3/31 10:22
 */
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DataSourceProperties {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
    private int initialSize;
    private int minIdle;
    private int maxActive=100;
    private long maxWait;
    private long timeBetweenEvictionRunsMillis;
    private long minEvictableIdleTimeMillis;
    private String validationQuery;
    private boolean testWhileIdle;
    private boolean testOnBorrow;
    private boolean testOnReturn;
    
}

 (3)數據庫連接池配置類

package com.ttbank.flep.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * @Author lucky
 * @Date 2022/4/1 9:18
 */
@Configuration
public class DruidConfig {
    @Autowired
    private DataSourceProperties dataSourceProperties;

    @Bean
    public DataSource druidDataSource(){
        DruidDataSource druidDataSource=new DruidDataSource();
        druidDataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
        druidDataSource.setUrl(dataSourceProperties.getUrl());
        druidDataSource.setUsername(dataSourceProperties.getUsername());
        druidDataSource.setPassword(dataSourceProperties.getPassword());
        druidDataSource.setInitialSize(dataSourceProperties.getInitialSize());
        druidDataSource.setMinIdle(dataSourceProperties.getMinIdle());
        druidDataSource.setMaxActive(dataSourceProperties.getMaxActive());
        druidDataSource.setMaxWait(dataSourceProperties.getMaxWait());
        druidDataSource.setTimeBetweenEvictionRunsMillis(dataSourceProperties.getTimeBetweenEvictionRunsMillis());
        druidDataSource.setMinEvictableIdleTimeMillis(dataSourceProperties.getMinEvictableIdleTimeMillis());
        druidDataSource.setValidationQuery(dataSourceProperties.getValidationQuery());
        druidDataSource.setTestWhileIdle(dataSourceProperties.isTestWhileIdle());
        druidDataSource.setTestOnBorrow(dataSourceProperties.isTestOnBorrow());
        druidDataSource.setTestOnReturn(dataSourceProperties.isTestOnReturn());

        try {
            druidDataSource.init();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return druidDataSource;
    }

}

(4)debug模式啟動項目

參考文獻:

https://www.cnblogs.com/sebastian-tyd/p/7895182.html

https://www.cnblogs.com/s3189454231s/p/5626557.html

https://www.cnblogs.com/liaojie970/p/8043150.html----@ConfigurationProperties推薦。

https://www.jianshu.com/p/7f54da1cb2eb---推薦

https://blog.csdn.net/weixin_44313584/article/details/109393005---詳解@Configuration注解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM