首先Spring Boot項目中都會如下啓動類:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
從上面代碼可以看出,註解@SpringBootApplication和SpringApplication.run()方法是最爲重要的部分。這裏主要來看看@SpringBootApplication註解部分。
//Java原註解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//SpringBoot註解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}
雖然定義使用了多個Annotation進行了原信息標註,但實際上重要的只有三個Annotation:
@Configuration(@SpringBootConfiguration點開查看發現裏面還是應用了@Configuration)
@EnableAutoConfiguration
@ComponentScan
如果在啓動類使用這個三個註解,整個SpringBoot應用依然可以與之前的啓動類功能一樣。但每次寫這3個比較囉嗦,所以寫一個@SpringBootApplication方便點。
這三個註解中@Configuration和@ComponentScan對我們來說並不陌生,來看一下@EnableAutoConfiguration註解源碼:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
其中最關鍵的要屬@Import(AutoConfigurationImportSelector.class),藉助AutoConfigurationImportSelector.class,@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IoC容器。
藉助於Spring框架原有的一個工具類:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自動配置功效才得以大功告成!
在AutoConfigurationImportSelector類中可以看到通過 SpringFactoriesLoader.loadFactoryNames()把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一個xxxAutoConfiguration文件都加載到容器中,spring.factories文件裏每一個xxxAutoConfiguration文件一般都會有下面的條件註解,這裏解釋一下:
@ConditionalOnClass : classpath中存在該類時起效
@ConditionalOnMissingClass : classpath中不存在該類時起效
@ConditionalOnBean : DI容器中存在該類型Bean時起效
@ConditionalOnMissingBean : DI容器中不存在該類型Bean時起效
@ConditionalOnSingleCandidate : DI容器中該類型Bean只有一個或@Primary的只有一個時起效
@ConditionalOnExpression : SpEL表達式結果爲true時
@ConditionalOnProperty : 參數設置或者值一致時起效
@ConditionalOnResource : 指定的文件存在時起效
@ConditionalOnJndi : 指定的JNDI存在時起效
@ConditionalOnJava : 指定的Java版本存在時起效
@ConditionalOnWebApplication : Web應用環境下起效
@ConditionalOnNotWebApplication : 非Web應用環境下起效
SpringBoot彙總:(陸續添加)
1.@SpringBootApplication
是SpringBoot的啓動類註解,SpringBoot項目的啓動入口main()方法所在的類必須使用此註解標註。用於Spring主類上最核心的註解,自動化配置文件,表示這是一個SpringBoot項目,用於開啓SpringBoot的各項能力。
相當於@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個註解的組合。
2.@EnableAutoConfiguration
開啓這個註解之後,允許SpringBoot自動配置,嘗試根據你添加的jar包依賴自動配置你的Spring應用。它是@AutoConfigurationPackage和Import(AutoConfigurationImportSelector.class)註解的組合。
例如:當前路徑下有MyBatis這個Jar包,MyBatisAutoConfiguration 註解就能根據相關參數來配置Mybatis的各個Spring Bean。
3.@AutoConfigurationPackage
AutoConfigurationPackage註解的作用是將添加該註解的類所在的package 作爲自動配置的package進行管理。即可以通過 AutoConfigurationPackage 註解的工具類獲取自動配置package列表。當通過註解@SpringBootApplication標註啓動類時,已經爲啓動類添加了@AutoConfigurationPackage註解。路徑爲 @SpringBootApplication -> @EnableAutoConfiguration -> @AutoConfigurationPackage。也就是說當SpringBoot應用啓動時默認會將啓動類所在的包(package)作爲自動配置的包(package)。
4.@Configuration
Spring 3.0添加的一個註解,用來代替applicationContext.xml配置文件,所有這個配置文件裏面能做到的事情都可以通過這個註解所在的類來進行註冊。即通過對bean對象的操作代替spring中xml文件。
5.@SpringBootConfiguration
@SpringBootConfiguration註解是@Configuration註解的派生註解,和@Configuration註解的功能一致,標註這個類是一個配置類。只不過@SpringBootConfiguration註解是SpringBoot的註解,@Configuration註解是Spring的註解。
6.@Import
Spring 3.0添加註解,用來導入一個或者多個@Configuration註解修飾的配置類。
直接導入普通類;
導入實現了ImportSelector接口的類;
導入實現了ImportBeanDefinitionRegister接口的類;
7.@ComponentScan
Spring 3.1添加的一個註解,用來代替配置文件中的component-scan配置,開啓組件掃描,可自動發現和配置一些bean(自動掃描包路徑下的@Component註解進行註冊的bean實例)。
8.@Conditional
Spring 4.0添加的一個註解,用來標識一個Spring Bean或者Configuration配置文件,當滿足指定條件纔開啓配置。
9.@ConditionalOnBean
組合@Conditional註解,當容器中有指定Bean纔開啓配置。
10.@ConditionalOnMissingBean
組合@Conditional註解,當容器中沒有值當Bean纔可開啓配置。
11.@ConditionalOnClass
組合@Conditional註解,當容器中有指定Class纔可開啓配置。
10.@ConditionalOnMissingClass
組合@Conditional註解,當容器中沒有指定Class纔可開啓配置。
12.@ConditionOnWebApplication
組合@Conditional註解,當前項目類型是WEB項目纔可開啓配置。
項目有以下三種類型:
① ANY:任意一個Web項目
② SERVLET: Servlet的Web項目
③ REACTIVE :基於reactive-base的Web項目
13.@ConditionalOnProperty
組合@Conditional註解,當指定的屬性有指定的值時纔可開啓配置。
14.@ConditionalOnExpression
組合@Conditional註解,當SpEl表達式爲true時纔可開啓配置。
15.@ConditionOnJava
組合@Conditional註解,當運行的Java JVM在指定的版本範圍時纔開啓配置。
16.@ConditionalResource
組合@Conditional註解,當類路徑下有指定的資源纔開啓配置。
17.@ConditionOnJndi
組合@Conditional註解,當指定的JNDI存在時纔開啓配置。
18.@ConditionalOnCloudPlatform
組合@Conditional註解,當指定的雲平臺激活時纔可開啓配置。
19.@ConditiomalOnSingleCandidate
組合@Conditional註解,當制定的Class在容器中只有一個Bean,或者同時有多個但爲首選時纔開啓配置。
20.@ConfigurationProperties
用來加載額外的配置(如.properties文件),可用在@Configuration註解類或者@Bean註解方法上面。可看一看Spring Boot讀取配置文件的幾種方式。
21.@EnableConfigurationProperties
一般要配合@ConfigurationProperties註解使用,用來開啓@ConfigurationProperties註解配置Bean的支持。
22.@AntoConfigureAfter
用在自動配置類上面,便是該自動配置類需要在另外指定的自動配置類配置完之後。如Mybatis的自動配置類,需要在數據源自動配置類之後。
23.@AutoConfigureBefore
用在自動配置類上面,便是該自動配置類需要在另外指定的自動配置類配置完之前。
24.@IMportReSource
Spring 3.0添加註解,用來導入一個或者多個Spring配置文件,這對Spring Boot兼容老項目非常有用,一位內有些配置文件無法通過java config的形式來配置.
25.@ConditionOnNotWebApplication
組合@Conditional註解,當前項目類型不是WEB項目纔可開啓配置。