Spring Boot自动配置的原理及@Conditional条件注解
作者:刘Java 发布时间:2021-08-31 21:14:11
1 @SpringBootApplication自动配置原理
@SpringBootApplication是一个组合注解,主要由@ComponentScan、@SpringBootConfiguration、@EnableAutoConfiguration这三个注解组成。@EnableAutoConfiguration是Spring Boot实现自动配置的关键注解。
@ComponentScan用于扫描指定包及子包路径,并将符合条件的组件类注册到Spring容器中 。默认的包路径
是当前@ComponentScan所在的包及其子包。默认的过滤条件是,如果类上具有包括@Component、@Service、@Repository、@Controller、@Configuration等注解,那么该类作为组件类而被注册到容器中,也可以通过指定includeFilters和excludeFilters属性来自定义条件。
@SpringBootConfiguration用于声明当前类是一个Spring Boot配置类,具有和@Configuration注解同样的作用。但应用程序中可以添加N个@Configuration注解的配置类,但是只能存在一个
@SpringBootConfiguration注解的配置类。推荐使用@SpringBootConfiguration来表示作为一个Boot应用程序的启动类。
@EnableAutoConfiguration用于声明在程序启动时,将会自动加载Spring Boot默认的配置。这是实现自动配置的关键注解。
@EnableAutoConfiguration注解内部主要是借助 @Import
注解引入的AutoConfigurationImportSelector
类来完成其功能。
而在AutoConfigurationImportSelector类中再借助SpringFactoriesLoader
工具类获取所有引入的jar包中和当前类路径下的META-INF/spring.factories文件。
spring.factories 文件必须是 Properties 格式,其中 key 是接口或抽象类的完全限定名称,value 是逗号分隔的实现类名称列表。SpringFactoriesLoader会将文件里面的自动配置类以及工厂类加载到Spring容器中,从而实现自动加载。这可以看作一种特殊的SPI机制。
其中,与常见的自动配置类相关的是位于spring-boot-autoconfigure.jar
下的/META-INF/spring.factories
文件中的配置信息,其中名为“org.springframework.boot.autoconfigure.EnableAutoConfiguration
”的key对应的value就是一系列自动配置类的全路径名。
Spring将会拆分这个value为一个全路径名集合,但他并不会将这些配置类全都加载,而是会将符合规则
的自动配置类加载到Spring 容器中。
在过滤的时候,将会检查类上的Conditional系列注解
,@ConditionalOnClass和@ConditionalOnMissingClass、@ConditionalOnWebApplication和@ConditionalOnNotWebApplication、@ConditionalOnBean和@ConditionalOnMissingBean和@ConditionalOnSingleCandidate注解(如果存在),只有符合规则的自动配置类才会注册到容器中。
我们也可以通过@SpringBootApplication的exclude和excludeName
属性指定排除某些自动配置类的注册,这样Spring Boot就不会自动注册某些配置。
这些自动配置类基本上都是使用@Configuration注解标注,并且其内部有一系列的@Bean方法或者同样被@Configuration注解标注的内部类。当这些自动配置类被加载到容器中之后,它们内部的@Bean方法或者内部类将会被解析,就有可能帮助我们进行一系列自动化的配置,将配置信息注册到Spring 容器中。
来源:https://blog.csdn.net/weixin_43767015/article/details/118178404


猜你喜欢
- 算法分析一个排序算法的好坏,一般是通过下面几个关键信息来分析的,下面先介绍一下这几个关键信息,然后再将常见的排序算法的这些关键信息统计出来。
- 一、概述一个Process组件提供了在计算机运行进程的访问权限。 进程,在最简单的术语中,是正在运行的应用。提供对本地和远程进程的访问权限并
- 前言此文章主要解决拦截用户点击手机底部导航栏中的返回键时该事件的拦截;此方法依然可以适用于fragmentonBackPressed()这是
- netty心跳机制示例,使用Netty实现心跳机制,使用netty4,IdleStateHandler 实现。Netty心跳机制,netty
- java 中设计模式(值对象)的实例详解应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如
- 1.背景选择器(位于res/drawable/,使用方法:android:background=”@drawable/XXX”) <?
- Java读取properties文件中文乱码初用properties,读取java properties文件的时候如果value是中文,会出
- 前言对于Android播放一些简短音效,例如提示音,或者铃声,相对于使用MediaPlayer,SoundPool可以节省更多资源,并且可以
- 今天,简单讲讲android里关于@id和@+id的区别。之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自
- 本文实例为大家分享了Android实现界面跳转的具体代码,供大家参考,具体内容如下布局<?xml version="1.0&
- 本文实例为大家分享了Android Scroller实现弹性滑动的具体代码,供大家参考,具体内容如下首先看下实现效果,可以看到当我们手指松开
- 首先,查到java里文件重命名的方法为:renameTo();我将180张图片放在d:\\backup下,用下面的程序进行重命名:publi
- spring事务注解@Transactional与trycatch在项目中 @service层中 我们会经常在做一些增删改操作的方法上看到
- 在使用jQuery时候,我们经常会看到或者使用到方法链,例如:$("#p1").css("color"
- 一.线程不安全多线程的执行环境中,程序的执行结果和预期的结果不符合,这就称为发生了线程不安全现象二.那些情况导致了线程不安全?大致分为以下5
- 之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源。在单数据源的情况下,Spring Boot的配置
- java 抽象类的实例详解前言:什么是抽象类?这名字听着就挺抽象的,第一次听到这个名字还真有可能被唬住。但是,就像老人家所说的,一切反动派都
- 一、委托1、什么是委托委托是面向对象的、类型安全的,是引用类型。使用delegate关键字进行定义。委托的本质就是一个类,继承自System
- Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*
- 本文实例讲述了Android亮屏和熄屏控制实现方法。分享给大家供大家参考,具体如下:一、概述我们的Android应用程序很多需要和亮屏和熄屏