SpringBoot源码阅读2-自动配置
在传统的Spring应用中,开发者需要手动配置一系列Web应用的核心组件,例如DispatcherServlet
用于处理请求分发、ViewResolver
用于视图解析、CharacterEncodingFilter
用于字符编码过滤等。
然而在SpringBoot
中只要引入了spring-boot-starter-web
时,SpringBoot
会根据约定和条件自动配置这些组件。例如,它会自动注册DispatcherServlet、配置默认的ViewResolver,并添加适当的字符编码过滤器,使得Web应用能够正常工作。
那么问题来了
问题1:SpringBoot是如何进行自动配置的?会进行那些组件的自动配置?
SpringBoot应用程序的入口是主程序,即标注了@SpringBootApplication
注解的类就是主程序类,因此一切都要从@SpringBootApplication
注解开始。
源码分析:
1、@SpringBootApplication注解
@Target(ElementType.TYPE) // 适用范围 -> TYPE表示可以使用在 类 | 接口 | 注解 | 枚举 中
@Retention(RetentionPolicy.RUNTIME) // 生命周期 -> RUNTIME表示运行时
@Documented // 可以记录在javadoc中
@Inherited // 可以被子类继承该注解
// ---------------------- 核心是下面三个注解
@SpringBootConfiguration // 标注该类为配置类
@EnableAutoConfiguration // 启动自动配置功能
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) // 注解扫描
public @interface SpringBootApplication {...
}
2、@SpringBootConfiguration注解
组合了@Configuration注解,标注当前类是主配置类,我们在主程序类中声明的bean、或者是@RestController起作用,
也是这个注解的功劳。
例如下图在主程序中为什么这几个注解可以生效也是注解@SpringBootConfiguration
的功劳。
3、@EnableAutoConfiguration注解
启动自动配置功能核心注解,Spring中有很多以@Enable开头的注解,其作用就是借助@Import来收集并注册特定场景相关的bean,并加载到spring容器中。而 @EnableAutoConfiguration 就是借助 @Import 来收集所有符合自动配置条件的bean定义,并加载到Spring容器。