Spring自动配置原理

一、前言

在传统的SSM框架集成中,需要编写大量的XML配置文件,比如继承Mybatis时,需要编写mybatis_config.xml文件,在集成springmvc时,需要编写springmvc.xml文件,这些配置十分繁琐,还很容易出现错误,导致开发效率低。而Spring Boot采用约定大于配置的思想,将大量的spring配置文件集成到Spring Boot的内部,帮助开发人员自动配置各类XML文件,极大的简化了开发过程。

二、自动配置原理

Spring Boot自动配置的核心注解是@SpringBootApplication,该注解是spring boot的启动类注解,它是一个复合注解,里面包含:

@SpringBootConfiguration

@EnableAutoConfiguration

  1. @SpringBootConfiguration:该注解上有一个@Configuration注解,表示这个spring bot启动类是一个配置类,最终要被注入到spring容器中。
  2. @EnableAutoConfiguration:表示开启自动配置,它也是一个复合注解,里面包含:

1、@AutoConfigurationPackage,该注解上有一个

@Import(AutoConfigurationPackages.Registrar.class)注解,其中Registrat类的作用是将启动类所在包下的所有子包的组件扫描注入到spring容器中。

这也是为什么在spring boot中,我们通常将controller、pojo、service、dao等包放在启动类同级目录下的原因。

@Import(AutoConfigurationImportSelector.class):其中AutoConfigurationImportSelector类中有一个getCandidateConfigurations()方法,该方法通过SpringFactoriesLoader.loadFactoryNames()方法查找位于META-INF/spring.factories文件中的所有自动配置类,并加载这些类。

spring.factories文件是以key-value键值对的形式存储文件里,其中有一个key=EnableAutoConfiguration,它对应的value值就是一个以AutoConfiguration结尾命名的xxxAutoConfiguration自动配置类

所以spring boot在整个的启动过程中,其实就是在类路径的META-INF/spring.factories文件中找到EnableAutoConfiguration对应的所有的自动配置类,然后将所有自动配置类加载到spring容器中。

所有自动配置类都是以AutoConfiguration结尾来命名的,而诸多的xxxAutoConfiguration 其实就是Spring容器的JavaConfig形式,它的作用就是为Spring容器导入bean。

三、自动配置生效

前面加载的所有自动配置类并不是都生效的,每一个xxxxAutoConfiguration自动配置类都是在某些特定的条件下才会生效。这些条件限制是通过@ConditionOnxxxx注解实现的。

常见的@ConditionOnxxxx注解有以下几种:

java 复制代码
@ConditionalOnBean:当容器里存在指定bean的条件下。

@ConditionalOnMissingBean:当容器里不存在指定bean的条件下。

@ConditionalOnClass:当类路径下有指定类的条件下。

@ConditionalOnMissingClass:当类路径下不存在指定类的条件下。

@ConditionalOnProperty:指定的属性是否有指定的值,比如
    @ConditionalOnProperties(prefix="xxx.xxx", value="enable", matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。
相关推荐
Goldn.15 小时前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
玄斎16 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
李慕婉学姐16 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_7400437317 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖17 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
编程小Y17 小时前
MySQL 与 MCP 集成全解析(核心原理 + 实战步骤 + 应用场景)
数据库·mysql·adb
未若君雅裁17 小时前
JVM面试篇总结
java·jvm·面试
kk哥889917 小时前
C++ 对象 核心介绍
java·jvm·c++
招风的黑耳18 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
xunyan623418 小时前
面向对象(下)-接口的理解
java·开发语言