上面我们讲Springboot自动装配,大大的提高了springboot的搭建效率,这一节我们就整体的梳理一下SpringBoot的自动装装配原理。
上面一节我们讲了SpringApplication的构造方法,在构造方法中,我们提到了
- 扫描jar包中的spring.factories文件中的ApplicationContextInitializer和ApplicationListener的对象。作用是在应用启动和监听声明周期事件时的回调,这一部分的内容帮助我们集成外部化配置,修改应用行为有比较好的效果。
- 还有一种特别的对象,被注解@EnableAutoConfiguration的实现类,这些是自动化装配的入口类。
之前的文章我们也讲过,注解相当于字节码注释,在编辑期间/运行期间让虚拟机观察到注释文件,首先我们看一下
@EnableAutoConfiguration的内容
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class<?>[] exclude() default {};
/**
* Exclude specific auto-configuration class names such that they will never be
* applied.
* @return the class names to exclude
* @since 1.3.0
*/
String[] excludeName() default {};
}
在@EnableAutoConfiguration中,我们用到了注解@Import
在spring的注解章节,我们讲解了这个注解,是引入beanDefinition的开关。我们可以看到@Import引入了
AutoConfigurationImportSelector.class类
AutoConfigurationImportSelector类的主要方法
根据spring的启动周期,在refresh()的时候,会invokeBeanFactoryPostProcessors,调用了一个ConfigurationClassPostProcessor
这个类会处理被@Configuration标注的类,然后会处理@Import注解,
然后调用上面的方法,返回了beanDefinition的name;
返回的configurations是从spring.factories文件中定义的AutoConfiguration
然后删除重复,删除exclude的之后,返回bean的类名,在context的接下来的环节中
有finishBeanFactoryInitialization方法,会实例化所有非延迟的bean。
这个时候会创建上面的***AutoConfiguration的实力,实现了加载。
我们看一个比较特殊的WebMvcAutoConfiguration。
他比较特殊的地方在于,只有在Servlet环境中才会有
WebMvcAutoConfiguration这个类被加载到上下文,上面的几节我们讲到,SpringApplication类会自适应,选择创建一个ServletWebServerApplicationContext类,
该类也是继承了AbstractApplicationContext类,有refresh()方法,《spring设计思想》部分,我们专门讲过一个方法,AbstractApplicationContext留给子类扩展的方法,onRefresh()
ServletWebServerApplicationContext中的实现方法是
创建一个WebServer这个时候就是启动内置Servlet容器及WebMvc自动装配的过程
内置的Servlet容器是Tomcat,tomcat分为连接器和容器两个部分,容器这个部分从外到内一层层嵌套:
容器从外到内启动,然后会调用WebMvcAutoConfiguration的自动装配。
Mvc的内容就是这么加载的。
上面的WebMvcAutoConfiguration的自动装配就是SpringBoot中AutoConfiguration的工作原理,其他的自动装配可以举一反三。