提供的一种加载配置的方式,它会将类从配置文件中读取到,然后利用反射将bean加载到IOC容器中。...这些配置类在spring.factories文件中是以key=value的形式存储的,来看下部分自动配置类: # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration...作为key,然后取到对应的自动配置类列表。...最终调用的是loadSpringFactories方法,loadSpringFactories会从jar包中找到spring.factories文件然后将其中的自动配置类存到一个map中,从下图可以看到...SpringFactoriesLoader.loadSpringFactories从jar包中找到所有META-INF/spring.factories文件并读取自动配置类,存放到map中, loadFactoryNames
,其实框架自身提供了非常多的扩展点,其中最适合做插件扩展的莫过于spring.factories的实现; 3.1 Spring Boot中的SPI机制 在Spring中也有一种类似与Java SPI的加载机制...它在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化,这种自定义的SPI机制是Spring Boot Starter实现的基础。...3.2 Spring Factories实现原理 spring-core包里定义了SpringFactoriesLoader类,这个类实现了检索META-INF/spring.factories文件,并获取指定接口的配置的功能...在这个类中定义了两个对外的方法: loadFactories 根据接口类获取其实现类的实例,这个方法返回的是对象列表; loadFactoryNames 根据接口获取其接口类的名称,这个方法返回的是类名的列表...; 上面的两个方法的关键都是从指定的ClassLoader中获取spring.factories文件,并解析得到类名列表,具体代码如下: public static List loadFactoryNames
Spring Boot 3.x系列文章 Spring Boot 2.7.8 中文参考指南(一) Spring Boot 2.7.8 中文参考指南(二)-Web Spring Boot 源码阅读初始化环境搭建...类实例 SpringFactoriesLoader 是Spring 框架中的类,用于从多个Jar文件的META-INF/spring.factories中加载并实例化给定的类型,spring.factories...classLoader : SpringFactoriesLoader.class.getClassLoader()); // 从缓存中获取SpringFactoriesLoader,若不存在,则创建一个并缓存...,并插入实现类列表 Arrays.stream(factoryImplementationNames).map(String::trim).forEach(implementations::add...是0,所以会在我们自定义MyInitializer和MyInitializer2 前执行,它是另外一种独立的初始化器,专门用于将配置文件中的ApplicationContextInitializer实现类加载到
等)或者bean定义,最终将这些bean定义加载到IoC容器中。...即需要传入工厂类名称和对应的类加载器,方法会根据指定的classLoader,加载该类加器搜索路径下的指定文件,即spring.factories文件,传入的工厂类为接口,而文件中对应的类则是接口的实现类...> factoryClass, ClassLoader classLoader) { .... } } 所以文件中一般为如下图这种一对多的类名集合,获取到这些实现类的类名后,loadFactoryNames...方法返回类名集合,方法调用方得到这些集合后,再通过反射获取这些类的类对象、构造方法,最终生成实例。...如果获取到类信息,spring可以通过类加载器将类加载到jvm中,现在我们已经通过spring-boot的starter依赖方式依赖了我们需要的组件,那么这些组件的类信息在select方法中就可以被获取到
@EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖...和classLoader,即需要传入上图中的工厂类名称和对应的类加载器,方法会根据指定的classLoader,加载该类加器搜索路径下的指定文件,即spring.factories文件,传入的工厂类为接口...,而文件中对应的类则是接口的实现类,或最终作为实现类,所以文件中一般为如下图这种一对多的类名集合,获取到这些实现类的类名后,loadFactoryNames方法返回类名集合,方法调用方得到这些集合后,再通过反射获取这些类的类对象...我们知道,如果获取到类信息,spring自然可以通过类加载器将类加载到jvm中,现在我们已经通过spring-boot的starter依赖方式依赖了我们需要的组件,那么这些组建的类信息在select方法中也是可以被获取到的...所以Spring-boot为我们提供了统一的starter可以直接配置好相关的类,触发自动配置所需的依赖(mybatis)如下: 这里是截取的mybatis-spring-boot-starter的源码中
和classLoader,即需要传入上图中的工厂类名称和对应的类加载器,方法会根据指定的classLoader,加载该类加器搜索路径下的指定文件,即spring.factories文件,传入的工厂类为接口...,而文件中对应的类则是接口的实现类,或最终作为实现类,所以文件中一般为如下图这种一对多的类名集合,获取到这些实现类的类名后,loadFactoryNames方法返回类名集合,方法调用方得到这些集合后,再通过反射获取这些类的类对象...我们知道,如果获取到类信息,spring自然可以通过类加载器将类加载到jvm中,现在我们已经通过spring-boot的starter依赖方式依赖了我们需要的组件,那么这些组建的类信息在select方法中也是可以被获取到的...该方法中的getCandidateConfigurations方法,通过方法注释了解到,其返回一个自动配置类的类名列表,方法调用了loadFactoryNames方法,查看该方法 ?...进入org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration中,主要看一下类头: ?
@EnableAutoConfiguration 会根据类路径中的 jar 依赖为项目进行自动配置,如:添加了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring...factoryClass 和 classLoader,即需要传入上图中的工厂类名称和对应的类加载器,方法会根据指定的 classLoader,加载该类加器搜索路径下的指定文件,即 spring.factories...文件,传入的工厂类为接口,而文件中对应的类则是接口的实现类,或最终作为实现类,所以文件中一般为如下图这种一对多的类名集合,获取到这些实现类的类名后,loadFactoryNames 方法返回类名集合,...spring.factories 文件,自动配置模块中,SpringFactoriesLoader 收集到文件中的类全名并返回一个类全名的数组,返回的类全名通过反射被实例化,就形成了具体的工厂实例,工厂实例来生成组件具体需要的...我们知道,如果获取到类信息,spring 自然可以通过类加载器将类加载到 jvm 中,现在我们已经通过 spring-boot 的 starter 依赖方式依赖了我们需要的组件,那么这些组建的类信息在
该方法在springboot启动流程——bean实例化前被执行,返回要实例化的类信息列表; 如果获取到类信息,spring可以通过类加载器将类加载到jvm中,现在我们已经通过spring-boot的starter...)的bean定义(如Java Config@Configuration配置)都加载到当前SpringBoot创建并使用的IoC容器。...,方法会根据指定的classLoader,加载该类加器搜索路径下的指定文件,即spring.factories文件; 传入的工厂类为接口,而文件中对应的类则是接口的实现类,或最终作为实现类。...org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类 上图就是从SpringBoot...对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器 SpringBoot
和classLoader,即需要传入上图中的工厂类名称和对应的类加载器,方法会根据指定的classLoader,加载该类加器搜索路径下的指定文件,即spring.factories文件,传入的工厂类为接口...,而文件中对应的类则是接口的实现类,或最终作为实现类,所以文件中一般为如下图这种一对多的类名集合,获取到这些实现类的类名后,loadFactoryNames方法返回类名集合,方法调用方得到这些集合后,再通过反射获取这些类的类对象...我们知道,如果获取到类信息,spring自然可以通过类加载器将类加载到jvm中,现在我们已经通过spring-boot的starter依赖方式依赖了我们需要的组件,那么这些组建的类信息在select方法中也是可以被获取到的...该方法中的getCandidateConfigurations方法,通过方法注释了解到,其返回一个自动配置类的类名列表,方法调用了loadFactoryNames方法,查看该方法 ?...进入org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration中,主要看一下类头 ?
,加载该类加器搜索路径下的指定文件,即spring.factories文件,传入的工厂类为接口,而文件中对应的类则是接口的实现类,或最终作为实现类,所以文件中一般为如下图这种一对多的类名集合,获取到这些实现类的类名后...,loadFactoryNames方法返回类名集合,方法调用方得到这些集合后,再通过反射获取这些类的类对象、构造方法,最终生成实例 工厂接口与其若干实现类接口名称 下图有助于我们形象理解自动配置流程...文件,自动配置模块中,SpringFactoriesLoader收集到文件中的类全名并返回一个类全名的数组,返回的类全名通过反射被实例化,就形成了具体的工厂实例,工厂实例来生成组件具体需要的bean。...我们知道,如果获取到类信息,spring自然可以通过类加载器将类加载到jvm中,现在我们已经通过spring-boot的starter依赖方式依赖了我们需要的组件,那么这些组建的类信息在select方法中也是可以被获取到的...,不要急我们继续向下分析 该方法中的getCandidateConfigurations方法,通过方法注释了解到,其返回一个自动配置类的类名列表,方法调用了loadFactoryNames方法,查看该方法
这年头基本上都是使用Spring Boot开发,然后都知道在项目中会有个application.properties配置文件(也有的是application.yaml,反正就是用来保存我们的一些配置信息...store(OutputStream out, String comments) :将此Properties表中的此属性列表(键和元素对)以适合使用load(InputStream)方法加载到Properties...第四种方式 我们在实际开发中,基本上都是离不开Spring了,所以,接下来我们使用Spring中的 ClassPathResource读取配置文件。...java.util.ResourceBundle.getBundle(String baseName) 方法获取使用指定的基本名称,不需要文件后缀名,默认的语言环境和调用者的类加载器获取资源包。...另外,还有我上一次给大家分享的:Spring Boot读取配置4种方式,建议收藏! 最后就是org.springframework.core.env.Environment方式读取,这个下次再分享。
前言 自从用了Spring Boot,个人最喜欢的就是Spring Boot的配置文件了,和Spring比起,Spring Boot更加灵活,修改的某些配置也是更加得心应手。...今天这篇文章就来介绍一下Spring Boot的配置文件的语法以及如何从配置文件中取值。...该注解中有一个属性prefix,用于指定获配置的前缀,毕竟配置文件中的属性很多,也有很多重名的,必须用一个前缀来区分下。 该注解可以标注在类上也可以标注在方法上,这也注定了它有两种获取值的方式。...@Value @Value这个注解估计很熟悉了,Spring中从属性取值的注解,支持SPEL表达式,不支持复杂的数据类型,比如List。...只需要在配置类上标注@PropertySource并指定你自定义的配置文件即可完成。
要包含 devtools 支持,需要将 spring-boot-devtools 模块依赖添加到项目构建中,如 Maven 和 Gradle 的以下列表所示: Maven 依赖: 类路径更新的方式取决于您使用的IDE。在 Eclipse 中,保存修改后的文件会导致更新类路径并触发重新启动。...重新启动 vs 重新加载 Spring Boot 提供的重启技术通过使用两个类加载器来工作。不改变的类(例如来自第三方jar的类)被加载到baseclassloader 中。...我们正在开发的类会加载到 restart classloader 中。当应用程序重新启动时,restartclassloader 将被丢弃并创建一个新类。...监控类路径资源的变动,但如果我们想更改不在类路径中的文件时重新启动或重新加载应用程序,该怎么办呢?
,那就是 spring-boot-starter-web,在前面第一篇的文章中初始化组件时,我们就选择了 Spring Web 组件,自然这个依赖就是用来实现 Web 功能的 进入 spring-boot-starter-web...这两个组件大家应该还是很熟悉的 @Configuration:指定当前类是 spring 的一个配置类,相当于 XML中的 applicationContext.xml 文件 @Component :说明这个类也是交给...Spring管理,也能看出启动类本身也是Spring中的一个组件而已,用来启动应用 B:@ComponentScan @ComponentScan的功能其实是自动扫描并加载符合条件的组件(比如 @Component...和 @Controller 等)或者bean定义,并把这些bean定义加载到IoC容器中,在 XML 中相当于: 类名org.springframework.boot.autoconfigure.EnableAutoConfiguration 作为查找的Key,获取对应的一组@Configuration类 这些配置类具体是如何做的我们这里不深究
● 应 用 程 序 类 加 载 器 ( Application ClassLoader ) :加 载classpath上指定的类库。...探索Spring Boot的ClassLoaderSpring Boot的内置Tomcat是如何加载到我们的项目中的呢?...Spring Boot 将 jar 包 中 的 Main-Class 进 行 了 替 换 , 换 成 了JarLauncher,并增加了一个Start-Class参数,这个参数对应的类才是真正的业务Main...ClassLoader挂载到Spring Boot的主线程 Context ClassLoader 。...启动过程中通过扫描将资源对象加载到Spring IoC容器中。
Bean都加载到IoC容器中。...创建并使用的IoC容器中,就像一个收割机一样,全文搜索配置类: 我们可以看下AutoConfigurationImportSelector.class类的部分源码: public class AutoConfigurationImportSelector...都非常特殊,为Java类的完整类名和包名,(Fully qualified name),比如: com.wbs.service.DemoService = com.wbs.service.impl.DemoServiceImpl...org.springframework.boot.autoconfigure.EnableAutoConfiguration作为key来获取一组对应的@Configuration类: org.springframework.boot.autoconfigure.EnableAutoConfiguration...和@Repository)或Bean定义,最终将这些Bean定义加载到当前使用的IoC容器中。
领取专属 10元无门槛券
手把手带您无忧上云