問題:
最近,在項目開發的過程中,遇到需要在properties文件中定義一些自定義的變量,以供java程序動態的讀取,不需要在進行查找修改代碼。只針對於Springboot 使用
開發環境:
SpringBoot 2.1.0.RELEASE
Maven 3.3.9
Jdk 1.8
Idea 2018.1.2
三種常用的配置方式:以讀取數據源的配置屬性為例
第一種 java通用的配置方式:利用@Value注解
第一步:用IDEA 工具快速構建一個springboot 的web project 目錄結構如下
第二步:pom文件 添加依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.bearhunting</groupId> <artifactId>configdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>configdemo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<!--采用的是阿里巴巴的druid數據源-->
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.8</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
第三步:創建要讀取得配置文件 jdbc.properties,並添加屬性值。
# 配置驅動 jdbc.driverClassName = com.mysql.jdbc.Driver # 數據庫連接得url jdbc.url = jdbc:mysql://localhost:3306/test # 連接數據庫的用戶名 jdbc.username = root # 鏈接數據庫得密碼 jdbc.password = root
第四步:獲取屬性值,注入屬性值
先創建一個配置類
package cn.bearhunting.configdemo.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import javax.sql.DataSource; /** * @ClassName: jdbcConfig * @discription: 數據源屬性配置 * @author: lele * @create: 2018-11-28 15:34 */ @Configuration @PropertySource("classpath:jdbc.properties") public class jdbcConfig { @Value("${jdbc.driverClassName}") private String driverClassName; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Bean public DataSource getDataSource(){ DruidDataSource dataSource =new DruidDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }
注解說明:
@Configration
用於定義聲明配置類,等同於xml配置文件
@PropertySource
可以點進去看源碼,里面有示例
@Value("${jdbc.driverClassName}")
讀取配置文件的屬性值
@Bean 配合@Configration使用,作用在方法上,相當於xml配置文件<bean><?bean>
第五步:測試類 DUG 測試結果
package cn.bearhunting.configdemo; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.sql.DataSource; @RunWith(SpringRunner.class) @SpringBootTest public class ApplicationTests { @Autowired private DataSource dataSource; @Test public void contextLoads() { System.out.println(dataSource); } }
獲取數據成功
第二種方法:springboot 的配置方式
第三步,要把jdbc.properties 文件名改成 application.properties (application.properties是springboot的默認的配置文件,會自動讀取)
第四步,創建一個JdbcProperties屬性配置類如下
package cn.bearhunting.configdemo.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; /** * @ClassName: JdbcProperties * @discription: * @author: lele * @create: 2018-11-28 16:25 */ @ConfigurationProperties(prefix = "jdbc") @Data public class JdbcProperties { private String driverClassName; private String url; private String username; private String password; }
@ConfigrationProperties(prefix = "jdbc")
指定前綴,屬性文件的屬性名和配置類的屬性名要完全一致;
@Data
了解一下lombok 此處不做說明,作用是不用寫set get 方法
第五步 將JdbcConfig 類進行改寫
package cn.bearhunting.configdemo.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; /** * @ClassName: jdbcConfig * @discription: 數據源屬性配置 * @author: lele * @create: 2018-11-28 15:34 */ @Configuration @EnableConfigurationProperties(JdbcProperties.class) public class jdbcConfig { @Bean public DataSource getDataSource(JdbcProperties jdbcProperties){ DruidDataSource dataSource =new DruidDataSource(); dataSource.setDriverClassName(jdbcProperties.getDriverClassName()); dataSource.setUrl(jdbcProperties.getUrl()); dataSource.setUsername(jdbcProperties.getUsername()); dataSource.setPassword(jdbcProperties.getPassword()); return dataSource; } }
注解說明:
@EnableConfigurationProperties(JdbcProperties.class)
開啟使用屬性配置類 JdbcProperties
最后獲取數據成功
第三種,最簡潔的一種
不需要屬性配置類 ,直接注入
package cn.bearhunting.configdemo.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; /** * @ClassName: jdbcConfig * @discription: 數據源屬性配置 * @author: lele * @create: 2018-11-28 15:34 */ @Configuration public class jdbcConfig { @Bean @ConfigurationProperties(prefix = "jdbc") public DataSource getDataSource(){ return new DruidDataSource(); } }