草庐IT

springboot自动配置原理以及手动实现配置类

靠谱杨 2023-04-17 原文

springboot自动配置原理以及手动实现配置类

1、原理

spring有一个思想是“约定大于配置”。

配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot在启动的时候可以把一些配置类自动注入到spring的IOC容器里,项目运行之后就可以直接使用这些配置类的属性和方法等。

springboot有一个全局配置文件,application.properties / application.yml,各种属性都可以在文件中进行自定义配置。

自动配置实现原理:

我们都知道项目的入口是 @SpringBootApplication 注解,这个注解标识了该类是springboot的启动类,那我们就从它入手一探究竟。

我们可以看到这个注解是一个复合注解,其中的 @EnableAutoConfiguration 注解表示开启自动配置,这个注解也是复合注解。

我们可以看到它导入了一个名为AutoConfigurationImportSelector的类,那么这个类的作用是什么呢?

我们继续往下看,可以看到 selectImports( ) 方法

selectImports 这个方法通过调用 SpringFactoriesLoader.loadFactoryNames() 方法扫描spring-boot-autoconfigure-xxx.jar/META-INF路径下的 spring.factories文件,通过类的全路径拿到需要配置的类名,然后通过反射将其全部注入IOC容器中。

每个配置类都有一些属性,XXXAutoConfiguration自动配置类,会有一个@EnableConfigurationProperties注解,它的参数是一个XXXProperties类,该注解的作用是把XXXProperties类的实例加载到Spring的IOC容器中,而XXXProperties类中的属性就是自动配置的属性。

XXXProperties类有一个注解@ConfigurationProperties,该注解可以扫描全局配置文件application.properties或者application.yml文件中以prefix开头的一组配置绑定到DataSourceProperties实例的属性上,实现自动配置。

// 全局扫描注入 配置文件中以spring.datasource开头的值
@ConfigurationProperties(
    prefix = "spring.datasource"
)

2、手动写一个自动配置类

有了上面的理解,我们可以自己动手写一个自动配置类。

自动配置类做的事情就是把@EnableConfigurationProperties注解标识的类注入到IOC容器。

2.1、所以我们先写一个自动配置类SeviceAutoConfiguration

package com.ycw.autoconfig.configuration;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author Administrator
 * @date 2022-09-30 21:51
 */
@Slf4j
@Configuration  // 自动配置类
@EnableConfigurationProperties(ServiceProperties.class)     // 标识XXXProperties类的实例
public class SeviceAutoConfiguration {

}

2.2、写真正要加入容器的类ServiceProperties

package com.ycw.autoconfig.configuration;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @author Administrator
 * @date 2022-09-30 21:50
 */
@Data
@Slf4j
@ConfigurationProperties(prefix = "myconfig")   // 扫描全局配置文件完成属性注入
public class ServiceProperties {
	private String name;
	public void print(){
		log.info("自动配置成功! " + name);
	}
}

2.3、在resources目录下新建目录META-INF,新建文件spring.factories完成对自动配置类全路径配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ycw.autoconfig.configuration.SeviceAutoConfiguration

2.4、在全局配置文件application.properties中添加属性注入

2.5、写一个Controller测试,ControllerTest

package com.ycw.autoconfig.controller;

import com.ycw.autoconfig.configuration.ServiceProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author Administrator
 * @date 2022-09-30 21:54
 */
@RestController
public class ControllerTest {
	@Resource
	private ServiceProperties serviceProperties;
	@RequestMapping("test")
	public void test(){
		serviceProperties.print();
	}
}

运行之后我们可以看到:

分析一下这个过程:

  1. 启动类@SpringBootApplication通过spring.factories文件中的org.springframework.boot.autoconfigure.EnableAutoConfiguration找到了SeviceAutoConfiguration

  2. @Configuration 注解的类SeviceAutoConfiguration被springboot扫描到后,它所标识的@EnableConfigurationProperties(ServiceProperties.class) 开始进入被注入容器的过程

  3. ServiceProperties 类的注解@ConfigurationProperties(prefix = "myconfig") 使得springboot扫描全局配置文件application.properties

  4. application.properties中的 myconfig.name=yangchuanwei 被注入到属性name中,自此ServiceProperties已经被自动配置成功!


获取demo地址可以关注公众号【靠谱杨的挨踢生活】,回复【autoconfig】获取下载链接。

有关springboot自动配置原理以及手动实现配置类的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  6. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  7. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐