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