首页 > 其他分享 >SpringBoot自动装配原理

SpringBoot自动装配原理

时间:2024-04-28 16:00:28浏览次数:21  
标签:装配 SpringBoot 配置 AutoConfigurationImportSelector 自动 注解 原理 configurations

 

 个人理解,SpringBoot就是由Spring和SpringMVC整合而来。开箱即用、简化监控、简化配置、简化部署;约定大于配置;

 boot脱离了传统Spring手动配置大量的bean,而SpringBoot自动装配改变了繁琐的局面。

 

  Spring Boot 的自动配置基于条件注解和自动配置类,它能够根据应用程序的依赖和环境,自动决定应该应用哪些配置和装配哪些 Bean。这意味着开发者只需要添加相应的依赖,写少量的配置代码,Spring Boot 就能够为我们完成大部分的配置工作,极大地简化了开发流程。

 

 自动装配原理:

    SpringBoot启动时,依靠启动类的main()方法;而main()方法执行的是SpringApplication.run()方法,而SpringApplication.run()方法中会创建spring的容器,并且刷新容器。而在刷新容器的时候就会去解析启动类,然后就会去解析启动类上的@SpringBootApplication注解,而这个注解是个复合注解,这个注解中有一个@EnableAutoConfiguration注解,这个注解就是开启自动配置,这个注解中又有@Import注解引入了一个AutoConfigurationImportSelector这个类,这个类经过一些核心方法,然后去扫描我们所有jar包下的META-INF下的spring.factories文件,而从这个配置文件中取找key为EnableAutoConfiguration类的全路径的值下面的所有配置都加载,这些配置里面都是有条件注解的,然后这些条件注解会根据你当前的项目依赖的pom以及是否配置了符合这些条件注解的配置来进行装载的。

 

  • @SpringBootApplication是一个复合注解 ==> @SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。

 

  • @SpringBootConfiguration,就是一个配置类,@Configuration是底层的核心注解,作用和spring配置文件中往spring容器中注入对象(<bean>),只是springboot封装了Configuration, 叫成了SpringBootConfiguration。
  • @EnableAutoConfiguration是由@AutoConfigurationPackage ,@Import({AutoConfigurationImportSelector.class})两个注解组成
    • @AutoConfigurationPackage是由 @Import({Registrar.class})实现的,核心方法是registerBeanDefinitions(),就是为了获取启动类所在的包,为后面扫描组件做准备。

    • @Import({AutoConfigurationImportSelector.class}) 核心类是AutoConfigurationImportSelector。

 

 protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            // 获取@EnableAutoConfiguration标注类的元信息。(exclude,excludeName)
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            // 获取自动装配类的候选类名称。
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            //去重,排除重复的configurations
            configurations = this.removeDuplicates(configurations);
            //获取自动装配组件的排除名单。
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            //检查排除类是否合法
            this.checkExcludedClasses(configurations, exclusions);
            //移除所有的排除名单
            configurations.removeAll(exclusions);
            //进行过滤,autoConfigurationMetadata充当过滤条件。
            configurations = this.getConfigurationClassFilter().filter(configurations);
            //自动装配的导入事件
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }
  • @ComponentScan 组件扫描和 @Import({Registrar.class}) 配合使用,就是为了扫描和启动类同一级包名或包名下面所有的组件。

 

标签:装配,SpringBoot,配置,AutoConfigurationImportSelector,自动,注解,原理,configurations
From: https://www.cnblogs.com/warmNest-llb/p/18163888

相关文章

  • mybat中的拦截器的使用和原理分析
    一、mybatis拦截器的介绍和简单使用要使用mybatis的拦截器需要先对mybatis的执行流程有比较全面的认识,可以参考下我的另两篇文章mybatis源码解析mybatis中sql的执行流程mybatis执行sql的过程中涉及到这几个核心对象Executor:执行器,StatementHandler,ParameterHandler,R......
  • 编译原理PL0语法分析实验1
    编译原理PL0语法分析实验11,待分析的简单语言的词法相同点:都是分析种别码不同点:词法分析器分析的是字符串中的单词的种别码(单词)语法分析器分析的是字符串的文法是否正确(句子)待分析的简单语言的语法BNF:(1)<程序>::=begin<语句串>end(2)<语句串>::=<语句>{;<语句>}(3)<语句>::=<赋值语句>......
  • 响应式原理(Vue3、Vue2)
    1.Vue3副作用函数(onMounted、watchEffect)帮助管理组件中的副作用逻辑,并自动追踪其依赖关系,以确保在数据变化时能够自动触发副作用函数的更新。会自动追踪被其内部函数引用的响应式数据。当这些数据发生变化时,Vue3会自动重新运行副作用函数,确保副作用与数据的状态保持同步。......
  • springboot~redis的hash结构为key设置过期策略
    redis配置文件开启键过期#The"notify-keyspace-events"takesasargumentastringthatiscomposed#ofzeroormultiplecharacters.Theemptystringmeansthatnotifications#aredisabled.##Example:toenablelistandgenericevents,fromthepo......
  • SpringBoot中几种好用的代码生成器(基于Mybatis-plus生成entity、mapper、xml等)
    前言熟悉Spring框架的同学一定都知道MVC开发模式吧,控制器(Controller)、业务类(Service)、持久层(Repository)、数据库映射(Mapper)、各种DO类构成了我们服务端的代码。初学的时候,觉得新鲜手写这些东西不觉得有啥,但是写久了就会觉得很烦。好不容易在数据库中写完了一遍字段,在Java代码又要......
  • SpringBoot常用注解(部分)
     @Service:注解在类上,表示这是一个业务层bean@Controller:注解在类上,表示这是一个控制层bean@Repository:注解在类上,表示这是一个数据访问层bean@Component:注解在类上,表示通用bean,value不写默认就是类名首字母小写@Autowired:按照类型(Spring容器默认单例模......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——客户端处理RPC请求的原理
    远程过程调用RPC——客户端处理RPC请求的原理及源代码分析 客户端无论是同步调用还是异步调用,每次RPC请求都会生成一个Call对象,并使用seq作为key保存在map中,服务端返回响应值时再根据响应值中的seq从map中取出Call,进行相应处理。 客户端发起RPC调用的过程大致如下所示,我们......
  • SpringBoot集成minio前后端联调
    基本配置初始化项目新建一个SpringBoot项目,集成lombokmybatis-plusminiohutool-core(可有可无)。新建一个数据表attachement,用于存储文件上传后在minio中的位置。droptableifexistsattachment;createtableattachment(idintauto_increment......
  • 统计原理 平均数
    在统计学中,算术平均数和调和平均数都是常用的描述数据集中趋势的指标,但它们的计算方法和解释有所不同。算术平均数:算术平均数是一组数据中所有数值的总和除以数据的个数。它是最常见的平均数类型,用于表示数据的集中趋势。算术平均数对数据中所有值进行等权重的考虑,不考虑各......
  • NTLM 中继攻击的底层原理 ,SMB 中继攻击的底层原理,LDAPS中继攻击的底层原理,Kerberos 中
    NTLM中继攻击是一种利用NTLM(NTLANManager)协议的安全漏洞进行攻击的技术。NTLM是Windows系统中用于验证用户身份的一种认证协议,它在本地网络环境中广泛使用。在NTLM中继攻击中,攻击者通过中间人的方式截获NTLM认证请求,并将其转发到目标系统上。然后,攻击者可以利......