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。
相关推荐
吾日三省吾码2 小时前
JVM 性能调优
java
弗拉唐3 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi774 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe4 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
工业甲酰苯胺4 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
BestandW1shEs4 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师4 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球4 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...4 小时前
表的操作(MySQL)
数据库·mysql·表的操作