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.註解說明
這三個註解的作用分別為:
@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根目錄下。
配置文件在工程中的作用主要有兩個:
- 通過配置文件屬性映射,結合註解方式為POJO屬性賦值
- 添加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文件,兩種文件格式都支持。
- 新建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屬性。
- 在applicaiton.yml文件中添加自定義屬性
1 # 自定義屬性 2 id: #屬性前綴 3 card: 1111 #key - value格式
- 編寫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 }
- 運行SpringBoot啟動類,訪問測試(略)
訪問地址://localhost:8080/testIDCard
2.多屬性配置
在屬性非常多的情況下,可以定義一個和配置文件對應的POJO。
- 在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的值
- 新建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 }
- 編寫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 }
- 啟動工程,訪問測試(略)
訪問地址://localhost:8080/testUser
3.自定義屬性文件
上面介紹:我們都把配置文件寫到application.yml中。有時我們不願意把屬性配置都寫到application配置文件中,這時需要我們自定義配置文件,比如test.properties。怎麼將這個配置文件信息賦予給一個POJO呢?
- 定義多屬性配置文件person.properties
自定義的屬性配置文件,就最好還是使用properties格式的文件,因為SpringBoot針對註解讀取自定義屬性配置文件的操作,暫時還並未提供加載yml格式文件的功能。(也就是說,使用註解方式加載屬性配置文件時,SpringBoot可以通過手動配置識別properties格式的,還沒不能識別自定義yml格式的)。特別提醒:我說的是註解方式
1 person.uuid=12313213221321 2 person.address=北京
- 定義一個和配置文件對應的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 }
- 編寫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 }
- 運行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的文件,其他方式命名的文件加載需要在該主文件中配置激活。
根據需求實現簡單案例演示:
- 新增配置文件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拼接指定字符的配置文件
- 啟動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會從這四個位置全部加載主配置文件;互補配置;
註:日誌配置,自己了解吧!點擊這裡