簡(jiǎn)介
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來(lái)進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。(這里隨便看看就行)
Springboot中文文檔,相信很多人都需要這個(gè):
http://www.spring-boot.org/doc/pages/using-spring-boot.html
優(yōu)點(diǎn)
快速創(chuàng)建獨(dú)立運(yùn)行的Spring項(xiàng)目以及與主流框架集成
使用嵌入式的Servlet容器,應(yīng)用無(wú)需打成WAR包
starters自動(dòng)依賴與版本控制
大量的自動(dòng)配置,簡(jiǎn)化開發(fā),也可修改默認(rèn)值
無(wú)需配置XML,無(wú)代碼生成,開箱即用
準(zhǔn)生產(chǎn)環(huán)境的運(yùn)行時(shí)應(yīng)用監(jiān)控
與云計(jì)算的天然集成
如果上面看不懂,可以看這里(這是對(duì)新手體驗(yàn)比較明顯的優(yōu)點(diǎn),我也是新手)
1、你需要明白的是SpringBoot是一款優(yōu)秀的框架,集成了很多主流的框架,而且有自動(dòng)配置功能,不需要手動(dòng)編寫配置文件;
2、Springboot可以免除一系列發(fā)布的工作,可以直接生成jar包直接發(fā)布,不需要像Spring那樣打war包,配置tomcat服務(wù)器再進(jìn)行發(fā)布,SpringBoot有內(nèi)置的Tomcat服務(wù)器;
入門
在入門之前,如果你還沒有了解maven這個(gè)東西的話,建議去B站或者學(xué)習(xí)網(wǎng)站去看一些關(guān)于maven的介紹,不需要花太多時(shí)間,大約一個(gè)小時(shí)左右了解一下就可以了,后續(xù)可以繼續(xù)去學(xué)習(xí)maven因?yàn)镾pringBoot也是一個(gè)maven工程。
創(chuàng)建一個(gè)maven工程
1、導(dǎo)入spring boot相關(guān)的依賴(在pom.xml文件中貼入)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2、編寫一個(gè)主程序;啟動(dòng)Spring Boot應(yīng)用
package cn.clboy.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
*
* SpringBootApplication:標(biāo)注一個(gè)主程序類,表示這個(gè)是一個(gè)Springboot應(yīng)用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
//啟動(dòng)
SpringApplication.run(HelloWorldMainApplication.class, args);
}
}
3、編寫一個(gè)controller
package cn.clboy.springboot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
* @RestController:是spring4里的新注解,是@ResponseBody和@Controller的縮寫。
*避免了在每個(gè)api上面都加上一個(gè)@ResponseBody注解
*具體的可以查閱網(wǎng)上的文章
*/
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello SpringBoot,this is my first Application";
}
}
運(yùn)行主程序Main方法測(cè)試
簡(jiǎn)化部署
這里即是上面提到的Springboot的優(yōu)點(diǎn);
1、在pom.xml文件中添加插件
<!-- 這個(gè)插件,可以將應(yīng)用打包成一個(gè)可執(zhí)行的jar包;-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2、使用mvn package命令進(jìn)行打包或者用idea執(zhí)行mvn package命令


3、打包完成之后,在項(xiàng)目路徑下會(huì)出現(xiàn)一個(gè)target的文件夾,其中的便有剛剛打包好的jar包;

友情提醒:當(dāng)需要進(jìn)行第二次打包之前建議先執(zhí)行命令 mvn clean 清除target文件夾再進(jìn)行第二次的打包,否則可能會(huì)出現(xiàn)問題!
Hello Word項(xiàng)目探究
依賴和啟動(dòng)器就是上面SpringBoot所需要引入的兩段代碼
依賴
<!--父項(xiàng)目
spring-boot-01-hellword項(xiàng)目依賴于spring-boot-starter-parent這個(gè)父項(xiàng)目,
spring-boot-starter-parent又繼續(xù)依賴于spring-boot-dependencies這個(gè)父項(xiàng)目
spring-boot-dependencies:
他來(lái)真正管理Spring Boot應(yīng)用里面的所有依賴版本;
也是Spring Boot的版本仲裁中心;
以后我們導(dǎo)入依賴默認(rèn)是不需要寫版本;(沒有在dependencies里面管理的依賴自然需要聲明版本號(hào))
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/>
</parent>
啟動(dòng)器
<!-- 啟動(dòng)器
spring-boot-starter-web:
spring-boot-starter:spring-boot場(chǎng)景啟動(dòng)器;spring-boot-starter-web:幫我們導(dǎo)入了web模塊正常運(yùn)行所依賴的組件;
Spring Boot將所有的功能場(chǎng)景都抽取出來(lái),做成一個(gè)個(gè)的starters(啟動(dòng)器),
只需要在項(xiàng)目里面引入這些starter相關(guān)場(chǎng)景的所有依賴都會(huì)導(dǎo)入進(jìn)來(lái)。要用什么功能就導(dǎo)入什么場(chǎng)景的啟動(dòng)器
對(duì)應(yīng)幫助文檔 13.5: Starter
-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
主程序類,主入口類
/***
* @SpringBootApplication :這個(gè)注解是標(biāo)注一個(gè)主程序類,說(shuō)明這是一個(gè)Springboot應(yīng)用
*/
@SpringBootApplication
public class HellwordApplication {
public static void main(String[] args) {
//Spring 應(yīng)用啟動(dòng)
SpringApplication.run(HellwordApplication.class,args);
}
}
@SpringBootApplication: Spring Boot應(yīng)用標(biāo)注在某個(gè)類上說(shuō)明這個(gè)類是SpringBoot的主配置類,SpringBoot就應(yīng)該運(yùn)行這個(gè)類的main方法來(lái)啟動(dòng)SpringBoot應(yīng)用;
接下來(lái)解析一下這些注解的作用
1.@SpringBootApplication :注解源碼以及其包含的其他注解
@Target({ElementType.TYPE}) //可以給一個(gè)類型進(jìn)行注解,比如類、接口、枚舉
@Retention(RetentionPolicy.RUNTIME) //可以保留到程序運(yùn)行的時(shí)候,它會(huì)被加載進(jìn)入到 JVM 中
@Documented //將注解中的元素包含到 Javadoc 中去。
@Inherited //繼承,比如A類上有該注解,B類繼承A類,B類就也擁有該注解
@SpringBootConfiguration
@EnableAutoConfiguration
/*
*創(chuàng)建一個(gè)配置類,在配置類上添加 @ComponentScan 注解。
*該注解默認(rèn)會(huì)掃描該類所在的包下所有的配置類,相當(dāng)于之前的 <context:component-scan>。
*/
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication
1.1@SpringBootConfiguration: 源碼如下
Spring Boot定義的配置類;
標(biāo)注在某個(gè)類上,表示這是一個(gè)Spring Boot的配置類;
其中包含 @Configuration注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration
1.1.1 @Configuration: 源碼如下
@Configuration注解是Spring底層的注解
SpringBoot配置類上面需要標(biāo)注這個(gè)注解
而 配置類 ---->相當(dāng)于 ----> 配置文件
配置類也相當(dāng)于容器中的一個(gè)組件@Component
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration
1.2@EnableAutoConfiguration:開啟自動(dòng)配置功能; 源碼如下
以前我們需要配置的東西,Spring Boot幫我們自動(dòng)配置;
@EnableAutoConfiguration告訴SpringBoot開啟自動(dòng)配置功能;這樣自動(dòng)配置才能生效;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration
1.2.1 @AutoConfigurationPackage:自動(dòng)配置包
該注解使用@Import({Registrar.class})完成的功能
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
1.2.1.1@Import({Registrar.class}):Spring底層注解@Import,給容器中導(dǎo)入一個(gè)組件;
該注解屬于@AutoConfigurationPackage內(nèi)的注解
Registrar.class ==》 org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar
導(dǎo)入的組件由org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar將主配置類 (@SpringBootApplication標(biāo)注的類)的所在包及下面所有子包里面的所有組件掃描到Spring容器;
這里controller包是在主程序所在的包下,所以會(huì)被掃描到,我們?cè)趕pringboot包下創(chuàng)建一個(gè)test包,把controller放在test包下,這樣啟動(dòng)在啟動(dòng)也無(wú)法掃描到test包下的controller,從而訪問test包下的controller就是404

1.2.2 @Import({AutoConfigurationImportSelector.class})
該注解屬于@EnableAutoConfiguration內(nèi)的注解
AutoConfigurationImportSelector.class將所有需要導(dǎo)入的組件以全類名的方式返回;這些組件就會(huì)被添加到容器中;
會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類( xxxxAutoConfiguration );就是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件,并配置好這些組件;
有了自動(dòng)配置類,免去了我們手動(dòng)編寫配置注入功能組件等的工作;


小結(jié)
J2EE的整體整合解決方案和自動(dòng)配置都在:spring-boot-autoconfigure-2.2.1.RELEASE.jar
Spring Boot在啟動(dòng)的時(shí)候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類導(dǎo)入到容器中,自動(dòng)配置類就生效,幫我們進(jìn)行自動(dòng)配置工作;
以前我們需要自己配置的東西,自動(dòng)配置類都幫我們完成了;
小結(jié)
