一、自动配置原理。
遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器。当程序引入spring-boot-starter-web起步依赖,启动后,会自动往ioc容器中注入DispatcherServlet,可以使用简单的程序进行验证,我们修改启动类程序,添加以下代码运行验证是否是此原理:
@SpringBootApplication
public class Maven_Application
{
public static void main( String[] args )
{
ApplicationContext context = SpringApplication.run(Maven_Application.class, args);
System.out.println(context.getBean("dispatcherServlet"));
}
}
在pom.xml文件内存在web的起步依赖:
运行启动类,查看控制台:
发现运行无误,结果与预期保持一致,说明当程序引入spring-boot-starter-web起步依赖,启动后,会自动往ioc容器中注入DispatcherServlet对象。
二、详解。
启动类,实际上也是一个配置类,@SpringBootApplication注解实际也是一个组合注解:
@EnableAutoConfiguration开启自动配置,其又组合了注解@Import,导入了AutoConfigurationImportSelector类,这个类为ImportSelector接口的实现类,内部重写了selectImports方法,在此方法内部,通过层级调用,读取底层的配置文件:
读取的配置文件org.springframework.boot.autoconfigure.AutoConfiguration.imports:
在此配置文件内存在一些内部的全类名信息,均为自动配置类,其中存在一个类:
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
其功能是完成DispatcherServletAutoConfiguration Bean对象的自动注入,并且其提供的注解标识当前类为自动配置类,@ConditionalOnClass({DispatcherServlet.class})设置了Bean注册的条件,若存在DispatcherServlet类则生效,否则自动配置类不生效。
若想让DispatcherServlet类存在,就需要引入Web的起步依赖即可,这就与我们最上面提到的"当程序引入spring-boot-starter-web起步依赖,启动后,会自动往ioc容器中注入DispatcherServlet"保持一致。
此过程最重要的核心存在于org.springframework.boot.autoconfigure.AutoConfiguration.imports配置文件。
在Spring Boot2,7版本以前使用的配置文件为spring.factories,2.7到3.0时期二者都兼容,3.0后则完全使用了org.springframework.boot.autoconfigure.AutoConfiguration.imports配置文件。
在Bean管理中的案例也可以使用此方式进行自动配置,就不需要手动注册,会进行自动配置。