2022-06-09


SpringBoot入門



一刽锤、使用JavaConfig替代xml配置

我們通常使用 Spring 都會使用 XML 配置俩功,隨著功能以及業(yè)務邏輯的日益復雜喝峦,應用伴隨著大量的 XML 配置文件以及復雜的 bean 依賴關(guān)系牲芋,使用起來很不方便惠险。

優(yōu)勢:

1苗傅、面向?qū)ο蟮呐渲谩S捎谂渲帽欢x為 JavaConfig 中的類班巩,因此用戶可以充分使用 Java 中的面向?qū)ο蠊δ茉健R粋€配置類可以繼承另一個重寫它的 @Bean 方法等。

2抱慌、減少或者消除 XML 配置逊桦。提供了一種純 Java 的方式來配置與 XML 配置概念相似的 Spring 容器。

3抑进、類型安全和重構(gòu)友好强经。提供了一種類型安全的方法了來配置 Spring 容器,由于 Java 5 對泛型的支持寺渗,現(xiàn)在可以按類型而不是名稱檢索 bean匿情,不需要任何的強制轉(zhuǎn)換或者基于字符串的查找。

二信殊、JavaConfig 方式配置 IoC

@Configuration:在類上貼該注解表示該類是 Spring 的配置類炬称,具有 applicationContext.xml 文件的作用。

@Configuration:在類上貼該注解表示該類是 Spring 的配置類涡拘,具有 applicationContext.xml 文件的作用转砖。

@Bean:在 Spring 的配置類的方法上貼該注解后,該方法返回的對象會交給 Spring 容器管理,替代 applicationContext.xml 中的 bean 標簽府蔗。(屬于手動配置方式晋控,可以使用注解配置替代)

@ComponentScan:在 Spring 配置類上貼該注解表示開啟組件掃描器,默認掃描當前配置類所在的包姓赤,也可以自己指定赡译,替代 XML 配置中的 <context:component-scan /> 標簽。(掃描器不铆,掃描需要生成的類)

AnnotationConfigApplicationContext:該類是 ApplicationContext 接口的實現(xiàn)類蝌焚,該對象是基于 JavaConfig 的方式來運作的 Spring 容器(屬于手動配置方式,可以使用注解配置替代)

三誓斥、JavaConfig 方式配置 DI

原理:Spring 容器在調(diào)用實例方法時只洒,根據(jù)方法返回對象類型,判斷容器中是否已經(jīng)存在該類型的實例對象劳坑,如果不存在則執(zhí)行實例方法毕谴,將返回對象實例交給容器管理,如果該實例已經(jīng)存在了距芬,直接從容器中拿已經(jīng)存在實例對象方法涝开,不執(zhí)行實例方法。

```???

@Bean

public SomeBean someBean() {

? ? SomeBean someBean = new SomeBean();

? ? return someBean;

}(屬于手動配置框仔,可使用注解替代)

```

四舀武、使用 IoC DI 注解簡化配置

與使用xml注解類似,在需要交給Spring容器管理的類貼上注解@Component离斩,在字段或者設置器上貼@AutoWired即可银舱,在字段上貼屬于暴力破解封裝,在設置器上貼注解屬于使用反射獲取跛梗。再創(chuàng)建配置類纵朋,在配置類上貼上兩個注解即可,與xml配置中的? ? ? ?<context:component-scan base-package="cn.wolfcode.bean"/>? ? ? 掃描器功能相同茄袖。

```

@Configuration // 表示該類是 Spring 的配置類

@ComponentScan // 開啟組件掃描器,默認掃描當前類所在的包嘁锯,及其子包

public class JavaConfig { }

```

五宪祥、使用junit4和junit5測試類測試的差異

說明:junit5測試類更加簡潔。

```

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes={配置類1.class, 配置類2.class, ...})

public class IoCTest {

? ? @Autowired

? ? private SomeBean someBean;

? ? @Test

? ? public void test() {

? ? ? ? System.out.println(someBean);

? ? }

}

```

```

@SpringJUnitConfig(配置類.class)

class IoCTest {

? ? @Autowired

? ? private SomeBean someBean;

? ? @Test

? ? void test() {

? ? ? ? System.out.println(someBean);

? ? }

}

```

六家乘、JavaConfig配置關(guān)聯(lián)次配置

說明:主配置類中關(guān)聯(lián)了次配置類后蝗羊,測試類中只需要加載主配置文件的路徑即可。

```

// 主配置類 mvc.xml

@Configuration

@Import(OtherJavaConfig.class) // 在主配置類中關(guān)聯(lián)次配置類

public class JavaConfig { ... }

// 次配置類 applicationContext.xml

@Configuration

public class OtherJavaConfig { ... }

// 測試

@SpringJUnitConfig(classes = JavaConfig.class) // 加載主配置類

public class IoCTest { ... }

```


七仁锯、Spring Boot 介紹

概念:Spring Boot 是由 Pivotal 團隊提供的全新框架耀找,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發(fā)過程。

人們把 Spring Boot 稱為搭建程序的腳手架。其最主要作用就是幫我們快速的構(gòu)建龐大的 Spring 項目野芒,并且盡可能的減少一切 XML 配置蓄愁,做到開箱即用,迅速上手狞悲,讓我們關(guān)注與業(yè)務而非配置撮抓。

1、優(yōu)點

創(chuàng)建獨立運行的 Spring 應用程序摇锋;

可嵌入 Tomcat丹拯,無需部署 war 文件;

簡化 Maven 配置荸恕;

自動配置 Spring(減少配置)乖酬;

提供生產(chǎn)就緒型功能,如:日志融求,健康檢查和外部配置等咬像;

不要求配置 XML;

非常容易和第三方框架集成起來双肤。

2施掏、缺點

版本更新較快,可能出現(xiàn)較大變化茅糜;

因為約定經(jīng)常會出現(xiàn)一些很難解決的問題七芭。

(一)使用 IDEA 創(chuàng)建 Spring Boot 工程

兩種創(chuàng)建方式:

1.使用官方提供的工具來快速構(gòu)建項目。IDEA 自帶該功能蔑赘,但需要聯(lián)網(wǎng)使用狸驳。

2.直接在idea上創(chuàng)建。


疑惑解答:

當前項目繼承的 spring-boot-starter-parent 項目有什么用缩赛?


導入的依賴 spring-boot-starter-web 有什么用耙箍?


占用 8080 端口的 Tomcat9 服務器哪來的?


之前的 Web 應用打包是 war酥馍,為什么現(xiàn)在的打包方式是 jar辩昆?


@SpringBootApplication 注解有什么用?


main 方法中執(zhí)行的代碼 SpringApplication.run(..) 有什么用旨袒?

(二)Spring Boot Starter

概述:Spring Boot 在配置上相比 Spring 要簡單許多汁针,其核心在于 spring-boot-starter, 在使用 Spring Boot 來搭建一個項目時砚尽,只需要引入官方提供的 starter施无,就可以直接使用,免去了各種配置必孤。

以后若添加依賴時候猾骡,發(fā)現(xiàn)這個依賴有 starter,? 一般這個依賴都會幫開發(fā)者配置東西

官方目前已提供的常見的 Starter 如下 :

spring-boot-starter:核心啟動器,提供了自動配置,日志和 YAML 配置支持兴想。

spring-boot-starter-aop:支持使用 Spring AOP 和 AspectJ 進行切面編程幢哨。

spring-boot-starter-freemarker:支持使用 FreeMarker 視圖構(gòu)建 Web 應用。

spring-boot-starter-test:支持使用 JUnit襟企,測試 Spring Boot 應用嘱么。

spring-boot-starter-web:支持使用 Spring MVC 構(gòu)建 Web 應用,包括 RESTful 應用顽悼,使用 Tomcat 作為默認的嵌入式容器曼振。

spring-boot-starter-actuator:支持使用 Spring Boot Actuator 提供生產(chǎn)級別的應用程序監(jiān)控和管理功能。

spring-boot-starter-logging:提供了對日志的支持蔚龙,默認使用 Logback冰评。

有關(guān) Spring Boot Starter 命名規(guī)范,所有官方發(fā)布的 Starter 都遵循以下命名模式:spring-boot-starter-*木羹,其中 * 指特定的應用程序代號或名稱甲雅。任何第三方提供的 Starter 都不能以 spring-boot 作為前綴,應該將應用程序代號或名稱作為前綴坑填,譬如 mybatis-spring-boot-starter抛人。



(三)重要的依賴

web啟動器:(Spirngboot已經(jīng)幫我們配置好了

```

<dependencies>

? ? <dependency>

? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? <artifactId>spring-boot-starter-web</artifactId>

? ? </dependency>

</dependencies>

```

```

Spring Boot 項目打包獨立運行:

需要我們手動導入,導入后打包會自動生成可獨立運行的jar包脐瑰,否則只有源代碼的jar包妖枚,運維拿到后還需要裝tomcat才能運行

命令行? ? **啟動項目**? ? 時的指令:java -jar xxx.jar --server.port=80;

<!-- pom.xml 中添加插件 -->

<build>

? ? <plugins>

? ? ? ? <!-- Spring Boot 打包插件 -->

? ? ? ? <plugin>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? <artifactId>spring-boot-maven-plugin</artifactId>

? ? ? ? </plugin>

? ? </plugins>

</build>

```

八苍在、Spring Boot 參數(shù)配置

配置文件的三種寫法(一般使用application.properties配置)

自定義 properties 文件

```

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/rbac

jdbc.username=root

jdbc.password=admin

```

application.properties 語法

```

server.port=80

server.session-timeout=30

server.tomcat.uri-encoding=UTF-8

spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/rbac

spring.datasource.username=root

spring.datasource.password=admin

```

application.yml 語法

```

server:

? port: 80

? session-timeout: 30?

? tomcat.uri-encoding: UTF-8?

spring:?

? datasource:?

? ? url: jdbc:mysql://localhost:3306/crm?

? ? username: root?

? ? password: admin?

? ? driverClassName: com.mysql.jdbc.Driver

```

概述:讀取三種配置文件的方式

一绝页、使用自定義 properties 文件,一定要關(guān)聯(lián)配置類寂恬,使用@PropertySource("classpath:db.properties")以及@Value("${jdbc.driverClassName}")兩個注解同時完成配置(一般不使用)

二续誉、參數(shù)配置在 application.properties(不要關(guān)聯(lián))

三、@ConfigurationProperties 綁定對象屬性

注意:若是使用測試類加載貼有 @Configuration 的配置類初肉,則需要在配置類中添加 @EnableConfigurationProperties 注解酷鸦;若是使用測試類加載貼有 @SpringBootApplication 的配置類,則不需要牙咏。

四臼隔、使用 Spring 的 Environment 對象綁定屬性

第一步:在# application.properties寫好配置文件

```

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/crm

jdbc.username=root

jdbc.password=admin

```

第二步:在配置類中貼上對應的注解

第一種方式:

```

@Component

@ToString

@Setter

@ConfigurationProperties(prefix="jdbc")

public class MyDataSource {

? ? private String driverClassName;

? ? private String url;

? ? private String username;

? ? private String password;

}

第二種方式:

?```

@Bean

@ConfigurationProperties("jdbc")

public MyDataSource dataSource() {

? ? return new MyDataSource();

}

```

第三步:在測試類中創(chuàng)建environment對象,使用environment對象獲取配置文件的信息

```

@Configuration

@PropertySource("classpath:db.properties")

public class JavaConfig {

? ? /**

? ? * environment:表示 Spring 的環(huán)境對象眠寿,該對象包含了加載的屬性數(shù)據(jù)

? ? * 可以獲取到 application.properties 里面的參數(shù),也可以獲取到 @PropertySource 中的參數(shù)

? ? * 但 application.properties 的優(yōu)先級比 @PropertySource 高

? ? */

? ? @Autowired

? ? private Environment environment;

? ? @Bean

? ? public MyDataSource dataSource() {

? ? ? ? MyDataSource dataSource = new MyDataSource();

? ? ? ? dataSource.setDriverClassName(environment.getProperty("jdbc.driverClassName"));

? ? ? ? dataSource.setUrl(environment.getProperty("jdbc.url"));

? ? ? ? dataSource.setUsername(environment.getProperty("jdbc.username"));

? ? ? ? dataSource.setPassword(environment.getProperty("jdbc.password"));

? ? ? ? return dataSource;

? ? }

}

```

使用時機:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焦蘑,一起剝皮案震驚了整個濱河市盯拱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖狡逢,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宁舰,死亡現(xiàn)場離奇詭異,居然都是意外死亡奢浑,警方通過查閱死者的電腦和手機蛮艰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雀彼,“玉大人壤蚜,你說我怎么就攤上這事』惭疲” “怎么了袜刷?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長莺丑。 經(jīng)常有香客問我著蟹,道長,這世上最難降的妖魔是什么梢莽? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任萧豆,我火速辦了婚禮,結(jié)果婚禮上昏名,老公的妹妹穿的比我還像新娘涮雷。我一直安慰自己,他們只是感情好葡粒,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布份殿。 她就那樣靜靜地躺著,像睡著了一般嗽交。 火紅的嫁衣襯著肌膚如雪卿嘲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天夫壁,我揣著相機與錄音拾枣,去河邊找鬼。 笑死盒让,一個胖子當著我的面吹牛梅肤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邑茄,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼姨蝴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肺缕?” 一聲冷哼從身側(cè)響起左医,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤授帕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浮梢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跛十,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年秕硝,在試婚紗的時候發(fā)現(xiàn)自己被綠了芥映。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡远豺,死狀恐怖奈偏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情憋飞,我是刑警寧澤霎苗,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站榛做,受9級特大地震影響唁盏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜检眯,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一厘擂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锰瘸,春花似錦刽严、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至管削,卻和暖如春倒脓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背含思。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工崎弃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人含潘。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓饲做,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遏弱。 傳聞我的和親對象是個殘疾皇子盆均,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容