[SpringBoot] - 一份筆記
一. Spring Boot 入門
1. Spring Boot 簡介
簡化Spring應用開發的一個框架;
整個Spring技術棧的一個大整合;
J2EE開發的一站式解決方案;
2. 微服務
2014, martin fowler 提出
微服務 : 架構風格(服務微化)
一個應用應該是一組小型服務;可以通過HTTP的方式進行互通;
單體應用: ALL IN ONE , 比如之前的教育項目,整個打包後在一個war或者jar中.
微服務: 每一個功能元素最終都是一個可獨立替換和獨立升級的軟件單元;
簡而言之,微服務架構風格是一種將單個應用程序開發為一套小型服務的方法,
每個小型服務都在自己的流程中運行,並於輕量級機制(通常是HTTP資源API)進行通信.
這些服務圍繞業務功能構建,可通過全自動部署機制獨立部署. 這些服務至少集中管理,
可以用不同的編程語言編寫, 並使用不同的數據存儲技術.
這種單體應用對系統的任何更改都涉及構建和部署新版本的服務器端應用程序.
以上單體應用的弊端導致了微服務架構風格的誕生: 將應用程序構建為服務套件,
除了服務可獨立部署和擴展外,每個服務還提供了一個牢固的模塊邊界,
甚至允許以不同的編程語言編寫不同的服務.
我們並不認為微服務風格是新穎的或創新的,其根源至少可以歸結為Unix的設計原則.
更多:https://martinfowler.com/articles/microservices.html#
MAVEN設置:
maven的settings.xml配置文件的profiles標簽:
<profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile>
簡化部署:
<!-- 這個插件,可以將應用打包成一個可執行的jar包;--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
主程序類,主入口類
/** * @SpringBootApplication 來標註一個主程序類,說明這是一個Spring Boot應用 */ @SpringBootApplication public class HelloWorldMainApplication { public static void main(String[] args) { // Spring應用啟動起來 SpringApplication.run(HelloWorldMainApplication.class,args); } }
@SpringBootApplication :
Spring Boot應用標註在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用.
@SpringBootApplication是一個組合註解,是一個"三體"結構,實際上它是一個復合的Annotation.
三體結構指得是:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
使用以上三個註解也能使用@SpringBootApplication,同樣效果,只不過還是使用@SpringBootApplication更加簡潔.
查看該註解源碼:其後參照JSR303的一些註解使用.參照之前的自定義註解: https://www.cnblogs.com/ukzq/p/9947870.html
其中都存在的三個註解是:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
>>>首先看Retention註解:
Retention(保留)註解,這種類型的註解會被保留到哪個階段?
1. RetentionPolicy.SOURCE -- 這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略.
2. RetentionPolicy.CLASS -- 這種類型的Annotations編譯時被保留,在class文件中存在,但JVM會忽略.
3. RetentionPolicy.RUNTIME -- 這種類型的Annotations將被JVM保留,所以他們能在運行時被JVM或其它使用反射機制的代碼所讀取和使用.
可以看到在@SpringBootApplication源碼中,註解的保留級別為:
@Retention(RetentionPolicy.RUNTIME)
即說明該註解會被JVM保留,在運行時被JVM或其它使用反射機制的代碼所讀取和使用.
>>>再來看Documented註解:
Documented註解表明這個註解應該被javadoc工具記錄,默認情況下,javadoc是不包括註解的,
但如果聲明註解時指定了@Documented, 則它會被javadoc之類的工具處理,所以註解類型信息
也會被包括在生成的文檔中.
>>>Target註解
@Target說明了Annotation所修飾的對象範圍: Annotation可被用於packages, types(類,接口,枚舉,Annotation類型_
類型成員(方法,構造方法,成員變量,枚舉值), 方法參數和本地變量(如循環變量,catch參數). 在Annotation類型的聲明中
使用了target可更加明晰其修飾的目標.
作用: 用於描述註解的使用範圍(即: 被描述的註解可以在什麽地方使用)
@Target的取值(ElementType)有:
1. CONSTRUCTOR : 用於描述構造器
2. FIELD : 用於描述域
3. LOCAL_VARIABLE : 用於描述局部變量
4. METHOD : 用於描述方法
5. PACKAGE : 用於描述包
6. PARAMETER : 用於描述參數
7. TYPE : 用於描述類, 接口(包括註解類型) 或enum聲明.
可以看到在@SpringBootApplication的註解中Target為@Target(ElementType.TYPE),說明這是描述類和接口的.
>>>補充 Inherited 註解
這是一個稍微復雜的註解類型,它指明被註解的類會自動繼承, 更具體地說, 如果定義註解時使用了@Inherited標記,
然後用定義的註解來標註另一個父類,父類又有一個子類(subclass),則父類的所有屬性將被繼承到它的子類中.
@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的配置類,
標註在某個類上,表示這是一個SpringBoot的配置類,
在@SpringBootConfiguration中源碼沒有什麽卵
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
最主要的是它的@Configuration註解.
@Configuration:配置類上來標註這個註解.
配置類---配置文件;配置類也是容器中的一個組件; 類似@Component可以將組件加載到ioc容器.
>>>再看@EnableAutoConfiguration註解, 字面量翻譯過來就說明:這個註解是用來開啟自動配置功能.
以前我們需要配置的東西,SpringBoot幫我們自動配置,@EnableAutoConfiguration告訴SpringBoot
開啟自動配置功能,這樣自動配置才能生效.
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {
在其中的@AutoConfigurationPackage註解為自動配置包註解.
@Import(AutoConfigurationImportSelector.class)是Spring的底層註解@Import,
作用是給容器導入一個組件; 導入的組件由AutoConfigurationPackages.Registrar.class
將主配置類(@SpringBootApplication標註的類)的所在包及下面所有子包裏面的所有組件掃描到
Spring容器;
[SpringBoot] - 一份筆記