springboot之properties

本例將採用maven管理,代碼託管在github上,地址:https://github.com/wolf909867753/springboot

1。創建maven-module,properties,並在pom.xml中添加springboot依賴


<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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <artifactId>properties</artifactId>
    <packaging>war</packaging>
    <name>springboot-properties Demo</name>
    <url>http://maven.apache.org</url>

    <!-- Spring Boot 啓動父依賴 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <dependencies>
        <!-- Spring Boot Web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <finalName>properties</finalName>
    </build>
</project>

工程目錄如下:


代碼參考github code


使用application.properties配置文件加載的測試DEMO
        參考com.springboot.properties此包下的code
1.創建HomeProperties類

@Component
@ConfigurationProperties(prefix="home")
public class HomeProperties {

    /**
     * 省份
     */
    private String province;

    /**
     * 城市
     */
    private String city;

    /**
     * 描述
     */
    private String desc;

    getter/setter.....
}

2.配置文件
    application-pro.properties

      home.province = shang dong sheng
      home.city = wei fang shi
      home.desc = [application-pro] i come from ${home.province} ${home.city}.

    application-dev.properties

      home.province = shandong
      home.city = weifang
      home.desc = [application-dev] i come from ${home.province}--${home.city}

    application.properties

      spring.profiles.active=pro

3.測試
    參考test下com.springboot.properties.PropertiesTest.java


@SpringBootApplication
public class PropertiesTest implements CommandLineRunner{

    @Autowired
    private HomeProperties homeProperties;

    @Override
    public void run(String... strings) throws Exception {
        System.out.println(">>>>>>>>>>>>>>  "+homeProperties.toString());
    }
    /**
     * 使用application.yml運行輸出以下結果:
     *  HomeProperties{province='山東省', city='濰坊市', desc='我來自山東省濰坊市.'}
     *
     *  使用application.properties根據spring.profiles.active的value運行加載其對應的application-*.properties輸出以下結果:
     *  HomePropertiesYML{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}
     */
    public static void main(String[] args) {
        SpringApplication.run(PropertiesTest.class,args);
    }
}


運行main方法,加載使用application.properties根據spring.profiles.active的value運行加載其對應的application-*.properties輸出以下結果:
HomeProperties{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}


=======================================================================================


使用application.yml配置文件加載的測試DEMO
 參考com.springboot.properties此包下的code
1.創建HomePropertiesYML.java

@Component
public class HomePropertiesYML {

    /**
     * 省份
     */
    @Value("${home.province}")
    private String province;

    /**
     * 城市
     */
    @Value("${home.city}")
    private String city;

    /**
     * 描述
     */
    @Value("${home.desc}")
    private String desc;
    getter/setter....

}
2.配置文件
    application.yml 注意項目下不能同時存在application.properties 和 application.yml
    
home:
  province : 山東省
  city : 濰坊市
  desc : 我來自${home.province}${home.city}.

    
3.測試
    參考test下com.springboot.properties.YMLpropertiesTest.java
    
@SpringBootApplication
public class YMLpropertiesTest implements CommandLineRunner {

    @Autowired
    private HomePropertiesYML homePropertiesYML;
    @Override
    public void run(String... strings) throws Exception {
        System.out.println(">>>>>>>>>>>> "+homePropertiesYML.toString());
    }
    /**
     * 使用application.yml運行輸出以下結果:
     *  HomePropertiesYML{province='山東省', city='濰坊市', desc='我來自山東省濰坊市.'}
     *
     *  使用application.properties根據spring.profiles.active的value運行加載其對應的application-*.properties輸出以下結果:
     *  HomePropertiesYML{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}
     */
    public static void main(String[] args) {
        SpringApplication.run(YMLpropertiesTest.class,args);
//        System.exit(-1);
    }

}

運行main方法,加載使用application.yml配置文件,輸出以下結果:
 HomePropertiesYML{province='山東省', city='濰坊市', desc='我來自山東省濰坊市.'}

小結:

/**
 * Spring Boot 配置文件 使用application.properties
 * 測試類參考test目錄下的PropertiesTest.java
 *一、自動配置
 *   Spring Boot 提供了對應用進行自動化配置。相比以前 XML 配置方式,很多顯式方式申明是不需要的。二者,大多數默認的配置足夠實現開發功能,從而更快速開發。
 *   什麼是自動配置?
 *   Spring Boot 提供了默認的配置,如默認的 Bean ,去運行 Spring 應用。它是非侵入式的,只提供一個默認實現。
 *   大多數情況下,自動配置的 Bean 滿足了現有的業務場景,不需要去覆蓋。但如果自動配置做的不夠好,需要覆蓋配置。
 *   比如通過命令行動態指定某個 jar ,按不同環境啓動。那怎麼辦?這裏先要考慮到配置的優先級。
 *
 *   Spring Boot 不單單從 application.properties 獲取配置,所以我們可以在程序中多種設置配置屬性。按照以下列表的優先級排列:
 *  1.命令行參數
 *   2.java:comp/env 裏的 JNDI 屬性
 *   3.JVM 系統屬性
 *   4.操作系統環境變量
 *   5.RandomValuePropertySource 屬性類生成的 random.* 屬性
 *   6.應用以外的 application.properties(或 yml)文件
 *    7.打包在應用內的 application.properties(或 yml)文件
 *    8.在應用 @Configuration 配置類中,用 @PropertySource 註解聲明的屬性文件
 *   9.SpringApplication.setDefaultProperties 聲明的默認屬性
 *
 *    可見,命令行參數優先級最高。這個可以根據這個優先級,可以在測試或生產環境中快速地修改配置參數值,而不需要重新打包和部署應用。
 *   還有第 6 點,根據這個在多 moudle 的項目中,比如常見的項目分 api 、service、dao 等 moudles,往往會加一個 deploy moudle 去打包該業務各個子 moudle,
 *   應用以外的配置優先。
 *
 * 二.@ConfigurationProperties(prefix="home")
 *  通過 @ConfigurationProperties(prefix = “home”) 註解,將配置文件中以 home 前綴的屬性值自動綁定到對應的字段中。
 *  同是用 @Component 作爲 Bean 注入到 Spring 容器中。
 *
 *  注意:當reources中同時存在application.properties ,application.yml文件時,spring優先啓動application.properties配置文件
 */

多環境配置
    很多場景的配置,比如數據庫配置、Redis 配置、註冊中心和日誌配置等。在不同的環境,我們需要不同的包去運行項目。所以看項目結構,有兩個環境的配置:
    application-dev.properties:開發環境
    application-prod.properties:生產環境

    Spring Boot 是通過 application.properties 文件中,設置 spring.profiles.active 屬性,比如 ,配置了 dev ,則加載的是 application-dev.properties :
    # Spring Profiles Active
    spring.profiles.active=dev

    那運行PropertiesTest應用啓動類,從控制檯中可以看出,是加載了 application-dev.properties 的屬性輸出:
    HomeProperties{province='shang dong', city='wei fang', desc='[application-dev] i come from shang dong wei fang.'}
    將 spring.profiles.active 設置成 prod,重新運行,可得到 application-pro.properties的屬性輸出:
    HomeProperties{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}

    根據優先級,順便介紹下 jar 運行的方式,通過設置 -Dspring.profiles.active=pro 去指定相應的配置:
    mvn package
    java -jar -Dspring.profiles.active=prod springboot-properties-0.0.1-SNAPSHOT.jar

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章