SpringBoot源码部分阅读总结

关于启动类注解@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 类出现!


Java的SPI机制

SPI全称为 Service Provider Interface,是jdk内置的一种服务提供发现机制。简单来说,它就是一种动态替换发现的机制。


SpringWebMvc 的自动配置

@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{
     
...
}

Web应用类型判定

SpringBoot 会根据classpath下存在的类,决定当前应用的类型,以此来创建合适的IOC容器。默认WebMvc环境下,创建的IOC容器是AnnotationConfigServletWebServerApplicationContext


Spring的SPI技术

SpringBoot 使用 SpringFactoriesLoader.loadFactoryNames 机制来从 META-INF/spring.factories 文件中读取指定 类/注解 映射的组件全限定类名,以此来反射创建组件。Spring设计的SPI比Java原生的SPI要更灵活,因为它的key可以任意定义类/注解,不再局限于“接口-实现类”的形式。


SpringApplicationRunListener

SpringApplicationRunListener 可以监听 SpringApplication 的运行方法。通过注册 SpringApplicationRunListener ,可以自定义的在 SpringBoot 应用启动过程、运行、销毁时监听对应的事件,来执行自定义逻辑。


Environment

Spring应用的IOC容器需要依赖 Environment - 运行环境,它用来表示整个Spring应用运行时的环境,它分为 profilesproperties 两个部分。通过配置不同的 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的核心后置处理器

启用AOP,标注 @EnableAspectJAutoProxy 后会向IOC容器中导入一个 AnnotationAwareAspectJAutoProxyCreator ,它是一个 SmartInstantiationAwareBeanPostProcessor ,可以做组件的 创建前后、初始化前后的后置处理工作 。


你可能感兴趣的:(SpringBoot)