《springboot设计思想》5-AutoConfiguration点石成金

上面我们讲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的工作原理,其他的自动装配可以举一反三。

猜你喜欢

转载自blog.csdn.net/David_lou/article/details/108520562