1. 啟動任何一個Spring Boot項目,都會用到如下類
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
從上面代碼可以看出,Annotation定義@SpringBootApplication和類定義SpringApplication.run是關鍵所在.
2. @SpringBootApplication
點開@SpringBootApplication我們可以看到,如下信息:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class)) public @interface SpringBootApplication{ ... }
其實最重要的還是上面三個Annotation
3. @Configuration
它就是JavaConfig形式的Spring IOC容器的配置類使用的那個@Configuration.
Spring IOC容器配置類,基於XML配置的方式是這樣的:
<bean id="mockService" class="..MockServiceImpl"> ... </bean>
而基於Javaconfig的配置形式是這樣的:
@Configuration public class MockConfiguration{ @Bean public MockService mockService(){ return new MockServiceImpl(); } }
任何一個標注了@Bean的方法,其返回值將作為一個bean定義注冊到Spring的IoC容器,方法名將默認成該bean定義的id.
4. @ComponentScan
它的功能其實就是自動掃描符合條件的組件(@Component和@Repository等)或者bean自定義,並加載到IOC容器中.
我們可以通過basePackage等屬性來細粒度的定制@ComponentScan自動掃描的范圍,如果不指定,則默認從Spring框架實現會從聲明@ComponentScan所在類的package進行掃描.
所以SpringBoot的啟動類最好是放在root package下,因為默認不指定basePackage.
5. @EnableAutoConfiguration
首先@Enable*的原理都是借助@Import的支持,收集和注冊特定場景相關的Bean定義,比如@EnableScheduling是通過@Import將Spring調度框架相關的bean定義都加在到IOC容器中.
其次,@EnableAutoConfiguration作為一個復合Annotation,其自身定義信息如下:
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IOC容器.
自動配置的幕后英雄:SpringFactoriesLoader:
SpringFactoriesLoader屬於Spring框架私有的一種擴展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置.
public abstract class SpringFactoriesLoader { //... public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) { ... } public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) { .... } }
配合@EnableAutoConfiguration使用的話,它更多是提供一種配置查找的功能支持,即根據@EnableAutoConfiguration的完整類名org.springframework.boot.autoconfigure.EnableAutoConfiguration作為查找的Key,獲取對應的一組@Configuration類.
所以, EnableAutoConfiguration自動配置的魔法騎士就變成了:SpringFactoriesLoader從classpath中搜尋所有的META-INF/spring.factories配置文件,並將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項通過反射(Java Refletion)實例化為對應的標注了@Configuration的JavaConfig形式的IoC容器配置類,然后匯總為一個並加載到IoC容器。