02_SpringBoot入門(mén)
1、簡(jiǎn)介
簡(jiǎn)化Spring應(yīng)用開(kāi)發(fā)的一個(gè)框架。
整個(gè)Spring技術(shù)棧的一個(gè)大整合。
J2EE開(kāi)發(fā)的一站式解決方案。
- SpringBoot來(lái)簡(jiǎn)化Spring應(yīng)用開(kāi)發(fā),約定大于配置,去繁從簡(jiǎn),just run就能創(chuàng)建一個(gè)獨(dú)立的,產(chǎn)品級(jí)別的應(yīng)用。
- 優(yōu)點(diǎn):
- 快速創(chuàng)建獨(dú)立運(yùn)行的Spring項(xiàng)目以及與主流框架的集成。
- 使用嵌入的Servlet容器,應(yīng)用無(wú)需打成jar包。
- starters自動(dòng)依賴(lài)與版本控制。
- 大量的自動(dòng)配置,簡(jiǎn)化開(kāi)發(fā),也可以修改默認(rèn)值。
- 無(wú)序配置xml文件,無(wú)代碼生成,開(kāi)箱即用。
- 準(zhǔn)生產(chǎn)環(huán)境的運(yùn)行時(shí)應(yīng)用監(jiān)控。
- 與云計(jì)算的天然集成。
- 缺點(diǎn):
- 入門(mén)容易,精通難。
- 需要掌握spring技術(shù)。
2、微服務(wù)
2014年,martin fowler在博客中提出。
微服務(wù)是一種架構(gòu)風(fēng)格
一個(gè)應(yīng)用應(yīng)該是一組小型服務(wù)??梢酝ㄟ^(guò)HTTP的方式進(jìn)行互通。
單體應(yīng)用:
一個(gè)單體應(yīng)用程序把他所有的功能放在一個(gè)單一進(jìn)程中。。。并且通過(guò)在多個(gè)服務(wù)器上復(fù)制這個(gè)單體進(jìn)行擴(kuò)展
微服務(wù):
一個(gè)微服務(wù)架構(gòu)把每個(gè)功能元素放進(jìn)一個(gè)獨(dú)立的服務(wù)中。。。并且通過(guò)跨服務(wù)器分發(fā)這些服務(wù)進(jìn)行擴(kuò)展,只在需要時(shí)才復(fù)制。
每一個(gè)功能元素最終都是一個(gè)可獨(dú)立替換和獨(dú)立升級(jí)的軟件單元。
詳細(xì)參照微服務(wù)提出者的網(wǎng)站。
3、環(huán)境準(zhǔn)備
掌握以下內(nèi)容:
- Spring框架的使用經(jīng)驗(yàn)
- 熟練使用Maven進(jìn)行項(xiàng)目構(gòu)建和管理依賴(lài)
- 熟練使用Eclipse或者IDEA
環(huán)境約束:
- JDK1.8
- maven3.X
- IDEA 2017
- Spring Boot 1.5.9RELEASE
4、SpringBoot HelloWorld
創(chuàng)建Maven工程(jar的形式)
-
導(dǎo)入springboot相關(guān)依賴(lài)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.springframework</groupId> <artifactId>gs-spring-boot</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <properties> <java.version>1.8</java.version> </properties> <!--可以將應(yīng)用打包成可執(zhí)行的jar包--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
編寫(xiě)一個(gè)主程序
@SpringBootApplication // 標(biāo)注主程序類(lèi),說(shuō)明是一個(gè)SpringBoot應(yīng)用 public class Application { public static void main(String[] args) { // 啟動(dòng)Spring應(yīng)用 SpringApplication.run(Application.class,args); } }
-
編寫(xiě)相關(guān)的Controller、Service等。
這里只給出Controller。Service返回一個(gè)字符串即可。
@Controller public class HelloController { @Autowired private HelloService service; @RequestMapping("/hello") @ResponseBody public String hello(){ return service.sayhello(); } }
-
運(yùn)行:
只需要運(yùn)行主類(lèi)(Application)即可。
-
簡(jiǎn)化部署工作
只需要打Jar包,然后用java -jar 指定jar包,即可訪(fǎng)問(wèn)項(xiàng)目。
5、原理分析
-
pom文件
-
父項(xiàng)目
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent>
這個(gè)父項(xiàng)目還依賴(lài)了一個(gè)父項(xiàng)目:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.4.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>
這個(gè)父項(xiàng)目真正管理SpringBoot應(yīng)用里面所有的依賴(lài)版本。
SpringBoot的版本仲裁中心;
以后我們導(dǎo)入依賴(lài)默認(rèn)是不需要寫(xiě)版本的;
(沒(méi)有在dependencies里面管理的依賴(lài)自然需要聲明版本號(hào))
-
啟動(dòng)器
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
spring-boot-starter-web:spring-boot場(chǎng)景啟動(dòng)器;幫我們導(dǎo)入了web模塊正常運(yùn)行所依賴(lài)的組件。
通過(guò)導(dǎo)入各種starter(啟動(dòng)器)來(lái)適應(yīng)所有功能場(chǎng)景。
-
-
主程序類(lèi)、主入口類(lèi)
@SpringBootApplication // 標(biāo)注主程序類(lèi),說(shuō)明是一個(gè)SpringBoot應(yīng)用 public class Application { public static void main(String[] args) { // 啟動(dòng)Spring應(yīng)用 SpringApplication.run(Application.class,args); } }
@SpringBootApplication : 標(biāo)注在某個(gè)類(lèi)上說(shuō)明這個(gè)類(lèi)是SpringBoot的主配置類(lèi),SpringBoot就應(yīng)該運(yùn)行這個(gè)類(lèi)的main方法來(lái)啟動(dòng)SpringBoot應(yīng)用。
@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:SpringBoot的配置類(lèi);標(biāo)注在某個(gè)類(lèi)上,表示這是個(gè)SpringBoot的配置類(lèi);
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration {
點(diǎn)進(jìn)去@SpringBootConfiguration發(fā)現(xiàn),@SpringBootConfiguration上面有個(gè)@Configuration注解,配置類(lèi)上使用的注解,配置類(lèi)--->配置文件;
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration {
再點(diǎn)擊@Configuration進(jìn)去發(fā)現(xiàn),他有一個(gè)@Component注解,配置類(lèi)也是容器中的一個(gè)組件;
再看第二個(gè)注解:@EnableAutoConfiguration:開(kāi)啟自動(dòng)配置功能;以前需要我們自己去配置的東西,SpringBoot幫我們自動(dòng)配置;這個(gè)注解告訴SpringBoot開(kāi)啟自動(dòng)配置,只有寫(xiě)了這個(gè)注解,自動(dòng)配置才會(huì)生效。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
點(diǎn)進(jìn)去里面
@AutoConfigurationPackage:自動(dòng)配置包,點(diǎn)進(jìn)去發(fā)現(xiàn)有個(gè)@Import(AutoConfigurationPackages.Registrar.class):Spring底層注解@Import,給容器中導(dǎo)入一個(gè)組件AutoConfigurationPackages.Registrar.class
@AutoConfigurationPackage這個(gè)注解的作用是將主配置類(lèi)(@SpringBootApplication標(biāo)注的類(lèi))的所在的包及下面的所有子包下所有的組件掃描到Spring容器。
而這個(gè)注解下還有一個(gè)@Import(AutoConfigurationImportSelector.class)注解,導(dǎo)入哪些組件的選擇器,會(huì)將所有需要導(dǎo)入的組件以全限定名的方式返回,這些組件就會(huì)被掃描進(jìn)Spring容器。最終會(huì)給容器導(dǎo)入非常多的自動(dòng)配置類(lèi)(XxxAutoConfiguration),作用是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件,并配置好這些組件。
SpringFactoryLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader):SpringBoot在啟動(dòng)的時(shí)候,會(huì)從從類(lèi)路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類(lèi)導(dǎo)入到容器中,自動(dòng)配置類(lèi)就會(huì)生效,幫我們進(jìn)行自動(dòng)配置工作。以前我們需要自己配置的東西,自動(dòng)配置類(lèi)都幫我們做了。
J2EE的整體解決方案和自動(dòng)配置都在spring-boot-autoconfigure-1.5.9RELEASE.jar中;
6、使用Spring Initializer快速創(chuàng)建SpringBoot項(xiàng)目
RESTAPI的方式:可以在類(lèi)上打@Controller以及@ResponseBody,但是可以用@RestController來(lái)替換;
默認(rèn)生成的SpringBoot項(xiàng)目有幾個(gè)特點(diǎn):
- 主程序已經(jīng)生成好了,我們只需要編寫(xiě)我們自己的邏輯
- resources文件夾目錄結(jié)構(gòu):
- static:保存所有的靜態(tài)資源:js css images;
- templates:保存所有的模板頁(yè)面:(SpringBoot默認(rèn)jar包使用嵌入式的Tomcat,默認(rèn)不支持JSP頁(yè)面),可以使用模板引擎(freemarker、thymeleaf);
- application.properties:SpringBoot應(yīng)用的配置文件 -> 可以用來(lái)修改默認(rèn)配置信息。