一声登、Spring Boot入門
1狠鸳、簡介
Spring boot來簡化Spring應用開發(fā)的一個框架,整個Spring技術(shù)棧的一個大整合悯嗓,約定大于配置件舵,去繁從簡,just run就能創(chuàng)立一個獨立的脯厨,產(chǎn)品級別的應用
背景: J2EE笨重的開發(fā)铅祸、配置繁多,復雜的部署流程、第三方技術(shù)集成壓力大
解決:
Spring Boot --> J2EE一站式解決方案
Spring Cloud --> 分布式整體解決方案
優(yōu)點:
快速創(chuàng)建獨立運行的Spring項目以及主流框架集成
使用嵌入式的Servlet容器临梗,應用無需打成WAR包
starters自動依賴和版本控制
大量的自動配置涡扼,簡化開發(fā),也可修改默認值
無需配置XML盟庞,無代碼生成吃沪,開箱即用
準生產(chǎn)環(huán)境的運行時應用監(jiān)控
與云計算的天然集成
缺點: 易學難精
2、微服務
2014年什猖,Martin Fowler寫了一篇文章票彪,微服務是一種架構(gòu)風格,一個應用應該是一組小型服務不狮,可以通過HTTP進行通信降铸。每一個功能元素都是可獨立替換和升級的單元。
Spring Boot可以快速構(gòu)建一個應用摇零,Spring Cloud進行網(wǎng)狀互連互調(diào)推掸,Spring Cloud Data Flow在分布式中進行流式計算和批處理
James Lewis and Martin Fowler (2014)
In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.
谷歌翻譯后:
James Lewis and Martin Fowler (2014)
簡而言之,微服務架構(gòu)風格是一種將單個應用程序開發(fā)為一組小服務的方法驻仅,每個小服務都在自己的進程中運行并與輕量級機制(通常是HTTP資源API)進行通信谅畅。 這些服務圍繞業(yè)務功能構(gòu)建,并且可以由全自動部署機制獨立部署雾家。 這些服務的集中管理幾乎沒有,可以用不同的編程語言編寫并使用不同的數(shù)據(jù)存儲技術(shù)绍豁。
3芯咧、Hello World
3.1 快速創(chuàng)建一個Spring Boot項目
- File-->New-->Project,選中Spring Initializr竹揍,默認點擊next
- 填寫Group敬飒、Artifact、Package芬位,點擊next
- 選擇導入的模塊无拗,這里我們先只選Spring Web,點擊next
- 填寫Project name昧碉,點擊Finish
-
在com.springboot.helloworld右鍵New Class英染,寫入controller.HelloController,點擊OK被饿,在HelloController下寫入
@RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "Hello Spring boot "; } }
啟動主程序四康,在瀏覽器寫入localhost:8080/hello即可成功
-
注意resources文件夾下
static:保存所有的靜態(tài)資源,如:js狭握、css闪金、images
templates:保存所有的模板界面
application.properties:Spring Boot的應用配置文件馬可以修改一些默認設置
3.2 POM文件
3.2.1 父項目
pom.xml文件開頭引入父項目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
按住Ctrl點擊spring-boot-starter-parent,可以看到這個父項目還依賴一個父項目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
再點擊spring-boot-dependencies,可以看到定義了許多依賴的版本哎垦,他來管理Spring Boot里的所有依賴版本囱嫩,以后我們導入依賴默認是不需要導入版本的(沒有在dependencies里面的依賴自然需要聲明版本號)
<properties>
<activemq.version>5.15.11</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.77</appengine-sdk.version>
<artemis.version>2.10.1</artemis.version>
<aspectj.version>1.9.5</aspectj.version>
<assertj.version>3.13.2</assertj.version>
<atomikos.version>4.0.6</atomikos.version>
<awaitility.version>4.0.1</awaitility.version>
<bitronix.version>2.1.4</bitronix.version>
<build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
<byte-buddy.version>1.10.4</byte-buddy.version>
......
3.2.2 導入的依賴
JAR包是有誰導入的,我們繼續(xù)看pom.xml可以看到
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
可以看到spring-boot-starter-web與父項目的spring-boot-starter-parent有一個共有的spring-boot-starter
spring-boot-starter是Spring Boot場景啟動器
點擊spring-boot-starter-web可以看到它也有一些依賴導入
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.2.RELEASE</version>
<scope>compile</scope><!-- 依賴spring-boot-starter基礎項目 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.2.2.RELEASE</version><!-- 依賴json -->
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.2.2.RELEASE</version><!-- 依賴tomcat -->
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.2.2.RELEASE</version><!-- 依賴數(shù)據(jù)校驗 -->
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-embed-el</artifactId>
<groupId>org.apache.tomcat.embed</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
幫我們導入了web模塊正常運行所依賴的組件
Spring Boot將所有的場景功能都抽取出來漏设,做成一個個starters(啟動器)墨闲,只需要在項目里引入這些starter,相關場景的所有依賴都會導入進來愿题。
3.3 主程序類
3.3.1 注解
@SpringBootApplication()
public class HelloWorldMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldMainApplication.class, args);
}
}
- @SpringBootApplication()
Spring Boot標注在某個類上說明這個類是Spring Boot的主配置類损俭,Spring Boot就應該運行這個類的main方法來啟動Spring Boot應用
我們點擊它來查看怀喉,發(fā)現(xiàn)它是一個組合注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
- @SpringBootConfiguration
Spring Boot配置咆繁,它標注在某個類上表示這個一個Spring Boot配置類
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
點擊@SpringBootConfiguration,可以看到@Configuration疗我,這就是Spring最底層的一個注解仔夺,配置類上來標注這個注解琐脏。配置類------配置文件,配置類也是一個組件@Component缸兔。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
- @EnableAutoConfiguration
還可以看到一個@EnableAutoConfiguration日裙,作用是開啟自動配置功能,Spring Boot幫我們自動配置惰蜜,我們可以點開查看
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage自動配置包
點開來看
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
@Import({Registrar.class})昂拂,@import:Spring的底層注解,給容器中導入一個組件抛猖,點擊Registrar.class格侯,查看這個類
可以看到下面這個方法
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
我們在AutoConfigurationPackages.register這一行加一個斷點,并debug運行财著,可以發(fā)現(xiàn)metadata是我們注解的原信息@SpringBootApplication()联四,我們還可以拉動鼠標選中
(new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()
點擊右鍵選擇Evaluate Expression,點擊Evaluate按鈕撑教,可以看到result就等于我們的包名
所以@AutoConfigurationPackage就是將主配置類@SpringBootApplication()標注的類所在包及下面所有子包里面的所有組件掃描到容器中
@EnableAutoConfiguration里還有一個注解
@Import({AutoConfigurationImportSelector.class})朝墩,點進去查看
public String[] selectImports(AnnotationMetadata annotationMetadata) {
發(fā)現(xiàn)selectImports將所有需要導入的組件全類名的方式返回,這些組件就會被添加到容器中伟姐,我們通過debug可以發(fā)現(xiàn)導入的組件中有很多的自動配置類收苏,就是給容器導入場景所需要的組件并配置好
結(jié)束
更多文章請關注后續(xù)