Spring Boot 系列二:SpringBoot自动配置原理

简介: ​ 学长在这里想对小伙伴们提问一个问题:你们有对SpringBoot自动配置原理进行了解吗?今天学长来带领大家学习Spring Boot 自动配置原理~~SpringBoot开启自动配置的注解是@EnableAutoConfiguration ,启动类上的注解@SpringBootApplication是一个复合注解,包含了@EnableAutoConfiguration:SpringBoot自动配置原理@AutoConfigurationPackage //将main同级的包下的所有组件注册到容器中@Import({AutoConfigurationImportSelec

  学长在这里想对小伙伴们提问一个问题:你们有对SpringBoot自动配置原理进行了解吗?今天学长来带领大家学习Spring Boot 自动配置原理~~

SpringBoot开启自动配置的注解是@EnableAutoConfiguration ,启动类上的注解@SpringBootApplication是一个复合注解,包含了@EnableAutoConfiguration:

image.gif编辑

SpringBoot自动配置原理

    • EnableAutoConfiguration 只是一个简单的注解,自动装配核心功能的实现实际是通过 AutoConfigurationImportSelector
    @AutoConfigurationPackage //将main同级的包下的所有组件注册到容器中
    @Import({AutoConfigurationImportSelector.class}) //加载自动装配类 xxxAutoconfiguration
    public @interface EnableAutoConfiguration {
        String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
        Class<?>[] exclude() default {};
        String[] excludeName() default {};
    }
    • image.gif
    • AutoConfigurationImportSelector实现了ImportSelector接口,这个接口的作用就是收集需要导入的配置类,配合@Import()就可以将相应的类导入到Spring容器中
    • 获取注入类的方法是selectImports(),它实际调用的是getAutoConfigurationEntry,这个方法是获取自动装配类的关键,主要流程可以分为这么几步:
      1. 获取注解的属性,用于后面的排除
      2. 获取所有需要自动装配的配置类的路径:这一步是最关键的,从META-INF/spring.factories获取自动配置类的路径
      3. 去掉重复的配置类和需要排除的重复类,把需要自动加载的配置类的路径存储起来
        protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
                if (!this.isEnabled(annotationMetadata)) {
                    return EMPTY_ENTRY;
                } else {
                    //1.获取到注解的属性
                    AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
                    //2.获取需要自动装配的所有配置类,读取META-INF/spring.factories,获取自动配置类路径
                    List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
                    //3.1.移除重复的配置
                    configurations = this.removeDuplicates(configurations);
                    //3.2.处理需要排除的配置
                    Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
                    this.checkExcludedClasses(configurations, exclusions);
                    configurations.removeAll(exclusions);
                    configurations = this.getConfigurationClassFilter().filter(configurations);
                    this.fireAutoConfigurationImportEvents(configurations, exclusions);
                    return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
                }
            }

        image.gif


        相关文章
        |
        2月前
        |
        Java Spring
        Spring Boot配置的优先级?
        在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
        492 0
        |
        23天前
        |
        Java 关系型数据库 数据库
        深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
        在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
        |
        5月前
        |
        安全 Java API
        深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
        本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
        635 2
        |
        1月前
        |
        安全 算法 Java
        在Spring Boot中应用Jasypt以加密配置信息。
        通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
        574 10
        |
        6月前
        |
        安全 Java Apache
        微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
        本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
        302 0
        |
        6月前
        |
        安全 Java 数据安全/隐私保护
        微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
        本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
        235 0
        |
        5月前
        |
        存储 人工智能 自然语言处理
        RAG 调优指南:Spring AI Alibaba 模块化 RAG 原理与使用
        通过遵循以上最佳实践,可以构建一个高效、可靠的 RAG 系统,为用户提供准确和专业的回答。这些实践涵盖了从文档处理到系统配置的各个方面,能够帮助开发者构建更好的 RAG 应用。
        2549 114
        |
        2月前
        |
        人工智能 安全 Java
        Spring Boot yml 配置敏感信息加密
        本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
        703 1
        |
        2月前
        |
        缓存 安全 Java
        Spring 框架核心原理与实践解析
        本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
        101 0
        |
        2月前
        |
        监控 架构师 NoSQL
        spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
        spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)