@SpringBootApplication
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...}
@SpringBootApplication
是组合注解,包含 @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
。@ComponentScan
默认扫描当前配置类所在包及子包下的所有组件, exclude
属性会将主启动类、自动配置类屏蔽掉。@Configuration
可标注配置类,@SpringBootConfiguration
并没有对其做实质性扩展,二者功能相似。@EnableAutoConfiguration
自动载入应用程序所需的所有Bean,自动装配
也是SpringBoot框架的核心。@EnableAutoConfiguration
注解该注解源码如下
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
由注解@AutoConfigurationPackage
和@Import(AutoConfigurationImportSelector.class)
组成。
其中@AutoConfigurationPackage
的作用是主要是获取需要扫描的basePackage
(根包),@SpringBootApplication
标注的主启动类所在包会被视为扫描包的根包。
@Import(AutoConfigurationImportSelector.class)
注解中,所引入的类AutoConfigurationImportSelector
其核心方法是selectImports()
。其作用是配合 SpringFactoriesLoader 可加载 “META-INF/spring.factories” 中配置的 @EnableAutoConfiguration 对应的自动配置类
。
所有配置的 @EnableAutoConfiguration
的自动配置类,都以 AutoConfiguration
结尾!由此规律,以后我们要了解一个 SpringBoot 的模块或者第三方集成的模块时,就可以大胆猜测基本上一定会有 XXXAutoConfiguration
类出现!
SPI全称为 Service Provider Interface
,是jdk内置的一种服务提供发现机制。简单来说,它就是一种动态替换发现的机制。
@Configuration
//当前环境必须是WebMvc(Servlet)环境
@ConditionalOnWebApplication(type = Type.SERVLET)
//当前运行环境的classpath中必须有Servlet类,DispatcherServlet类,WebMvcConfigurer类
@ConditionalOnClass({
Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//如果没有自定义WebMvc的配置类,则使用本自动配置
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({
DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration{
...
}
SpringBoot 会根据classpath下存在的类,决定当前应用的类型,以此来创建合适的IOC容器。默认WebMvc环境下,创建的IOC容器是AnnotationConfigServletWebServerApplicationContext
。
SpringBoot 使用 SpringFactoriesLoader.loadFactoryNames
机制来从 META-INF/spring.factories
文件中读取指定 类/注解
映射的组件全限定类名,以此来反射创建组件
。Spring设计的SPI比Java原生的SPI要更灵活,因为它的key可以任意定义类/注解,不再局限于“接口-实现类”
的形式。
SpringApplicationRunListener
可以监听 SpringApplication
的运行方法。通过注册 SpringApplicationRunListener
,可以自定义的在 SpringBoot 应用启动过程、运行、销毁时监听对应的事件,来执行自定义逻辑。
Spring应用的IOC容器需要依赖 Environment
- 运行环境
,它用来表示整个Spring应用运行时的环境,它分为 profiles
和 properties
两个部分。通过配置不同的 profile
,可以支持配置的灵活切换,并且可以同时配置一到多个 profile
来共同配置 Environment
。
@EnableAspectJAutoProxy
源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
boolean proxyTargetClass() default false;
boolean exposeProxy() default false;
}
@EnableAspectJAutoProxy
的根本作用是在IOC容器中注册了一个 AnnotationAwareAspectJAutoProxyCreator
(为AspectJAwareAdvisorAutoProxyCreator
子类,用于处理当前应用程序上下文中的所有 @AspectJ
注解的切面,以及Spring的Advisor
。)。
启用AOP,标注 @EnableAspectJAutoProxy
后会向IOC容器中导入一个 AnnotationAwareAspectJAutoProxyCreator
,它是一个 SmartInstantiationAwareBeanPostProcessor
,可以做组件的 创建前后、初始化前后
的后置处理工作 。