【springboot】之自动配置原理

使用springboot开发web应用是很方便,只需要引入相对应的GAV就可以使用对应的功能,springboot默认会帮我们配置好一些常用配置。那么springboot是怎么做到的呢?这篇文章将一步步跟踪源码,查看springboot到底是如何帮我们做自动化配置。

springboot核心注解

@SpringBootApplication

 

 

 

 

可以看到使用@import导入一个开启自动配置的选择器

@import的作用,官方源码

* @author Chris Beams* @since 3.0* @see Configuration* @see ImportSelector* @see ImportResource*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {/*** The @{@link Configuration}, {@link ImportSelector} and/or* {@link ImportBeanDefinitionRegistrar} classes to import.*/Class<?>[] value();
}

 

导入@Configuration注解的配置类
导入ImportSelector的实现类
导入ImportBeanDefinitionRegistrar的实现类

接着看导入的这个选择器(@EnableAutoConfigurationImportSelector.class)

 

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());Assert.notEmpty(configurations,"No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;}

 

这里方法调用了两个核心方法

1、 getSpringFactoriesLoaderFactoryClass(),我们发现返回的是EnableAutoConfiguration.class

2、loadFactoryNames这个方法

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {String factoryClassName = factoryClass.getName();try {Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));List<String> result = new ArrayList<String>();while (urls.hasMoreElements()) {URL url = urls.nextElement();Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));String propertyValue = properties.getProperty(factoryClassName);for (String factoryName : StringUtils.commaDelimitedListToStringArray(propertyValue)) {result.add(factoryName.trim());}}return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load factories from location [" +FACTORIES_RESOURCE_LOCATION + "]", ex);}}

 

 

先获取factoryClass(EnableAutoConfiguration)的className(org.springframework.boot.autoconfigure.EnableAutoConfiguration),

将这个className当做Property的key值,来获取Value。springboot默认会全局扫描FACTORIES_RESOURCE_LOCATION

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

 

 springboot将会加载(org.springframework.boot.autoconfigure.EnableAutoConfiguration)所对应的所有自动配置到spring IOC容器中

 

自动配置如何生效

以(org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration)为例。

 

 

我们看到当前自动配置类核心在这几个注解。

@Configuration
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class,MultipartConfigElement.class })
@ConditionalOnProperty(prefix = "spring.http.multipart", name = "enabled", matchIfMissing = true)
@EnableConfigurationProperties(MultipartProperties.class)

 

@Configuration spring注解配置类

@ConditionalOnClass 意思是存在某个类,当前配置生效

@ConditionalOnProperty 意思是否存在开启的spring.http.multipart 的配置,这里默认开启,对应的是springboot主配置文件(application)文件中配置项目

@EnableConfigurationProperties 意思是将MultipartProperties类加入spring容器,等价于在MultipartProperties类上加 @Component注解

我们去看一下MultipartProperties类是干什么了?

@ConfigurationProperties(prefix = "spring.http.multipart", ignoreUnknownFields = false)
public class MultipartProperties {

 

@ConfigurationProperties 读取springboot主配置文件(application.prperties)的配置

所以最后发现只要满足@Conditionalxxxx条件 ,当前自动配置类即可生效。

 

综上,如果我们想知道引入的某个GAV可以配置哪些属性,主需要找到对应的xxxAutoConfiguration 查看对应的

@EnableConfigurationProperties(xxxx.class)引入的class即可。

 

转载于:https://www.cnblogs.com/gyjx2016/p/10588733.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阴雨连绵潮湿加剧 车辆防潮提升保值

近日来&#xff0c;申城阴雨绵绵&#xff0c;不但增加了行车的难度&#xff0c;也使爱车潮气严重&#xff0c;开上一会就会发现前车窗布满水汽&#xff0c;需要开空调吹干才能保证良好视野。此外潮气也容易对人体和车辆本身造成影响&#xff0c;首当其冲的是车内电器&#xff0…

php nsdata,iOS开发之数据存储之NSData

1、概述使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中&#xff0c;但有时候可能想将多个对象写入到同一个文件中&#xff0c;那么就要使用NSData来进行归档对象。NSData可以为一些数据提供临时存储空间&#xff0c;以便随后写入文件&#xff0c;或者存…

asp.net控件开发基础(19)

上两篇讨论了基本数据绑定控件的实现步骤&#xff0c;基本上我们按着步骤来就可以做出简单的数据绑定控件了。过年前在看DataGrid的实现&#xff0c;本来想写这个的&#xff0c;但2.0出了GridView了&#xff0c;再说表格控件实现比较复杂&#xff0c;所以先放着。我们一起打开M…

1048 Find Coins

水题&#xff0c;详见代码&#xff5e; #include <iostream> #include <string.h> #include <cstdio> #include <algorithm> #include <cstdlib> #include <math.h> #include <queue> #include <stack> #include <vector&g…

php组件是啥,浅谈PHP组件、框架以及Composer

本篇文章主要介绍了PHP组件、框架以及Composer&#xff0c;具有一定的学习价值&#xff0c;感兴趣的朋友可以了解一下。什么是组件组件是一组打包的代码&#xff0c;是一系列相关的类、接口和Trait&#xff0c;用于帮助我们解决PHP应用中某个具体问题。例如&#xff0c;你的PHP…

{转}maven+continuum安装与配置

为什么80%的码农都做不了架构师&#xff1f;>>> 一、下载 1. maven: 项目管理工具&#xff0c;可以进行项目的编译、测试、布置、发布等 下载路径&#xff1a;http://apache.etoak.com/maven/binaries/apache-maven-2.2.1-bin.zip 2. continuum: 基本实现的功能&…

.net Excel导出出现乱码及excel打开出现错误提示

测试人员测试发现。导出excel出现乱码以及出现文件可正常导出、后几次导出却异常。 使用的系统浏览器&#xff1a; 其他360浏览器、谷歌浏览器均正常。 出现情况如下&#xff1a; 查资料发现&#xff0c;之前导出代码编写的 Response.AppendHeader("Content-Disposition&q…

rsync推拉模型及结合inotify实现推模型自动同步

一、前言 无论使用什么操作系统下&#xff0c;都经常有同步文件的需求&#xff0c;不管发生在本地&#xff0c;还是发生在本地和远程主机之间。那么应该怎么做呢&#xff1f; 使用拷贝类的命令&#xff0c;本地使用cp命令&#xff0c;复制到远程主机使用scp这样的命令&#xff…

oracle to pgsql,PostgresToOracle

PostgresToOracle官方版是一款十分专业和实用的PostgreSQL数据库迁移到Oracle工具&#xff0c;PostgresToOracle官方版功能出色&#xff0c;操作便捷&#xff0c;能够轻松快捷的帮助大家将PostgreSQL数据导入到oracle数据中&#xff0c;导入之后可以进行数据编辑&#xff0c;此…

Struts2中的OGNL详解

2019独角兽企业重金招聘Python工程师标准>>> 首先了解下OGNL的概念&#xff1a; OGNL是Object-Graph Navigation Language的缩写&#xff0c;全称为对象图导航语言&#xff0c;是一种功能强大的表达式语言&#xff0c;它通过简单一致的语法&#xff0c;可以任意存取…

C# 之 HttpResponse 类

Response 对象&#xff0c;派生自HttpResponse 类&#xff0c;该类封装来自 ASP.NET 操作的 HTTP 响应信息。存在于System.Web命名空间下。 注&#xff1a;MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的…

11个实用的CSS学习工具

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 盒子模型的幻灯片 通过3D转换效果产生的互动的幻灯片。按向左或向右箭头键切换&#xff0c;全屏观看会有更好的效果。 2. CSS Diner 通过一个简单的小游戏让你学习CSS selector&#xff0c;输入正确的selector来完…

Google 节日徽标全集 (1999-2009) (下)

这是 Google 节日徽标全集的第三部分&#xff0c;也是最后一部分&#xff0c;包含 Google 2006 至 2009 年 2 月全部节日徽标。需要指出的是&#xff0c;这些徽标均来自 Google 国际站点&#xff0c;也就是 www.google.com&#xff0c;Google 在众多本地站点上还有大量本土化的…

HBuilder:最快的Web开发IDE

HBuilder&#xff1a;最快的Web开发IDE http://www.csdn.net/article/2014-02-07/2818326-HBuilder-the-fastest-web-ide发表于2014-02-11 10:38| 26194次阅读| 来源CSDN| 59 条评论| 作者CSDN移动前端开发HBuilder数字天堂王安Web开发HTML5DCloud摘要&#xff1a;HBuilder是DC…

Pycharm 项目无法导入自己写的模块(问题记录贴)

问题&#xff1a; 从外部导入一个Python项目后&#xff0c;发现包错误&#xff0c;如图&#xff1a; 解决步骤&#xff1a; 1.将目录下的"5-6——apriori.py"复制一份&#xff0c;重命名为”apriori.py"&#xff1b; 2.查资料知&#xff0c;pycharm不会将当前文…

Win2000/XP/2003路由制作之Nat共享上网

Win2000/XP/2003&#xff08;必须SERVER&#xff08;服务&#xff09;版本的&#xff09;ROUTEROS不会或则你的路由器突然坏了。紧急情况下&#xff0c;为了让老板的网吧正常营业&#xff0c;随手找个电脑就可以正常工作了。好吧。言归正传。NAT服务器软硬件准备俗话说“巧妇难…

Linux中的Interrupted system call错误

2019独角兽企业重金招聘Python工程师标准>>> 最近公司的一个项目&#xff0c;上线时候遇到了一些问题&#xff0c;服务跑一段时间后连接不上。 发现报了Interrupted system call这个错误引起的。 查了下资料&#xff0c;大致原因是系统繁忙处理不过来导致的。 根据网…

JAVA格式化当前日期或者取年月日

Date d new Date(); System.out.println(d); SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateNowStr sdf.format(d); System.out.println("格式化后的日期&#xff1a;" dateNowStr); 转载于:https://www.cnblo…

ubuntu查看硬件信息

ubuntu查看硬件信息 1,外部探针probe sudo apt-get install hwinfo 执行hwinfo获取系统信息 --short 2,系统命令dmidecode(硬件信息) or dmesg(主要是开机信息) 基于命令ubuntu 系统硬件信息查看 主板信息,序列号,产品名 dmesg | grep -i cpu dmidecode -t processor 硬盘(分区…

linux win10虚拟内存,高手解惑win10系统电脑虚拟内存不足的还原技巧

我们在使用电脑的时候&#xff0c;难免会遇到win10系统电脑虚拟内存不足的情况&#xff0c;根据小编的调查并不是所有的朋友都知道win10系统电脑虚拟内存不足的问题怎么解决&#xff0c;针对win10系统电脑虚拟内存不足的问题&#xff0c;我给大家整理总结了详细的解决步骤&…