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 注解的類生效。
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注解