02_SpringBoot入門
1阅悍、簡介
簡化Spring應(yīng)用開發(fā)的一個框架附鸽。
整個Spring技術(shù)棧的一個大整合屯断。
J2EE開發(fā)的一站式解決方案文虏。
- SpringBoot來簡化Spring應(yīng)用開發(fā),約定大于配置殖演,去繁從簡氧秘,just run就能創(chuàng)建一個獨立的,產(chǎn)品級別的應(yīng)用趴久。
- 優(yōu)點:
- 快速創(chuàng)建獨立運行的Spring項目以及與主流框架的集成丸相。
- 使用嵌入的Servlet容器,應(yīng)用無需打成jar包彼棍。
- starters自動依賴與版本控制灭忠。
- 大量的自動配置,簡化開發(fā)座硕,也可以修改默認值弛作。
- 無序配置xml文件,無代碼生成华匾,開箱即用映琳。
- 準生產(chǎn)環(huán)境的運行時應(yīng)用監(jiān)控。
- 與云計算的天然集成。
- 缺點:
- 入門容易萨西,精通難有鹿。
- 需要掌握spring技術(shù)。
2原杂、微服務(wù)
2014年印颤,martin fowler在博客中提出。
微服務(wù)是一種架構(gòu)風格
一個應(yīng)用應(yīng)該是一組小型服務(wù)穿肄∧昃郑可以通過HTTP的方式進行互通。
單體應(yīng)用:
一個單體應(yīng)用程序把他所有的功能放在一個單一進程中咸产。矢否。。并且通過在多個服務(wù)器上復制這個單體進行擴展
微服務(wù):
一個微服務(wù)架構(gòu)把每個功能元素放進一個獨立的服務(wù)中脑溢。僵朗。。并且通過跨服務(wù)器分發(fā)這些服務(wù)進行擴展屑彻,只在需要時才復制验庙。
每一個功能元素最終都是一個可獨立替換和獨立升級的軟件單元。
詳細參照微服務(wù)提出者的網(wǎng)站社牲。
3粪薛、環(huán)境準備
掌握以下內(nèi)容:
- Spring框架的使用經(jīng)驗
- 熟練使用Maven進行項目構(gòu)建和管理依賴
- 熟練使用Eclipse或者IDEA
環(huán)境約束:
- JDK1.8
- maven3.X
- IDEA 2017
- Spring Boot 1.5.9RELEASE
4、SpringBoot HelloWorld
創(chuàng)建Maven工程(jar的形式)
-
導入springboot相關(guān)依賴
<?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>
-
編寫一個主程序
@SpringBootApplication // 標注主程序類搏恤,說明是一個SpringBoot應(yīng)用 public class Application { public static void main(String[] args) { // 啟動Spring應(yīng)用 SpringApplication.run(Application.class,args); } }
-
編寫相關(guān)的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應(yīng)用里面所有的依賴版本俏扩。
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(啟動器)來適應(yīng)所有功能場景油坝。
-
-
主程序類嫉戚、主入口類
@SpringBootApplication // 標注主程序類刨裆,說明是一個SpringBoot應(yīng)用 public class Application { public static void main(String[] args) { // 啟動Spring應(yīng)用 SpringApplication.run(Application.class,args); } }
@SpringBootApplication : 標注在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應(yīng)該運行這個類的main方法來啟動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的配置類帆啃;標注在某個類上,表示這是個SpringBoot的配置類窍帝;
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration {
點進去@SpringBootConfiguration發(fā)現(xiàn)努潘,@SpringBootConfiguration上面有個@Configuration注解,配置類上使用的注解坤学,配置類--->配置文件疯坤;
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration {
再點擊@Configuration進去發(fā)現(xiàn),他有一個@Component注解深浮,配置類也是容器中的一個組件压怠;
再看第二個注解:@EnableAutoConfiguration:開啟自動配置功能;以前需要我們自己去配置的東西飞苇,SpringBoot幫我們自動配置菌瘫;這個注解告訴SpringBoot開啟自動配置,只有寫了這個注解布卡,自動配置才會生效雨让。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
點進去里面
@AutoConfigurationPackage:自動配置包,點進去發(fā)現(xiàn)有個@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快速創(chuàng)建SpringBoot項目
RESTAPI的方式:可以在類上打@Controller以及@ResponseBody苗胀,但是可以用@RestController來替換襟诸;
默認生成的SpringBoot項目有幾個特點:
- 主程序已經(jīng)生成好了,我們只需要編寫我們自己的邏輯
- resources文件夾目錄結(jié)構(gòu):
- static:保存所有的靜態(tài)資源:js css images;
- templates:保存所有的模板頁面:(SpringBoot默認jar包使用嵌入式的Tomcat基协,默認不支持JSP頁面)歌亲,可以使用模板引擎(freemarker、thymeleaf)澜驮;
- application.properties:SpringBoot應(yīng)用的配置文件 -> 可以用來修改默認配置信息陷揪。