SpringBoot源码分析----(一)SpringBoot自动配置

前言

springboot项目将模块化设计发挥到及至,需要什么模块,只需导入这个模块对应的stater即可,当然,用户根据业务需要自定义相关的stater,关于自定义stater在后续章节将一一解说,学习springboot,首要了解springboot的自动配置原理,我们从springboot项目的主启动类说起逐步解读springboot自动配置的奥秘。

springboot自动配置解读

@SpringBootApplication
public class SpringBootQuickApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootQuickApplication.class, args);
    }

}

如上所示,@SpringBootApplication 注解标注在springboot应用的主启动类上,如下所示,@SpringBootApplication  其为复合注解,主要分析@SpringBootConfiguration  @EnableAutoConfiguration 这两个注解代表的含义

1.  @SpringBootConfiguration

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

@SpringBootConfiguration  标识在某个类上表示这个类为springboot的配置类,@Configuration 为 spring 定义的配置类注解,@SpringBootConfiguration为springboot定义的配置类注解,深入@Configuration 可以看到其为 spring 容器中的一个组件

提示:配置类是为了替换配置文件而生的,配置类也为容器中的一个组件  @Component

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Configuration {

2. @EnableAutoConfiguration

springboot中为我们自动配置好了许多东西,@EnableAutoConfiguration 告诉 springboot 开启自动配置,这样自动配置才能生效
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

注解 @AutoConfigurationPackage    @Import({AutoConfigurationImportSelector.class})  给容器中导入组件

① 、@AutoConfigurationPackage 自动配置包

@Import({Registrar.class})
public @interface AutoConfigurationPackage {

@Import 为spring的底层注解,给容器中导入一个组件

由注册器 Register 给springboot中注入组件,
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
        Registrar() {
        }    //注册 bean 定义
    //将主配置类(@SpringBootApplication标注的类)所在的包及下面子包里面的所有组件扫描到 spring 容器当中
        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
        }
总结: 可以看出,通过 @AutoConfigurationPackage 注解将自定义的组件扫描到 spring 容器当中

②、@Import({AutoConfigurationImportSelector.class})

给容器中导组件?

导入那些组件?

AutoConfigurationImportSelector 导入哪些组件的选择器

将所需要的组件以全类名的方式返回,这些组件将加入到spring容器当中

给容器当中导入非常多的配置类(XXXAutoConfiguration)   ,给容器中导入这个场景所需要的所有组件并配置好这些组件

有了这些自动配置,免去了我们手动编写配置注入功能组件的工作
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, this.getBeanClassLoader());SpringBoot在启动的时候从类路径下的 MATE-INF/spring.factories中获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器当中,自动配置类就生效,就可以帮助我们自动配置工作,以前我们自己需要配置的东西springboot帮我们做了

Javaee  整体解决方案和自动配置都在这个包里面  spring-boot-autoconfigure-2.2.5.RELEASE.jar  

原文地址:https://www.cnblogs.com/tombky/p/12555416.html

时间: 2024-08-21 15:09:53

SpringBoot源码分析----(一)SpringBoot自动配置的相关文章

SpringBoot源码分析之---SpringBoot项目启动类SpringApplication浅析

源码版本说明 本文源码采用版本为SpringBoot 2.1.0BUILD,对应的SpringFramework 5.1.0.RC1 注意:本文只是从整体上梳理流程,不做具体深入分析 SpringBoot入口类 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args

[SpringBoot]源码分析SpringBoot的异常处理机制

微信号:GitShare微信公众号:爱折腾的稻草如有问题或建议,请在公众号留言[1] 前续 为帮助广大SpringBoot用户达到"知其然,更需知其所以然"的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理. 正文 在SpringBoot启动时,会查找并加载所有可用的SpringBootExceptionReporter,其源码如下: //7 使用SpringFactoriesLoader在

【spring-boot 源码解析】spring-boot 依赖管理

关键词:spring-boot 依赖管理.spring-boot-dependencies.spring-boot-parent 问题 maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程越来越庞大,依赖越来越多,各种二方包.三方包太多太多,依赖冲突处理起来真是让人头疼,经常需要涉及到多个地方需要调整. 微信公众号:逸飞兮(专注于java知识领域的源码分析,从源码中理解框架/工具原理.验证CS专业知识) 解决方案 使用统一的依赖管理模块来管理工程中的所有依赖. spring-boot

源码分析之FastJson全局配置日期格式导致@JSONField(format = "yyyy-MM-dd")注解失效

出现的问题 我全局配置的时间格式是:yyyy-MM-dd HH:mm:ss @JSONField注解配置的时间格式是:yyyy-MM-dd 最终的返回结果是:yyyy-MM-dd HH:mm:ss 问题:为啥不是以注解定义的时间格式为主呢? 先说答案,后面再分析: FastJson的全局配置日期格式会导致@JSONField注解失效 使用建议: 1.若全局配置了日期格式,就不要使用@JSONField注解 2.若想使用@JSONField注解,就不要全局配置日期格式 一.FastJson全局配置

SpringBoot源码分析----(二)SpringBoot自动配置原理

自动配置原理 1.SpringBoot启动的时候加载主配置类,开启了自动配置功能  @EnableAutoConfiguration [email protected] 功能的作用 @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { 利用  AutoConfigurationImportSelector  给容器

Springboot源码分析之番外篇

摘要: 大家都知道注解是实现了java.lang.annotation.Annotation接口,眼见为实,耳听为虚,有时候眼见也不一定是真实的. /** * The common interface extended by all annotation types. Note that an * interface that manually extends this one does <i>not</i> define * an annotation type. Also no

Springboot源码分析之EnableAspectJAutoProxy

摘要: Spring Framwork的两大核心技术就是IOC和AOP,AOP在Spring的产品线中有着大量的应用.如果说反射是你通向高级的基础,那么代理就是你站稳高级的底气.AOP的本质也就是大家所熟悉的CGLIB动态代理技术,在日常工作中想必或多或少都用过但是它背后的秘密值得我们去深思.本文主要从Spring AOP运行过程上,结合一定的源码整体上介绍Spring AOP的一个运行过程.知其然,知其所以然,才能更好的驾驭这门核心技术. @Target({ElementType.TYPE})

PHP源码分析之session.auto_start配置分析

作者:zhanhailiang 日期:2014-10-20 应用分析 日常开发中,php.ini配置session.auto_start=0默认关闭会话时如果想开启会话需要调用session_start: <?php   session_start(); //... 内核分析 通过查到源码,可知session_start定义如下: 1881 /* {{{ proto bool session_start(void) 1882 Begin session - reinitializes freez

dubbo源码分析7——dubbo的配置解析_与spring的整合

dubbo的配置其实就是建立在spring的命名空间的配置机制之上的.在dubbo的jar包的META-INF目录下会有spring.handlers这个文件,用来配置spring的命名空间和解析类的对应关系.打开spring.handlers文件,可知dubbo的命名空间配置的处理类为com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler,代码: public void init() { registerBeanDefiniti