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;
? ? }
}
```
使用時機: