動(dòng)力節(jié)點(diǎn)王鶴springboot3視頻筆記第二章
SpringBoot同時(shí)提供“開箱即用”嫡丙,“約定優(yōu)于配置”的特性拴袭。
Spring Boot理念“約定優(yōu)于配置”,也可稱為按約定編程
Spring框架:Spring Boot創(chuàng)建的是Spring應(yīng)用代咸,對(duì)于這點(diǎn)非常重要蹈丸。也就是使用Spring框架創(chuàng)建的應(yīng)用程序。這里的Spring是指 Spring Framework呐芥。 我們常說的Spring白华,一般指Spring家族,包括Spring Boot贩耐、Spring Framework 、Spring Data 厦取,Spring Security,Spring Batch , Spring Shell, Spring for Apache Kafka ....潮太。
2004年3月,Spring Framework1.0發(fā)布虾攻。2006年10 月铡买,Spring Framework2.0發(fā)布。2006年后開始霎箍,國內(nèi)項(xiàng)目漸漸的開始應(yīng)用Spring框架奇钞,2009年12月,Spring3.0發(fā)布漂坏。這時(shí)國內(nèi)已經(jīng)比較注重Spring使用了景埃。項(xiàng)目多數(shù)轉(zhuǎn)移到Spring框架了。 我是在2007開始知道漸漸了解Spring框架顶别。 那個(gè)時(shí)候用Struts或者就是jsp+servlet+jdbc比較多谷徙。當(dāng)時(shí)研發(fā)項(xiàng)目也沒什么煩惱, 就一驯绎,兩個(gè)技術(shù)可以用完慧。沒什么可選擇的。現(xiàn)在的框架剩失,技術(shù)太多了屈尼。2017 年 09 月,Spring Framework5.0 發(fā)布拴孤。 2022年11月Spring Framework6.0發(fā)布脾歧。第一個(gè)版本1.0的blog:https://spring.io/blog/2004/03/24/spring-framework-1-0-final-released
Spring Boot在現(xiàn)在Java開發(fā)人員必須掌握的框架滤蝠。Spring Boot是掌握Spring Cloud的基礎(chǔ)李根。
學(xué)習(xí)Spring Colud難度比較大炫狱,里面框架,工具比較多剔猿。有多個(gè)框架需要學(xué)習(xí)视译,在把框架組合起來又是一個(gè)難度。
伴隨著Spring Boot3的發(fā)布白嘁,還有 Spring Framework 6.0的發(fā)布(2022-11-16),先于Spring Boot發(fā)布。
腳手架是一種用在建筑領(lǐng)域的輔助工具,是為了保證建筑施工過程順利進(jìn)行而搭設(shè)的工作平臺(tái)罚舱。軟件工程中的腳手架是用來快速搭建一個(gè)小的可用的應(yīng)用程序的骨架井辜,將開發(fā)過程中要用到的工具、環(huán)境都配置好管闷,同時(shí)生成必要的模板代碼粥脚。腳手架輔助創(chuàng)建程序的工具,Spring Initializr是創(chuàng)建Spring Boot項(xiàng)目的腳手架包个∷⒃剩快速建立 Spring Boot項(xiàng)目的最好方式。他是一個(gè)web應(yīng)用赃蛛,能夠在瀏覽器中使用恃锉。IDEA中繼承了此工具搀菩,用來快速創(chuàng)建Spring Boot項(xiàng)目以及Spring Cloud項(xiàng)目呕臂。Spring Initializr腳手架的web地址:https://start.spring.io/阿里云腳手架:https://start.aliyun.com/
2.2.1 使用腳手架創(chuàng)建項(xiàng)目
1.瀏覽器訪問腳手架,創(chuàng)建項(xiàng)目2.IDEA中使用腳手架肪跋。
創(chuàng)建Spring Boot工程 Lesssion02-Project , Lession03-Project歧蒋。腳手架使用需要聯(lián)網(wǎng)。
2.2.2 IDEA創(chuàng)建SpringBoot項(xiàng)目
2.3.1.4 spring-boot-starter-parent
[if !supportLists]·?[endif]JDK的基準(zhǔn)版本,比如<java.version>17</java.version>
[if !supportLists]·?[endif]源碼使用UTF-8 格式編碼
[if !supportLists]·?[endif]公共依賴的版本
[if !supportLists]·?[endif]自動(dòng)化的資源過濾:默認(rèn)把src/main/resources目錄下的文件進(jìn)行資源打包
[if !supportLists]·?[endif]maven的占位符為‘@’
[if !supportLists]·?[endif]對(duì)多個(gè)Maven插件做了默認(rèn)配置尺上,如maven-compile-plugin材蛛,maven-jar-plugin
<groupId>org.springframework.boot</groupId>??????
<artifactId>spring-boot-dependencies</artifactId>??????
<version>3.0.1</version>??????
</dependencies></dependencyManagement>
2.4 運(yùn)行Spring Boot項(xiàng)目方式
[if !supportLists]·?[endif]開發(fā)工具豆赏,例如IDEA 執(zhí)行main方法
[if !supportLists]·?[endif]Maven插件 mvn spring-boot:run
[if !supportLists]·?[endif]java -jar jar文件的路徑
創(chuàng)建Lession06-package演示打包jar應(yīng)用抚岗。
更進(jìn)一步普通的jar與Spring Boot jar區(qū)別:
項(xiàng)目spring boot jar普通的jar
目錄BOOT-INF : 應(yīng)用的class和依賴jarMETA-INF: 清單
org.springframework.boot.loader: spring-boot-loader模塊類
目錄class:應(yīng)用的類lib:應(yīng)用的依賴沒有BOOT-INF
spring-boot-loader執(zhí)行jar的spring boot類沒有此部分
命令:powershell中 tree?/FSpring Boot jar文件的結(jié)構(gòu):
[if !supportLists]1.?[endif]依賴坐標(biāo)、版本
[if !supportLists]2.?[endif]傳遞依賴的坐標(biāo)叉信、版本
[if !supportLists]3.?[endif]配置類亩冬,配置項(xiàng)
?<groupId>org.mybatis.spring.boot</groupId>??
<artifactId>mybatis-spring-boot-starter</artifactId>??
2.6.1配置文件基礎(chǔ)2.6.1.1 配置文件格式
yml格式特點(diǎn):YAML基本語法規(guī)則:
[if !supportLists]·?[endif]大小寫敏感
[if !supportLists]·?[endif]使用縮進(jìn)表示層級(jí)關(guān)系
[if !supportLists]·?[endif]縮進(jìn)只可以使用空格,不允許使用Tab鍵
[if !supportLists]·?[endif]縮進(jìn)的空格數(shù)目不重要榕暇,相同層級(jí)的元素左側(cè)對(duì)齊即可
YAML支持三種數(shù)據(jù)結(jié)構(gòu)
[if !supportLists]·?[endif]對(duì)象:鍵值對(duì)的集合缴啡,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
[if !supportLists]·?[endif]數(shù)組:一組按次序排列的值壁晒,又稱為序列(sequence) / 列表(list)
Spring Boot同時(shí)支持properties和yml格式的配置文件固蚤。 配置文件名稱默認(rèn)是application娘汞。我們可以使用application.properties , application.yml。讀取配置文件的key值夕玩,注入到Bean的屬性可用@Value你弦,@Value一次注入一個(gè)key的值惊豺。將多個(gè)key值綁定到Bean的多個(gè)屬性要用到@ConfigurationProperties注解。在代碼中訪問屬性除了注解禽作,Spring提供了外部化配置的抽象對(duì)象Environment尸昧。Environment包含了幾乎所有外部配置文件,環(huán)境變量旷偿,命令行參數(shù)等的所有key和value烹俗。需要使用Environment的注入此對(duì)象,調(diào)用它的getProperty(String ?key)方法即可萍程。
2.6.1.3 application.properties
step3:單元測(cè)試在test目錄下創(chuàng)建測(cè)試類,注入SomeService對(duì)象输莺,調(diào)用它的printValue()方法戚哎。
@SpringBootTest ?public class TestPropConfig {
輸出:result = Lession07;changming;8001
step2: 運(yùn)行單元測(cè)試TestPropConfig#test01()輸出:result = Lession07-yml;bjpowernode;8002
step1:創(chuàng)建ReadConfig類露氮,注入Environment
@Autowired ?private Environment environment;
String name = environment.getProperty("app.name");
if (environment.containsProperty("app.owner")) {
System.out.println("有app.owner配置項(xiàng)");
//讀取key轉(zhuǎn)為需要的類型祖灰,提供默認(rèn)值8000
Integer port = environment.getProperty("app.port", Integer.class, 8000);
String result = String.format("讀取的name:%s,端口port:%d", name,port);
System.out.println("result = " + result);
private ReadConfig readConfig;
輸出:有app.owner配置項(xiàng)result = 讀取的name:Lession07-yml畔规,端口port:8002
step1:在resources創(chuàng)建自定義conf目錄,在conf中創(chuàng)建redis.yml, db.yml
step2: application.yml導(dǎo)入多個(gè)配置
step3:創(chuàng)建類牺汤,讀取兩個(gè)文件的配置項(xiàng)
public class MultiConfigService {
@Value("${spring.redis.host}")
@Value("${spring.datasource.url}")
System.out.println("redis的ip:"+redisHost+"辽旋,數(shù)據(jù)庫url;"+dbUrl);
class MultiConfigServiceTest {
private MultiConfigService multiConfigService;
multiConfigService.printConfig();
輸出:redis的ip:192.168.1.10檐迟,數(shù)據(jù)庫url补胚;jdbc:mysql://192.168.1.21/db?serverTime=Asia/Shanghai
step1:在resources創(chuàng)建環(huán)境配置文件
spring.profiles.active: 環(huán)境名稱
step3: 創(chuàng)建讀取配置項(xiàng)的類
public class MulitEnvService {
private MulitEnvService service;
void test01() {service.print();
step2: 創(chuàng)建Bean,定義name枣抱,owner, port屬性
security:username: commonpassword: abc123
輸出:security = Security{username='common', password='abc123'}
Map,List以及Array都能提供配置數(shù)據(jù)团赏, 下面通過一個(gè)示例配置集合屬性箕般。
step1:創(chuàng)建保存數(shù)據(jù)的Bean
step2: 修改application.yml, 配置數(shù)據(jù)
com.bjpowernode.config.pk5是新增的包抒痒, 按自己的包結(jié)構(gòu)指定名稱幌绍。
需求:一個(gè)組織信息糜值,在單獨(dú)的properties文件提供組織的名稱丰捷,管理者和成員數(shù)量
step2:在resources目錄下的任意位置創(chuàng)建properties文件寂汇,我們創(chuàng)建group-info.properties病往,放在resources根目錄。
控制臺(tái)輸出:group = Group{name='IT學(xué)習(xí)專欄', leader='無名', members=500}
總結(jié):@ConfigurationProperties綁定Bean對(duì)于使用配置文件的數(shù)據(jù)是十分方便骄瓣,靈活的停巷。也支持對(duì)數(shù)據(jù)的校驗(yàn),校驗(yàn)是JSR303規(guī)范中的注解榕栏。Bean定義結(jié)合Lombok會(huì)更加方便畔勤。如果團(tuán)隊(duì)都接受Lombok。 推薦使用扒磁。
將對(duì)象注入到Sprin容器庆揪,可以通過如下方式:
[if !supportLists]·?[endif]傳統(tǒng)的XML配置文件
[if !supportLists]·?[endif]Java Config技術(shù), @Configuration與@Bean
需求:XML配置Spring容器。聲明Beanstep1: 創(chuàng)建Person類会烙,對(duì)象由容器管理
public class Person {private String name;private Integer age;//set | get ,toString}
step2:resources目錄下創(chuàng)建XML配置文件
step3: 啟動(dòng)類负懦,從容器中獲取Person對(duì)象
@ImportResource(locations ?= "classpath:/applicationContext.xml"), 加載類路徑下的applicationContext.xml文件柏腻。location或者value屬性都能指定文件路徑纸厉。
[if !supportLists]·?[endif]Aspect:表示切面水慨,開發(fā)自己編寫功能增強(qiáng)代碼的地方得糜,這些代碼會(huì)通過動(dòng)態(tài)代理加入到原有的業(yè)務(wù)方法中敬扛。@Aspect注解表示當(dāng)前類是切面類。 切面類是一個(gè)普通類朝抖。
[if !supportLists]·?[endif]Target Object: 目標(biāo)對(duì)象穿香。 在A類的print()方法執(zhí)行前, 輸出方法的執(zhí)行時(shí)間绎速。 也就是給A這個(gè)對(duì)象增加了“輸出執(zhí)行時(shí)間的功能”皮获。
step2:創(chuàng)建業(yè)務(wù)類SomeService在aop的service子包
結(jié)論:在業(yè)務(wù)方法前岔霸,先執(zhí)行了切面類中sysLog()的功能增強(qiáng)代碼薛躬。