SpringBoot學習篇1[配置文件知多少]

一 使用IDEA新創建SpringBoot項目

1.file->new->project
在這裏插入圖片描述
2.彈出以下界面
在這裏插入圖片描述
選擇Spring Initializr,注意,這裏需要選擇大於等於1.8的SDK版本。

3.點擊next後彈出以下界面
在這裏插入圖片描述
Group:一般寫com.公司名稱
Artifact:項目名,同Name
Type:默認(Maven Project)
Language:Java
Packaging:jar
Java Version:選擇合適的SDK版本,注意不小於1.8
Version:項目版本號
Description:項目說明
Package:默認生產的包名

4.所有的選項填完後如下
在這裏插入圖片描述
5.點擊next後彈出下面的界面,並按照如下選擇
在這裏插入圖片描述
6.點擊next後彈出以下界面,選擇合適的項目存儲位置
在這裏插入圖片描述
7.點擊next,完成項目的創建
在這裏插入圖片描述
在這裏如果彈出Import Change的提示的話,注意點擊一下,此操作會導入Spring默認依賴包。
8.項目工程樹如下
在這裏插入圖片描述
至此SpringBoot項目就創建好了。
9.編寫Controller試一下,看項目能否正常運行。
new—>java Class,取名爲controller.HelloController,代碼如下:

package com.yky.springbootconfig.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @RequestMapping(value = "/hello")
    @ResponseBody
    public String Hello()
    {
        return "Hello";
    }
}

10.啓動工程,並訪問localhost:8080/hello(默認端口號8080)看一下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
瀏覽器成功出現Hello時,證明SpringBoot項目跑起來了。

二 默認配置的修改與值的注入

2.1 通過application.properties文件修改

SpringBoot默認的全局配置文件放在src/mainresources目錄下。如果想要修改SpringBoot的默認配置,可以在application.properties中修改SpringBoot的默認配置。
以修改默認端口號爲例:
application.properties添加以下代碼:

server.port=6666

再啓動一下服務,發現端口號已經變了
在這裏插入圖片描述

2.2 通過application.yml文件修改

準備工作:在src/mainresources目錄下新創建application.yml文件。

2.2.1 yaml介紹

  • 以數據爲中心,在視覺上更具有面向對象的特性。
  • 相比於JSON、XML更加簡潔明瞭,在能使用yml配置文件的情況下,推薦使用此配置文件。

2.2.2 yaml語法介紹

  • 基本形式:

    key: value [鍵值對形式。注意,’:'後面必須要有空格或table]

  • 層級關係的表示:

    使用縮進來表示層級關係,推薦使用table進行縮進。

  • 還是修改端口號的例子:
    注:爲了看到效果,可以把先前在application.properties中寫的配置端口號的代碼屏蔽掉。

    server:
      port: 8088
    

    效果圖:在這裏插入圖片描述

2.2.3 yaml常用寫法舉例

  • 數值、boolean、日期,直接寫,無需加引號

    salary: 20000
    entryDate: 2019/11/26
    isManager:  true
    
  • 字符串
    可以加引號,也可以不加。引號可以使用單引號,也可以使用雙引號。加雙引號時會將轉義字符轉義輸出,加單引號時,將轉義字符原樣輸出。

    StringValue1: Hello Wolrd
    #輸出Hello 換行 World
    StringValue2: "Hello \n World"
    #輸出Hello \n World
    StringValue3: 'Hello \n World'
    
  • 對象/Map

    employee:
      salary: 20000
      entryDate: 2019/11/26
      isManager:  true
    

    寫在一行

    employee1: {salary: 20000, entryDate: 2019/11/26, isManager:  true}
    
  • List/Set
    用 ‘-’ 表示數組或Set集合中的一個元素。

    speciality:
      - c
      - c++
      - Java
      - Shell
    

    寫到一行

    speciality1: [c, c++, Java, Shell]
    

2.3 配置文件值的注入

2.3.1 使用@Value獲取單個值

在application.yml配置文件中添加以下代碼:

name: wuhua

在HelloController中使用Value註解獲取配置文件中的name值:

@Controller
public class HelloController {
    @Value("${name}")
    private String name;

    @RequestMapping(value = "/hello")
    @ResponseBody
    public String Hello()
    {

        return "Hello " + name;
    }
}

效果:
在這裏插入圖片描述

2.3.2 使用@ConfigurationProperties將屬性值綁定到類中

在要在配置文件中獲取的值不多時,可以用@Value註解來獲取單個值。可當一旦要獲取的值比較多時,使用@Value註解就不太合適了。SpringBoot 爲我們提供了@ConfigurationProperties註解,用於將配置文件中的屬性值綁定到類中。

有entity.Employee類,代碼如下:

public class Employee {
    //姓名
    private String name;
    //工號
    private Integer number;
    //薪資
    private Double salary;
    //入職日期
    private Date entryDate;
    //特長
    private List speciality;
    //是否是管理人員
    private boolean isManager;
    
	getter/setter方法.......

	toString方法......
}

在application.yml文件中添加以下代碼:

employee:
  name: Peter
  number: 1
  salary: 21000.5
  entryDate:  2019/11/26
  speciality:
    - c
    - c++
    - Java
    - Shell
  isManager: true

接下來要做的就是將配置文件中的值注入到Employee類中
添加以下三行註解:

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "employee")
public class Employee {
	......
}

其中:
@Component:將Employee類注入Spring IOC容器,交由Spring容器管理
@EnableConfigurationProperties:使能,不加這句話的話可能讀取不到配置
@ConfigurationProperties(prefix = “employee”):告訴SpringBoot要從哪裏讀取值,並進行一一綁定

用測試類測試一下:

@SpringBootTest
class SpringBootConfigApplicationTests {

    @Autowired
    private Employee employee;
    @Test
    void contextLoads() {
        System.out.println(employee);
    }

}

啓動測試類,可以看到控制檯成功輸出:
在這裏插入圖片描述
細心的朋友可能會看到,打印出的isManager屬性並不是我們在配置文件中的屬性,這是兩個方面導致的。這是由兩個方面導致的:

  1. 使用IDEA自動生成getter/setter方法時會針對屬性名爲isXXX的成員屬性做特殊處理,setter方法名會寫爲setXXX(去掉了Is)。
  2. SpringBoot注入某個屬性的值時,會去尋找set屬性名 方法,調用此方法注入值。

根據上面的分析我們可以知道,在注入isManager屬性時,SpringBoot沒有找到setIsManager方法,所以就沒有注入進去。

修改isManager屬性的Setter方法後再測試一下:

    public void setIsManager(boolean manager) {
        isManager = manager;
    }

可以看到,注入了正確的值:
在這裏插入圖片描述

2.3.3 數據校驗

在使用@ConfigurationProperties註解將配置與類進行綁定時,支持JSR303數據校驗(@Value不支持)。
表 1. Bean Validation 中內置的 constraint

Constraint 詳細信息
@Null 被註釋的元素必須爲 null
@NotNull 被註釋的元素必須不爲 null
@AssertTrue 被註釋的元素必須爲 true
@AssertFalse 被註釋的元素必須爲 false
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max, min) 被註釋的元素的大小必須在指定的範圍內
@Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註釋的元素必須是一個過去的日期
@Future 被註釋的元素必須是一個將來的日期
@Pattern(value) 被註釋的元素必須符合指定的正則表達式

表 2. Hibernate Validator 附加的 constraint

Constraint 詳細信息
@Email 被註釋的元素必須是電子郵箱地址
@Length 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty 被註釋的字符串的必須非空
@Range 被註釋的元素必須在合適的範圍內

接下來我們就來驗證一下:
假設,我們指定最低工資不得低於2000,代碼如下:

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "employee")
@Validated
public class Employee {
    ...
    //薪資
    @Min(2000)
    private Double salary;
    ...
}

這裏除了引用JSR303中的@Min註解外,還對整個類使用了@Validated註解進行修飾,@Validated作用用於開啓數據校驗。
當我們故意在配置文件中輸入一個小於2000的薪資後,啓動測試程序可以看到控制檯打印出了錯誤信息:
在這裏插入圖片描述

2.3.4 注入application.properties配置文件的值

注入application.properties配置文件的值與注入application.yml的值極爲相似,不同的只是配置文件的寫法不同。
還是以上面的例子爲例,上面的例子在application.properties中的寫法爲:

employee.name=Peter
employee.number=1
employee.salary=21000.5
employee.entry-date=2019/11/26
employee.speciality=c,c++,Java,Shell
employee.isManager=true

2.3.5 @ConfigurationProperties、@Value用法總結

  • 批量注入,推薦用@ConfigurationProperties
  • 希望支持數據校驗,用@ConfigurationProperties
  • 數據量不多,並且各個屬性沒有關聯時,用@Value
  • @Value支持SpEL(Spring Expression Language),如果想要使用SpEL則使用@Value

2.3.6 模塊化配置文件

當配置項比較多時,全部寫在application.properties/application.yml顯然有些不合理。此時就需要將配置文件合理的拆分開來。
還是以上面的例子進行演示:

  1. 首先屏蔽掉所有和employee有關的配置

  2. 在資源文件路徑下創建application-employee-conf.yml文件,並寫入以下內容注:必須要以application-開頭

    employee:
      name: george
      number: 2
      salary: 20000
      entryDate:  2019/11/26
      speciality:
        - c
        - c++
        - Java
        - Shell
        - css
        - JavaScript
      isManager: false
    
  3. 在主配置文件中包含新創建的配置文件:

    spring:
      profiles:
        include: employee-conf
    

最後看一下效果:
在這裏插入圖片描述注:xxx.properties配置文件的拆分和xxx.yml類似。在這裏就不做演示了。

三 自定義配置的支持

3.1 使用XML配置文件裝配Bean到Spring容器

SpringBoot提倡零配置,但在開發中難免有一些特殊場景需要用到xml配置。好在SpringBoot爲我們提供了@ImportResource註解。
在SpringBoot啓動入口類上添加@ImportResource註解:

@ImportResource(locations = "classpath:config.xml")
@SpringBootApplication
public class SpringBootConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootConfigApplication.class, args);
    }

}

注:xml文件不要以application開頭,否則會出錯!

@ImportResource(locations = “classpath:config.xml”)的作用是加載類路徑下的config.xml文件。
爲了方便測試,我們創建一個service.EmployeeService類,代碼如下:

package com.yky.springbootconfig.service;

public class EmployeeService
{
    public void save()
    {
        System.out.println("保存數據到數據庫");
    }

}

接下來在config.xml文件中將EmployeeService添加到Spring容器中。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="employeeService" class="com.yky.springbootconfig.service.EmployeeService">

    </bean>
</beans>

在測試類中獲取Spring容器中的EmployeeService對象

@SpringBootTest
class SpringBootConfigApplicationTests {

    @Autowired
    private EmployeeService employeeService;

    @Test
    public void employeeServiceTest()
    {
        employeeService.save();
    }
}

運行測試類,效果如下:
在這裏插入圖片描述
可以看到,控制檯成功輸出了我們想要的結果,由此可以得知EmployeeService被成功添加到了Spring容器中,我們的自定義xml配置文件起到了作用。

3.2自定義Java配置類裝配Bean到Spring容器

針對Spring裝配Bean,Spring官方推薦優先使用註解進行裝配。就像我們常用到的@Component、
@Repository 、@Controller。而後是使用Java配置類進行裝配,最後才用xml進行裝配。接下來來看一看如何用Java配置類裝配Bean吧。

  • 第一步:使用@Configuration註解聲明當前類爲Spring配置類
  • 第二步:使用@Bean註解修飾方法,被修飾的方法的返回對象將被裝配到SpringIOC容器中
  • Bean id默認爲方法名。
  • Spring不關係對象是如何在方法內創建的,只需要該方法正確返回要裝配的對象就好了。

接來下驗證一下:
1.創建service.UserService類,代碼如下:

public class UserService {
    public void login()
    {
        System.out.println("登陸成功");
    }
}

2.創建configuration.UserServiceConfiguration類代碼如下

@Configuration
public class UserServiceConfiguration
{
    @Bean
    public UserService userService()
    {
        return new UserService();
    }
}

3.在測試類中獲取UserService對象

@SpringBootTest
class SpringBootConfigApplicationTests {

    @Autowired
    private UserService userService;

    @Test
    public void userServiceTest()
    {
        userService.login();
    }
}

可以看到成功打印出了我們想要的內容。
在這裏插入圖片描述

四 多環境的支持

在實際的項目中,我們往往需要區分開發環境和生產環境。例如:開發環境和生產環境配置不同的端口號;開發環境禁用資源文件緩存,生產環境不禁用;開發環境開啓自動部署,生產環境不開啓。。。
針對開發環境和生產環境,就需要我們爲此指定不同的profile配置了。

4.1 直接在主配置文件中指定

SpringBoot可以通過在主配置文件(application.properties或application.yml)中指定spring.profiles.active的值來指定當前是開發環境還是生產環境。

#dev表示開發環境,prod表示生產環境
spring:
  profiles:
    active: dev
  • 當指定爲dev時,SpringBoot會在配置文件所在路徑下查找application-dev.yml文件,並將其作爲配置文件包含進來。
  • 當指定爲prod時,SpringBoot會在配置文件所在路徑下查找application-prod.yml文件,並將其作爲配置文件包含進來。

接下來我們創建這兩個配置文件,並在這兩個配置文件中分別指定不同的端口號。

可以看到,在開發環境下端口號是6666
在這裏插入圖片描述
切換到生產環境後,端口號是8888
在這裏插入圖片描述

4.2 打包成jar包,並在啓動程序時指定

在4.1中講了如何在主配置文件中指定當前的環境是開發還是生產環境。在每次切換環境時,還要手動修改配置文件,略顯麻煩。其實還有可以在程序運行時通過傳入參數指定。

4.2.1 生成jar包

  • 通過控制檯進入項目根目錄
  • 運行mvn clean package命令將項目打包成jar包
    在這裏插入圖片描述
    通過控制檯輸出的信息得知jar包輸出到了./target
    在這裏插入圖片描述

4.2.2 指定啓動參數啓動程序

  • 以開發環境啓動
    java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
    在這裏插入圖片描述
  • 以生產環境啓動
    java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
    在這裏插入圖片描述
  • 說明
    啓動參數指定當前運行環境的優先級>主配置文件中指定運行環境的優先級,即不管主配置文件中指定的運行環境是什麼,只要在啓動參數中指定了,就按啓動參數中指定的來。

五 配置文件加載位置以及加載順序

springboot啓動會掃描以下位置的application.properties或者application.yml作爲默認的配置文件

位置 說明
工程根目錄:./config/ 工程根目錄的config路徑下,最高優先級
工程根目錄:./ 工程根目錄
classpath:/config/ 類路徑的config目錄下
classpath:/ 類路徑的根目錄,最低優先級

加載的優先級順序是從上向下加載,並且所有的文件都會被加載,高優先級的內容會覆蓋底優先級的內容,形成互補配置。

關於SpringBoot的配置文件相關知識點就介紹到這兒了,如果有錯誤或遺漏的地方歡迎在評論區指出。

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