众所周知,如下即可启动一个最简单的Spring应用。查看@SpringBootApplication
注解的源码,发现这个注解上有一个重要的注解@EnableAutoConfiguration
,而这个注解就是SpringBoot实现自动装配的基础
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@EnableAutoConfiguration
EnableAutoConfiguration
注解上通过@Import
引入了两个类,org.springframework.boot.autoconfigure.AutoConfigurationImportSelector
及org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar
。通过@Import
标注的类,会在解析@Import
所在的配置类时,将标注类引入容器解析,并进行注册。
有众多的组件都是通过在配置类上加@EnableAutoConfiguration
注解将组件引入的
备注
-
ImportBeanDefinitionRegistrar
实现了org.springframework.context.annotation.ImportBeanDefinitionRegistrar
及org.springframework.boot.context.annotation.DeterminableImports
-
AutoConfigurationImportSelector
实现了org.springframework.context.annotation.DeferredImportSelector
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { .... } @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage { ...
解析
起始
通过
BeanFactoryPostProcessor
对需要注册的Bean进行解析。即org.springframework.context.support.AbstractApplicationContext#refresh
,在AbstractApplicationContext#invokeBeanFactoryPostProcessors
方法调用时,就开始了对服务配置bean的解析,为对象的生成做准备@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { ... try { ... invokeBeanFactoryPostProcessors(beanFactory); ... } catch (BeansException ex) { ... } finally { ... }
具体解析
调用
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
,通过获取到的BeanFactoryPostProcessor
实现类对各种配置类进行解