SpringBoot自动配置原理详解

Springboot的自动配置原理


@SpringbootApplication

@SpringbootApplication
  贴了这个注解的类叫做启动类,一般放在根包,一般Springboot项目只有唯一一个启动类 (配置类)

@ComponentScan

包路径扫描 :默认扫描当前包及其子包

@SpringbootConfiguration

包含了@Configuration ,成为配置类

@EnableAutoConfiguration

包含了@Import(AutoConfigurationImportSelector.class)
    
 AutoConfigurationImportSelector.class
 --->selectImports()
   ----->getAutoConfigurationEntry()
   ---->
        List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
        ----> 
        'META-INF/spring.factories' 
        ------>WebMvcAutoConfiguration
     ------>@AutoConfigureAfter({
      DispatcherServletAutoConfiguration.class,...)
         ---->dispatcherServlet()


Springboot自动原理详解

启动类头顶上贴上@SpringBootApplication注解,可以让我们不需要配置前端控制器,包扫描路径

@SpringBootApplication注解里面有3个核心关键注解
 1.  @SpringBootConfiguration
头上贴了@Configuration --说明了该类是配置类

 2. @ComponentScan :扫描类贴了该注解中所在包及其子包所有贴了版型注解的类,创建对象交给spring容器管理

 3. @EnableAutoConfiguration
  告诉SpringBoot基于我所添加的依赖,去"猜测"我想如何去配置spring

@EnableAutoConfiguration 下的

  • @Import(AutoConfigurationImportSelector.class) :自动配置类选择器,该类可以实现配置类批量载入spring容器 ---->
    里面有个方法 getCandidateConfigurations :委托SpringFactoriesLoader去读取jar包中的 "META-INF/spring.factories"文件,加载里面配置的自动配置对象

SpringBoot自动配置原理详解_第1张图片

SpringBoot帮我们配置前端控制器的来源

1.spring.factories文件中配置很多自动配置类,根据条件加载WebMvc/ DataSource/DispatcherServlet 等

 以springmvc为例:
      在spring.factories 找到  ---> WebMvcAutoConfiguration 
      里面有 1.@Configuration:声明这是一个配置类
          
           2. @ConditionalOnWebApplication(type = Type.SERVLET) :满足项目的类是是Type.SERVLET类型 (WEB服务)
          
          3.@ConditionalOnClass({
      Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) :
           OnClass,判断是否引入SpringMVC相关依赖,引入后,当前类配置生效,
           即满足Servlet、DispatcherServlet、WebMvcConfigurer类存在
          
          4.@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) :OnMissingBean,指环境中没有指定bean才会生效
          
          5.@AutoConfigureAfter({
      DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class }) :指定类类加载完后,再加载本类
		
		 6.其中DispatcherServletAutoConfiguration.class 配置了前端控制器
      --->dispatcherServlet---->new DispatcherServlet();

你可能感兴趣的:(Java重修之巅峰之路,spring,spring,boot,java)