SpringBoot基礎-入門與配置

目錄

 

1.入門程序導向

1.1 創建簡單的maven工程,pom.xml導入SpringBoot起步依賴依賴

1.2 編寫主程序,啓動SpringBoot應用

1.3 編寫相關的Controller、Service

1.4 啓動SpringBoot主程序測試

1.5 簡化部署

步驟一:在pom.xml添加Springboot的maven插件依賴

步驟二:在IDEA右側maven工具欄點擊maven打包插件

步驟三:將打包後的jar包複製到指定目錄,在控制檯使用命令啓動應用

步驟四:啓動成功

2.SpringBoot的結構分析

2.1 pom文件

2.2 啓動器

2.3 主程序類,主入口類

2.3.1 @SpringBootApplication註解

2.3.2 @SpringBootConfiguration註解

2.3.3 @EnableAutoConfiguration註解

3.使用Spring Initializer快速創建Spring Boot項目

 4.SpringBoot的配置文件

 4.1 aplication.yml配置方式

4.1.1 YAML介紹

4.1.2 YAML的基本使用

4.1.3 案例:SpringBoot應用使用application.yml文件配置“值注入”

4.2 application.properties配置方式

4.3 @ConfigurationProperties獲取值與@Value註解注入獲取值的區別

4.4 @PropertySource

4.5 @ImportResource

4.6 @Bean

4.7 配置文件佔位符

4.7.1 隨機數

4.7.2 佔位符獲取之前配置的值,如果沒有可以是用:指定默認值

4.8 配置Profile多環境支持

4.8.1 application.properties的多profile文件形式

4.8.2 application.yml的多文檔塊形式

4.8.3 profile多環境支持的激活方式

4.9 配置文件加載位置順序

4.10 外部配置加載順序


1.入門程序導向

工具:

IntelliJ IDEA2019.1

maven3.6.1

SpringBoot版本:

1.5.9

1.1 創建簡單的maven工程,pom.xml導入SpringBoot起步依賴依賴

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

1.2 編寫主程序,啓動SpringBoot應用

/**
* @SpringBootApplication 來標註一個主程序類,說明這是一個Spring Boot應用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
    public static void main(String[] args) {
        // Spring應用啓動起來
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}

1.3 編寫相關的Controller、Service

@Controller
public class HelloController {

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

        return "Hello World";
    }
}

1.4 啓動SpringBoot主程序測試

  • 測試結果:

1.5 簡化部署

  • 回顧以前的web項目部署

一般一個web項目如果要部署,要先打包成一個war包,然後再把war包放到Tomcat服務器上,如果目標環境沒有tomcat服務器,還得再配置

  • SpringBoot項目的部署方式

如果是SpringBoot應用,完全不再需要打包war包,而是使用一個maven插件,看SpringBoot的官方文檔介紹

官網地址:https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/

  • 這個插件的作用是,把應用打包成一個可執行的jar包,無需再在目標環境配置tomcat服務器

  • 步驟一:在pom.xml添加Springboot的maven插件依賴

    <!--這個插件,可以將應用打包成一個可執行的jar包;-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  • 步驟二:在IDEA右側maven工具欄點擊maven打包插件

打包的時候上面添加的maven插件就會介入對項目進行打包

  • 步驟三:將打包後的jar包複製到指定目錄,在控制檯使用命令啓動應用

即使目標環境沒有安裝tomcat環境,也沒有關係,因爲SpringBoot自帶了tomcat服務器

只需要你在項目中添加SpringBoot依賴,打包時會把相應的依賴打包進來

啓動命令

java -jar springboot-01-helloworld-1.0-SNAPSHOT.jar

步驟四:啓動成功

2.SpringBoot的結構分析

2.1 pom文件

  • 父項目

每個Springboot應用都需要導入的父項目依賴spring-boot-starter-parent

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

而spring-boot-starter-parent的父項目又是spring-boot-dependencies

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐dependencies</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath>../../spring‐boot‐dependencies</relativePath>
</parent>

spring-boot-dependencies的作用是真正管理SpringBoot應用裏面的所有jar包依賴版本,它又稱爲是Springboot的版本仲裁中心

如:commons相關的依賴

如:測試相關的依賴等等

注意:以後我們在SpringBoot應用中導入依賴,默認是不需要寫版本號的(除了那些沒有在dependencies中管理的依賴,這些自然要聲明版本號)

2.2 啓動器

  • 舉例:spring-boot-starter-web
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring‐boot‐starter‐web</artifactId>
</dependency>

spring-boot-starter:spring-boot場景啓動器;幫我們導入了web模塊正常運行所依賴的組件;

Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啓動器),只需要在項目裏面引入這些starter

相關場景的所有依賴都會導入進來。要用什麼功能就導入什麼場景的啓動器

官網:https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/htmlsingle/#using-boot-starter

2.3 主程序類,主入口類

@SpringBootApplication
public class HelloWorldApplication {
    public static void main(String[] args) {
        //啓動SpringBoot應用
        SpringApplication.run(HelloWorldApplication.class,args);
    }
}
  • 2.3.1 @SpringBootApplication註解

  • 作用

Spring Boot應用標註此註解在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啓動SpringBoot應用;

  • 源碼
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
  • 2.3.2 @SpringBootConfiguration註解

  • 作用

Spring Boot的配置類註解;標註在某個類上,表示這是一個Spring Boot的配置類;

  • 源碼
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
  • @Configuration註解:

配置類上來標註這個註解;配置類 <——相當於——> 配置文件;配置類也是容器中的一個組件;@Component 

  • 2.3.3 @EnableAutoConfiguration註解

  • 作用

開啓自動配置功能;以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration告訴SpringBoot開啓自動配置功能;這樣自動配置才能生效;

  • 源碼
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
  • @AutoConfigurationPackage:自動配置包

源碼:


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}

@Import(AutoConfigurationPackages.Registrar.class):Spring的底層註解@Import,給容器中導入一個組件;導入的組件由AutoConfigurationPackages.Registrar.class將主配置類(@SpringBootApplication標註的類)的所在包及下面所有子包裏面的所有組件掃描到Spring容器;如下圖所示的,掃描與主配置類HelloWorldApplication同一級下的Controller文件夾下的類

  • @Import(EnableAutoConfigurationImportSelector.class):給容器中導入組件

EnableAutoConfigurationImportSelector:導入那些組件的選擇器;

將所有需要導入的組件以全類名的方式返回;這些組件就會被添加到容器中;會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入這個場景需要的所有組件,
並配置好這些組件;

有了自動配置類,免去了我們手動編寫配置注入功能組件等的工作;

原理:

SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);

Spring Boot在啓動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將
這些值作爲自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作;以前我們需要自己配置的東
西,自動配置類都幫我們;


J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar的包中

3.使用Spring Initializer快速創建Spring Boot項目

IDE都支持使用Spring的項目創建嚮導快速創建一個Spring Boot項目;

選擇我們需要的模塊;嚮導會聯網創建Spring Boot項目;

默認生成的Spring Boot項目:

  • 主程序已經生成好了,我們只需要我們自己的邏輯
  • resources文件夾中目錄結構

static:保存所有的靜態資源;如 js css images;相當於以前deweb項目的WebContent

templates:保存所有的模板頁面;(Spring Boot默認jar包使用嵌入式的Tomcat,默認不支持JSP頁面);可以使用模板引擎(freemarker、thymeleaf);

application.properties:Spring Boot應用的配置文件;可以修改一些SpringBoot的默認設置;

 4.SpringBoot的配置文件

SpringBoot使用一個全局的配置文件,配置文件名是固定的;

  • application.properties
  • application.yml

配置文件的作用:修改SpringBoot自動配置的默認值;SpringBoot在底層都給我們自動配置好;

 4.1 aplication.yml配置方式

4.1.1 YAML介紹

  • YAML A Markup Language:是一個標記語言
  • YAML isn't Markup Language:不是一個標記語言;

標記語言:

  • 以前的配置文件,大多都使用的是 xxxx.xml文件;
  • YAML:以數據爲中心,比json、xml等更適合做配置文件;

YAML與XML對比例子:

YAML:

server:
    port: 8081

XML:

<server>
    <port>8081</port>
</server>

4.1.2 YAML的基本使用

  • 基本語法

 k:(空格)v:表示一對鍵值對(空格必須有)

以空格的縮進來控制層級關係;只要是左對齊的一列數據,都是同一個層級的

server:
    port: 8081
    path: /hello
  • – 使用縮進表示層級關係
  • – 縮進時不允許使用Tab鍵,只允許使用空格。
  • – 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
  • – 大小寫敏感
  • YAML 支持的三種數據結構

– 對象:鍵值對的集合

– 數組:一組按次序排列的值

– 字面量:單個的、不可再分的值

注意:屬性和值也是大小寫敏感

  • 值的寫法

字面量:普通的值(數字,字符串,布爾)

k: v:字面直接來寫;

字符串默認不用加上單引號或者雙引號;

"":雙引號;不會轉義字符串裏面的特殊字符;特殊字符會作爲本身想表示的意思

         示例:name: "zhangsan \n lisi" ————輸出:zhangsan 換行 lisi

'':單引號;會轉義特殊字符,特殊字符最終只是一個普通的字符串數據

         示例:name: ‘zhangsan \n lisi’  ————輸出:zhangsan \n lisi

  • 對象、Map(屬性和值)(鍵值對):

k: v:在下一行來寫對象的屬性和值的關係;注意縮進

對象還是k: v的方式:

friends:
    lastName: zhangsan
    age: 20

 行內寫法:

friends: {lastName: zhangsan,age: 18}
  • 數組(List、Set):

用“-”值表示數組中的一個元素

pets:
    ‐ cat
    ‐ dog
    ‐ pig

行內寫法:

pets: [cat,dog,pig]

4.1.3 案例:SpringBoot應用使用application.yml文件配置“值注入”

  • 創建Person類
public class Person {
    private String lastname;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    ...
    此處省略get、set方法
    ...

    @Override
    public String toString() {
        return "Person{" +
                "lastname='" + lastname + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}
  • 創建Dog類
public class Dog {
    private String name;
    private Integer age;

    ...
    此處省略get、set方法
    ...

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  •  配置application.yml文件 
person:
  lastname: zhangsan
  age: 18
  boss: false
  birth: 2020/4/6
  maps: {k1: v1,k2: v2}
  lists:
    - lisi
    - wangwu
  dog:
    name: gouwa
    age: 6
  • 在Person類中添加@ConfigurationProperties(prefix = "person")註解和@Component註解

@ConfigurationProperties(prefix = "person")註解的作用:

告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定,將配置文件中配置的每一個屬性的值,映射到這個組件中,

prefix = "person":配置文件中哪個下面的所有屬性進行一一映射

@Component註解的作用:

將Person組件添加到容器,只有容器中的組件才能使用容器提供@ConfigurationProperties的功能

@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastname;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    ......省略部分代碼
}

注意:@ConfigurationProperties的使用需要依賴下面的配置文件處理器,這樣類屬性與配置問導入配置文件處理器,以後編寫配置文件進行屬性綁定就有提示了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

如:添加了配置文件處理器之後,編寫配置文件時就會有提示

  • 編寫測試

此處使用SpringBoot單元測試

@RunWith(SpringRunner.class):註解爲程序使用Spring容器來跑,可以類似於編碼方式在測試期間使用自動注入功能等功能

@SpringBootTest:註解爲SpringBoot的單元測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class Springbootquick2ApplicationTests {

    @Autowired
    private Person person;

    @Test
    public void contextLoads() {
        System.out.println(person);
    }

}
  • 測試結果

4.2 application.properties配置方式

  • 其他保持與上面程序一致,配置application.properties文件
#配置person
person.lastname=zhaosi
person.age=100
person.boss=true
person.birth=2020/04/06
person.maps.k1=v1
person.maps.k2=v2
person.lists=a,b,c
person.dog.name=泰迪
person.dog.age=5
  • 測試結果
  • 上面的測試結果中顯示的中文亂碼問題:

  • 解決:IDEA默認使用的是UTF-8編碼,打開IDEA的settings設置,找到File Encoding

此設置的作用:.properties文件中內容在運行時將會轉換爲ASCII碼,讓程序進行獲取

4.3 @ConfigurationProperties獲取值與@Value註解注入獲取值的區別

  @ConfigurationProperties @Value
功能 可以批量注入配置文件中的屬性 需要逐個指定注入
鬆散綁定(鬆散語法) 支持 不支持
SpEL(SpringEL表達式) 不支持 支持
JSR303數據校驗 支持 不支持
複雜類型封裝 支持 不支持
  • 鬆散綁定

是指,屬性名匹配規則比較寬鬆 ,例如:實體類屬性爲lastName,配置文件中配置屬性爲lastname,在屬性值注入時,也能識別

屬性名匹配規則(Relaxed binding)

– person.firstName:使用標準方式

– person.first-name:大寫用-

– person.first_name:大寫用_

– PERSON_FIRST_NAME:推薦系統屬性使用這種寫法

  • JSR303數據校驗


回顧Spring原來配置文件屬性注入的方式,是通過@Value註解完成的

使用示例:

public class Person {

    @Value("${person.lastname}")
    private String lastname;
    @Value("${person.age}")
    private Integer age;
    private Boolean boss;
    private Date birth;

    ...省略部分代碼...

總結:不管是配置文件yml還是properties他們都能獲取到值;

如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;

如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;

4.4 @PropertySource

  • 作用:

加載指定的配置文件,並注入屬性值

  • 用法:
@PropertySource(value = "classpath:person.properties")
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
   
    private String lastname;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    ......省略部分代碼
}

4.5 @ImportResource

  • 作用:

導入Spring的配置文件,讓配置文件裏面的內容生效;

注意:Spring Boot裏面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;想讓Spring的配置文件生效,加載進來;@ImportResource標註在一個配置類上

  •  用法

創建一個HelloService類

在resources下編寫beans.xml

<?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="helloService" class="cn.poison.springbootquick2.service.HelloService"></bean>
</beans>

在主配置類中添加@ImportResource註解,導入Spring的配置文件讓其生效


@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class Springbootquick2Application {

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

}

4.6 @Bean

SpringBoot推薦給容器中添加組件的方式;推薦使用全註解的方式

1、配置類@Configuration------>Spring配置文件

2、使用@Bean給容器中添加組件

  •  用法:
/**
 * @Configuration:指明當前類是一個配置類;
 * 就是來替代之前的Spring配置文件在配置文件中用<bean><bean/>標籤添加組件
 */
@Configuration
public class MyConfiguration {

    //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置類@Bean給Spring容器注入組件了");
        return new HelloService();
    }
}

4.7 配置文件佔位符

4.7.1 隨機數

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}

用法:

4.7.2 佔位符獲取之前配置的值,如果沒有可以是用:指定默認值

person.last‐name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

4.8 配置Profile多環境支持

Profile是Spring對不同環境提供不同配置功能的支持,可以通過激活、指定參數等方式快速切換環境,如:開發環境、測試環境、生產環境

4.8.1 application.properties的多profile文件形式

  • 格式:

application-{profile}.properties/yml:application-dev.properties、application-prod.properties

  • 示例

application-dev.properties:開發環境下的配置

server.port=8888

application-prod.properties:生產環境下的配置

server.port=9999

4.8.2 application.yml的多文檔塊形式

 
server:
    port: 8081
spring:
    profiles:
        active: prod #指定屬於哪個環境
‐‐‐
server:
    port: 8083
spring:
    profiles: dev
‐‐‐
server:
    port: 8084
spring:
    profiles: prod 

4.8.3 profile多環境支持的激活方式

  • 激活方式一:配置文件 spring.profiles.active=dev

application.properties:

#激活開發環境下的配置
spring.profiles.active=dev

#激活生產環境下的配置
spring.profiles.active=prod

 測試結果:

  • 激活方式二:命令行 --spring.profiles.active=dev

使用maven插件將Springboot應用打包成jar包,使用命令啓動時,指定對應的配置環境

java -jar springbootquick2-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

也可以在IDEA的SpringBoot啓動配置指定配置環境,如下圖

  • 激活方式三:jvm參數 –Dspring.profiles.active=dev,在IDEA的Edit Configuration中配置虛擬機參數,然後點擊右上角就可以運行

4.9 配置文件加載位置順序

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

  • – file:./config/
  • – file:./
  • – classpath:/config/
  • – classpath:/

– 以上是按照優先級從高到低的順序,所有位置的文件都會被加載,高優先級配置內容會覆蓋低優先級配置內容,互補配置;

我們還可以通過spring.config.location來改變默認的配置文件位置,項目打包好以後,我們可以使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用形成互補配置;這個功能在運維方面很有作用

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

4.10 外部配置加載順序

SpringBoot也可以從以下位置加載配置; 優先級從高到低;高優先級的配置覆蓋低優先級的配置,所有的配置會形成互補配置

  • 1.命令行參數

所有的配置都可以在命令行上進行指定,多個配置用空格分開; --配置項=值

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

假如項目已經打包好了,這時候要修改項目的一些配置,也可以通過命令行參數進行修改,例如:修改端口號

java -jar springboot-02-config-0.0.1-SNAPSHOT.jar --server.port=8082
  • 2.來自java:comp/env的JNDI屬性
  • 3.Java系統屬性(System.getProperties())
  • 4.操作系統環境變量
  • 5.RandomValuePropertySource配置的random.*屬性值

由jar包外向jar包內進行尋找;優先加載帶profile

  • 6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
  • 7.jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

再來加載不帶profile

  • 8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
  • 9.jar包內部的application.properties或application.yml(不帶spring.profile)配置文件

其他具體配置參考SpringBoot官方文檔https://spring.io/projects/spring-boot

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