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
猜你喜欢
- 本文实例讲述了Java实现接口的枚举类。分享给大家供大家参考,具体如下:一 点睛枚举类也可以实现一个或多个接口。与普通类实现一个或多个接口完
- 前言Kotlin一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅,下面总结了在开发中经常用
- 1、注解@PathVariable:将请求url中的占位符参数与控制器方法入参绑定起来(Rest风格请求)@RequestHeader:获取
- 1.spring-kafka<dependency> <groupId>org.springframe
- throw抛出异常的方式比较直接:if(age < 0){throw new MyException("年龄不能为负数!&q
- 前言《摩尔庄园》前段时间上线, 持续超出市场预期,相信也有不错的收益。游戏好玩,所有玩家看到了前端,但是做一款游戏,离不开后台游戏服务器的支
- Statement 和 PreparedStatement之间的关系和区别. 关系:Prepa
- 详解 Corba开发之Java实现Service与Client1 概述
- 一、使用ThreadLocal实现当前登录信息的存取在项目中我们增加一个员工有一些信息是需要我们自己填入的,有一些信息不需要我们自己填写,例
- 本文通过解决老王经常搞错借书人的问题,来引出行为型模式中的命令模式。为了在案例之上理解的更加透彻,我们需要了解命令模式在源码中的应用。最后指
- 本文实例讲述了Android TextView跑马灯效果实现方法。分享给大家供大家参考,具体如下:public class MyTextVi
- 获取和释放 monitor 锁的时机本文我们研究下 synchronized 背后的 monitor 锁。我们都知道,最简单的同步方式就是利
- android线程消息机制主要由Handler,Looper,Message和MessageQuene四个部分组成。平常在开发中,我们常用来
- 之前我们在使用vue进行 h5 表单录入的过程中,遇到了Android软键盘弹出,覆盖 h5页面 输入框 问题,在此进行回顾并分享给大家:系
- 微服务feign调用添加token1.一般情况是这么配置的具体的怎么调用就不说了 如下配置,就可以在请求头中添加需要的请求头信息。packa
- java项目中常用maven工具来进行工程管理,但经常遇到的一个问题是生成的jar包越来越大,编译一次工程越来越慢。怎么有效地去除冗余依赖,
- requestFoucs();无效。requestFoucsFromTouch();无效。webview.setTouchListener;
- 如下所示:import java.security.MessageDigest;import java.security.NoSuchAlg
- 在之前项目中有用到关于获取手机联系人的部分,闲置就想和大家分享一下,话不多说,上代码:java部分:package com.example.
- 所谓文件的断点续传,就是一个线程传输文件,另一个线程控制传输标识,以达到暂停文件效果、恢复文件上传的效果。本demo使用最基本的线程之间的通