SpringBoot第二集:註解與配置(2020最新最易懂)

2020最新SpringBoot第二集:基礎註解/基礎配置(2020最新最易懂)

一.Eclipse安裝SpringBoot插件

  Eclipse實現SpringBoot開發,為便於項目的快速構建,需要安裝SpringBoot插件,在Eclipse的help—>Eclipse Marketplace裏面搜索STS或Spring

  (推薦在Spring官網直接下載程序包,其實這個程序包就是一個Eclipse【詳情見附錄】,該包中集成了SpringBoot組件。或者使用IDEA)

 Eclipse右下角會顯示安裝進度:

 安裝完成後需要重啟Eclipse

重啟後驗證:Eclipse上邊工具欄選項點擊Window——Preferences:可以看到如下圖結果,就是OK了

 Eclipse新建第一個SpringBoot工程。

項目工程顯示區,右鍵New——Project…——搜索Spring

 

說明:上圖中所有選擇的依賴都會被直接構建加如pom.xml文件中。工程完成後結構如下圖:

 

 

二.SpringBoot基礎註解

1.註解說明

@SpringBootApplication 註解
  查看源碼可發現,@SpringBootApplication是一個複合註解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan這三個註解。

  這三個註解的作用分別為:

    @SpringBootConfiguration:標註當前類是配置類,這個註解繼承自@Configuration。會將當前類內中的一個或多個以@Bean註解標記的方法的實例加入到Srping容器中,並且實例名就是方法名。     

       @EnableAutoConfiguration:是幫你實現自動裝配的註解,這個註解會根據我們添加的組件依賴來完成一些默認配置。 SpringBoot工程啟動時, 會運行類SpringFactoriesLoader,執行並加載MTA-INF/pringfactories中的配置依賴 ,通過SpringFactoriesLoader中的load方法, 以for循環的方式,一個一個加載。例如:我們做微服時會添加spring-boot-starter-web這個組件,SpringBoot會默認為工程配置springmvc 和Tomcat。如果希望:關閉自動裝配,則需要手動配置: @SpringBootApplicatien(exclude = QuartzAuteConfiguration.class)這樣就可以讓SpringBoot取消自動裝配Quartz

    @ComponentScan:掃描當前包及其子包下被@Component,@Controller,@Service,@Repository註解標記的類,並將類實例納入到Spring容器中進行管理。等價於<context:component-scan>的xml配置文件中的配置項。

@RestController註解

  相當於@Controller+@ResponseBody兩個註解的結合,返回JSON數據不需要在方法前面加@ResponseBody註解了,但使用@RestController這個註解,就不能返回jsp/html頁面,視圖解析器無法解析jsp/html頁面。

@Bean

  相當於Spring核心XML中的<bean  id =””  class=””></bean>配置,用於方法的上面,而不是類,意思是產生一個bean實例,並交給Spring管理。其中方法名對應id值,class對應返回值對象。@Bean(name=”a”)註解使用屬性name時,則表示使用name屬性值作為id值,不再使用方法名(這種方式優先級更高)。

@Configuration

  指出該類是 Spring管理容器Beans配置的信息源,相當於XML中的<Beans>根標籤,一般加在主類上。

 

2.案例演示(了解即可)

  需求:使用@Configuration和@Bean實現POJO管理。

1.新建SpringBoot項目。

2.引入SpringBoot基本依賴。

3.引入Lombok依賴。

  我們無需指定依賴jar的版本,SpringBoot默認配置並指定了依賴版本。(需要注意的是,記得要安裝Lombok)

 1 <project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
 2   <modelVersion>4.0.0</modelVersion>
 3   <groupId>com.xsge</groupId>
 4   <artifactId>springboot_demo01</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   
 7   <!-- 引入SpringBoot核心父依賴 -->
 8   <parent>
 9     <groupId>org.springframework.boot</groupId>
10     <artifactId>spring-boot-starter-parent</artifactId>
11     <version>2.3.4.RELEASE</version>
12     <relativePath/> 
13   </parent>
14   
15   <dependencies>
16   
17     <dependency>
18       <!-- 引入SpringBoot整合WEB依賴:內置Tomcat容器 -->
19       <groupId>org.springframework.boot</groupId>
20       <artifactId>spring-boot-starter-web</artifactId>
21     </dependency>
22     
23       <!-- 引入SpringBoot整合test測試依賴 -->
24     <dependency>
25       <groupId>org.springframework.boot</groupId>
26       <artifactId>spring-boot-starter-test</artifactId>
27       <scope>test</scope>
28       <!-- 排除junit.vintage -->
29       <exclusions>
30         <exclusion>
31           <groupId>org.junit.vintage</groupId>
32           <artifactId>junit-vintage-engine</artifactId>
33         </exclusion>
34       </exclusions>
35     </dependency>
36     
37     <!-- Lombok依賴 -->
38     <dependency>
39         <groupId>org.projectlombok</groupId>
40         <artifactId>lombok</artifactId>
41     </dependency>
42     
43   </dependencies>
44   
45   <!-- spring-boot打包插件 -->
46   <build>
47     <plugins>
48       <plugin>
49         <groupId>org.springframework.boot</groupId>
50         <artifactId>spring-boot-maven-plugin</artifactId>
51       </plugin>
52     </plugins>
53   </build>
54   
55 </project>

4.新建啟動類

1 @SpringBootApplication
2 public class AnnotaticSpringBootApplication {
3     public static void main(String[] args) {
4         SpringApplication.run(AnnotaticSpringBootApplication.class, args);
5     }
6 }

5.編寫實體類。

  利用Lombok簡化實體類封裝代碼。

  @Slf4j:等同於創建日誌對象:private final Logger logger = LoggerFactory.getLogger(XXX.class);一般上用在其他java類上

  更多Lombok註解參考:

1 @Data  // 添加get,set,toString,eq等
2 @NoArgsConstructor  // 添加無參構造
3 @AllArgsConstructor  // 添加全參構造
4 public class User {
5     private String name;
6     private String password;
7 }

6.編寫Config配置類

  在啟動類所在包/子包下,新建包config。(注意@SpringBootApplication僅加載啟動類當前包/子包中的所有資源)

 1 @Configuration    // 相當於Spring中<beans>根標籤
 2 public class UserConfig {
 3     /**
 4      * @Bean 相當於Spring中bean標籤。屬性name等價於id值,沒有name屬性時,id值默認為方法名
 5      * 例如:
 6      * <bean id="" class=""></bean>當前方法名等價於id值,當前返回對象,等價於class值實例。
 7      */
 8     @Bean    
 9     public User user() {
10         User user = new User("XSGE","123");
11         return user;
12     }
13 }

6.新建Controller。

  在控制器中注入對象User,測試註解@Configuration/@Bean實現POJO管理

 1 @RestController    // 等價於@Controller和@ResponseBody
 2 public class AnnotationController {
 3     
 4     // @Resource(name = "user") 指定name值尋找,
 5     @Autowired
 6     private User user;// 優先根據@Bean註解的name屬性值注入對象,當找不到時再根據方法名尋找注入
 7     
 8     @GetMapping("/testAnnotation")
 9     public User testAnnotation() {
10         return user;
11     }
12     
13 }

7.啟動工程,測試訪問(略:參考第一集)。  
  訪問地址://localhost:8080/testAnnotation

以上內容如果有興趣的可以自己再深入學習,個人認為直接在實體類類名上,使用@Component註解,將類標註為Spring組件可能更快更方便!當然每個組件功能都不是兒戲,自然在某一點會凸顯它的強大!

三.SpringBoot基礎配置

  在多數情況下,啟動一個SpringBoot應用時,基本上無需做太多的配置,應用就能正常啟動。但在大部分開發環境下,添加額外配置是無所避免的,比如自定義應用端口號、MQ的服務地址、緩存服務地址、數據庫的配置等,都或多或少的需要一些外部的配置項。SpringBoot默認加載的全局配置文件名為application.properties或者application.yml(Spring官方推薦使用的格式是.yml格式,目前官網實例都是使用yml格式進行配置講解的),應用工程啟動時會自動加載此文件,無需手動引入,配置文件名稱是固定的,放在src/main/resources根目錄下。

  配置文件在工程中的作用主要有兩個:

  1. 通過配置文件屬性映射,結合註解方式為POJO屬性賦值
  2. 添加SpringBoot默認屬性配置,將默認配置值轉換為自定義配置(例如:修改默認端口號等)
    SpringBoot默認配置信息有哪些?點擊這裡(簡稱:不多,也就百八十個)

  自定義全局配置文件格式可選:這是主文件,名稱固定寫法

  • application.properties
    • 語法結構: key=value
  • application.yml
    • 語法結構: key:空格value

舉例:applicaiton.yml

 1 # k=V
 2 #普通的key-value的編寫語法
 3 name: xsge
 4 #value值還可以使用表達式
 5 uuid: ${random.uuid}     #隨機UUID值
 6 intnum: ${random.int}    #隨機int值  ${random.int(10)} 或 ${random.int[1024,65536]}
 7 
 8 #對象的編寫語法:假定有一個User對象
 9 user1: 
10   name: xsge
11   age: 23
12 
13 #對象的編寫行內語法
14 user2: {name: xsge,age: 23}
15 
16 #數組編寫語法
17 pets: 
18   - AA
19   - BB
20   - CC
21 
22 #數組行內編寫語法
23 array: [AA,BB,cc]

舉例:application.properties

1 user.config.username=Tom
2 user.config.age=23

區別:

properties:屬性名通過「點」來連接,通過「等號」來賦值,結構上相對比較單一,沒有分層的感覺,但比較直接。

yml文件格式特點:通過「冒號」來分層,結構上多元化,有比較明顯的層次感,還可以使用表達式。

  1. yml文件, 會根據換行和縮進幫助咱們管理配置文件所在位置。
  2. yml文件,相比properties更輕量級一 些
yml文件的劣勢:
  1.嚴格遵循換行和縮進。
  2.在填寫value時,一定要在冒號後面跟上空格。

 

1.自定義屬性配置實現注入POJO屬性值

 

  1.簡單型配置

  SpringBoot支持自定義屬性配置文件,並支持通過註解讀取配置文件信息。

  當我們創建一個SpringBoot項目的時候,系統默認會為我們在src/main/java/resources目錄下創建一個application.properties(或手動新建)。個人習慣,我會將application.properties改為application.yml文件,兩種文件格式都支持。

  1. 新建POJO類
    1 @Data    // get,set
    2 @NoArgsConstructor    // 無參
    3 @AllArgsConstructor    // 有參
    4 @Component    // 交由Spring管理bean
    5 public class IDCard {
    6     // @Value("1111")  直接賦值
    7     @Value("${id.card}")// 獲取配置文件屬性賦值
    8     private String card;
    9 }
    Spring註解@Value("${id.card}")說明:表示從配置文件中獲取屬性名為id.card的值,並將值注入到POJO屬性。
  2. 在applicaiton.yml文件中添加自定義屬性
    1 # 自定義屬性
    2 id: #屬性前綴
    3   card: 1111   #key - value格式
  3. 編寫Controller。
     1 @RestController    // 等價於Controller和ResponseBody(方法返回直接是一個JSON不能再返回頁面)
     2 public class DemoController01 {
     3     @Autowired    // 自動注入對象
     4     private IDCard idcard;
     5     
     6     @RequestMapping("/testIDCard")
     7     public IDCard testAnnotation() {
     8         return idcard;
     9     }
    10 }
  4. 運行SpringBoot啟動類,訪問測試(略)
    訪問地址://localhost:8080/testIDCard

 

 2.多屬性配置

   在屬性非常多的情況下,可以定義一個和配置文件對應的POJO。

  1. 在applicaiton.yml文件中添加自定義屬性
     1 # 自定義IDCard屬性
     2 id: 
     3   card: 1111
     4   
     5 # 自定義User屬性
     6 user:
     7   name: xsge
     8   pwd: 123
     9   map: {a: AA,b: BB}
    10   list:
    11     - 111
    12     - 222
    13   idCard:
    14     #card: 1111
    15     #或者
    16     card: ${id.card}  # 表示獲取上面一段配置的card的值
  2. 新建POJO類
    在POJO類上通過註解@ConfigurationProperties(prefix=”useg”)指明屬性的通用前綴,也標註了POJO屬性與配置文件屬性的綁定關係,通用前綴+屬性名 和 配置文件的屬性名是一一對應的。
     1 @Data
     2 @NoArgsConstructor
     3 @AllArgsConstructor
     4 @Component
     5 @ConfigurationProperties(prefix = "user")  // 標註在配置文件中,屬性名的前綴
     6 public class User {
     7     private String name;
     8     private String pwd;
     9     private Map<String,String> map;
    10     private List<String> list;
    11     private IDCard idCard;
    12 }
  3. 編寫Controller
     1 @RestController    // 等價於Controller和ResponseBody(方法返回直接是一個JSON不能再返回頁面)
     2 public class DemoController01 {
     3     
     4     @Autowired    // 自動注入對象
     5     private User user;
     6     
     7     @RequestMapping("/testUser")
     8     public User testUser() {
     9         return user;
    10     }
    11 }
  4. 啟動工程,訪問測試(略)
    訪問地址://localhost:8080/testUser

 

 3.自定義屬性文件

  上面介紹:我們都把配置文件寫到application.yml中。有時我們不願意把屬性配置都寫到application配置文件中,這時需要我們自定義配置文件,比如test.properties。怎麼將這個配置文件信息賦予給一個POJO呢?

  1. 定義多屬性配置文件person.properties
      自定義的屬性配置文件,就最好還是使用properties格式的文件,因為SpringBoot針對註解讀取自定義屬性配置文件的操作,暫時還並未提供加載yml格式文件的功能。(也就是說,使用註解方式加載屬性配置文件時,SpringBoot可以通過手動配置識別properties格式的,還沒不能識別自定義yml格式的)。特別提醒:我說的是註解方式
    1 person.uuid=12313213221321
    2 person.address=北京
  2. 定義一個和配置文件對應的POJO。
    使用的註解說明:

    @Data:Lombok組件註解,簡化POJO封裝代碼,省略get/set等
    @AllArgsConstructor:Lombok組件註解,提供全參構造
    @NoArgsConstructor:Lombok組件註解,提供無參構造
    @Component:Spring組件註解,標註為Spring組件,交由Spring容器管理POJO實例
    @ConfigurationProperties(prefix = “person”):Spring組件註解,綁定屬性配置文件與實體類POJO的關係,並指定文件里配置的屬性名前綴(前綴+POJO屬性名 = 文件屬性全名)
    @PropertySource(“classpath:person.properties”):Spring組件註解,加載指定配置文件。暫時還無法加載yml格式的。

     1 @Data
     2 @AllArgsConstructor
     3 @NoArgsConstructor
     4 @Component    // 標準為Spring組件,將對象實例化交由Spring管理  <bean id="" class=""/>
     5 @ConfigurationProperties(prefix = "person")    // 標註配置文件屬性的前綴(指定前綴+POJO屬性的名字 == 配置文件屬性全名)
     6 @PropertySource("classpath:person.properties")// 標準加載指定配置文件(無法加載yml格式)
     7 public class Person {
     8     private String uuid;
     9     private String address;
    10 }
  3. 編寫Controller
     1 @RestController    // 等價於Controller和ResponseBody(方法返回直接是一個JSON不能再返回頁面)
     2 public class DemoController01 {
     3     @Autowired    // 自動注入對象
     4     private Person person;
     5     
     6     @RequestMapping("/testPerson")
     7     public Person testPerson() {
     8         return person;
     9     }
    10 }
  4. 運行SpringBoot啟動類,訪問測試

    訪問地址://localhost:8080/testPerson

 

2.SpringBoot多環境配置

   SpringBoot多環境配置,為開發者提供了更靈活的部署操作。我們可以隨意自定義開發環境或部署環境,當然SpringBoot在啟動時,默認只會加載命名為applicaiton的配置文件,如果存在其他格式命名的配置文件,在主文件中配置激活即可。

  需求:設置多個開發環境,配置使用不同的服務端口啟動項目。

  命名規範格式:

  • application-test.yml:測試環境
  • application-dev.yml:開發環境
  • application-prod.yml:生產環境

說明:

1.配置文件後綴,可選.yml 或 .properties

2.SpringBoot啟動項目工程時,只會加載命名為application.yml 或 application.properties的文件,其他方式命名的文件加載需要在該主文件中配置激活。

根據需求實現簡單案例演示:

  1. 新增配置文件application.yml , application-dev.yml , application-test.yml

    application-test.yml :測試環境配置文件(選擇此環境須在默認文件中配置) 

    1 # 測試環境配置
    2 server:
    3   # 測試環境服務端口
    4   port: 8081
    5   servlet:
    6     # 測試環境web訪問根路徑
    7     context-path: /test

    application-dev.yml : 開發環境配置文件(選擇此環境須在默認文件中配置)

    1 # 開發環境配置
    2 server:
    3   # 服務端口設置
    4   port: 8082
    5   servlet:
    6     # web訪問根路徑
    7     context-path: /dev

     

     application-prod.yml : 部署環境配置文件(選擇此環境須在默認文件中配置)

    1 # 部署環境配置
    2 server:
    3   # 服務端口設置
    4   port: 8083
    5   servlet:
    6     # web訪問根路徑
    7     context-path: /prod

     application.yml : 主環境配置文件(SpringBoot默認加載)
      
    激活指定profile:
        A.在默認配置文件中指定 spring.profiles.active=dev/test/prod即可。
        B.打包SpringBoot工程,命令行運行,並激活指定的環境:Java  -jar  demo1.jar  –spring.profiles.active=dev;

     1 # 默認開發環境配置(將這個注釋了下面配置啟用其他環境)
     2 #server:
     3   # 服務端口設置
     4   #port: 80802
     5   #servlet:
     6     # web訪問根路徑
     7     #context-path: /
     8 
     9 # 主環境配置
    10 spring:
    11   # 配置簡介
    12   profiles:
    13     # 啟用的配置項
    14     active: 
    15       - test # SpringBoot會自動匹配前綴為applicaiton拼接指定字符的配置文件
  2. 啟動SpringBoot工程,查看控制台日誌

 

附錄

1.Spring Tool Suite工具使用

Spring Tool Suite是一個基於Eclipse的開發環境,可以自定義用於開發Spring應用程序。它提供了一個隨時可用的環境來實現,調試,運行和部署Spring應用程序。換句話說, Spring Tool Suite是一個定製版的eclipse,為spring boot&cloud量身打造的工具,其核心還是javaee版本的eclipse,是一款免費的非常合適的開發工具。

訪問Spring官網,導航欄找到Projiects——Spring Tools4,下載後解壓文件

 

 下載後文件:

 解壓文件:

解壓後目錄如下:將整個程序拷貝到指定的目錄中(自己平時喜歡將軟件安裝在哪裡,自己定):

打開目錄如下:

例如我的目錄是在:D:\Program Files (x86)\Spring Tool Suite\sts-4.8.0.RELEASE

 

啟動界面如下:

首次打開時與使用Eclipse相當,需要選擇工程保存地址,自定義即可。

另外打開後,最好按照Eclipse用法方式配置一些必要信息。

例如:工作空間編碼/JDK/字體大小/Maven環境/Lombok插件安裝等。

2.Banner彩蛋

  Spring Boot項目在啟動的時候會有一個默認的啟動圖案「Spring」標誌Banner,我們可以把這個圖案修改為自己想要的。在src/main/resources目錄下新建banner.txt文件,然後將自己的圖案黏貼進去即可。ASCII圖案可通過推薦在線網站一鍵生成。

  更多:

       //patorjk.com/software/taag      文字轉為本

       //www.network-science.de/ascii/    文字轉為本

  //www.degraeve.com/img2txt.php   圖片轉文本

 3.配置文件加載問題

  springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文件

    –file:./config/

    –file:./

    –classpath:/config/

    –classpath:/

  優先級由高到底,高優先級的配置會覆蓋低優先級的配置;

  SpringBoot會從這四個位置全部加載主配置文件;互補配置

  註:日誌配置,自己了解吧!點擊這裡