SPRINGBOOT启动原理(基于2.x版本)(二)-SpringFactoriesLoader

简介: SPRINGBOOT启动原理(基于2.x版本)(二)-SpringFactoriesLoader

版本


版本:3.0.1


上一篇:SPRINGBOOT启动原理(基于3.x版本)(一)


SpringFactoriesLoader


引入


从上一篇可以看到,代码中频繁地使用到了SpringFactoriesLoader这个类,大致能看出来是为了拿类的,今天我们详细的研究一下。


介绍


看一下官网的介绍:


General purpose factory loading mechanism for internal use within the framework.

SpringFactoriesLoader loads and instantiates factories of a given type from “META-INF/spring.factories” files which may be present in multiple JAR files in the classpath. The spring.factories file must be in Properties format, where the key is the fully qualified name of the interface or abstract class, and the value is a comma-separated list of implementation class names. For example:


example.MyService=example.MyServiceImpl1,example.MyServiceImpl2
where example.MyService is the name of the interface, and MyServiceImpl1 and MyServiceImpl2 are two implementations.


翻译一下:


用于框架内部使用的通用工厂加载机制。


SpringFactoriesLoader从“META-INF/spring.factories”文件加载和实例化给定类型的工厂,这些文件可能存在于类路径中的多个 JAR 文件中。该spring.factories 文件必须采用Properties格式,其中key是接口或抽象类的完全限定名称,value为相应的实现类,当存在多个实现类时,用“,”进行分割。


然后举了个例子


代码


最常用到的方法就是


SpringFactoriesLoader.loadFactories


我们自己写一个来试一试,先看下目录结构:



具体代码:


public interface Fruit {
    void Color();
}
public class Banana implements Fruit{
    public Banana(){
        System.out.println("A Banana");
    }
    @Override
    public void Color() {
        System.out.println("yello");
    }
}
public class Orange implements Fruit{
    public Orange(){
        System.out.println("An Orange");
    }
    @Override
    public void Color() {
        System.out.println("orange");
    }
}


spring.factories


com.example.mavendemo.loadertest.Fruit=com.example.mavendemo.loadertest.Banana,com.example.mavendemo.loadertest.Orange


测试方法:


@SpringBootTest
class FruitTest {
    @Test
    public void testLoadFactoryNames() {
        //获取所有META-INF/spring.factories中的value值
        List<String> applicationContextInitializers = SpringFactoriesLoader.loadFactoryNames(Fruit.class, ClassUtils.getDefaultClassLoader());
        for (String applicationContextInitializer : applicationContextInitializers) {
            System.out.println(applicationContextInitializer);
        }
    }
    @Test
    public void testLoadFactories() {
        //实例化所有在META-INF/spring.factories配置的且实现BeanInfoFactory接口的类
        List<Fruit> fruitFactories = SpringFactoriesLoader.loadFactories(Fruit.class, ClassUtils.getDefaultClassLoader());
        for (Fruit fruit : fruitFactories) {
            System.out.println(fruitFactories);
        }
    }
}


参考


Spring SpringFactoriesLoader

目录
相关文章
|
11天前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
3月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
101 0
|
9天前
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
|
2月前
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
22天前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
|
2月前
|
缓存 前端开发 JavaScript
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
这篇文章介绍了一个使用SpringBoot+Vue开发的前后端分离商城系统,包括技术架构、开发环境、实现的功能以及项目截图,并展示了普通用户和商家端的功能界面。
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
|
2月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
3月前
|
SQL Java 数据库连接
springboot~mybatis-pagehelper原理与使用
【7月更文挑战第15天】MyBatis-PageHelper是用于MyBatis的分页插件,基于MyBatis的拦截器机制实现。它通过在SQL执行前动态修改SQL语句添加LIMIT子句以支持分页。使用时需在`pom.xml`添加依赖并配置方言等参数。示例代码: PageHelper.startPage(2, 10); List&lt;User&gt; users = userMapper.getAllUsers(); PageInfo&lt;User&gt; pageInfo = new PageInfo&lt;&gt;(users); 这使得分页查询变得简单且能获取总记录数等信息。
|
2月前
|
Java
SpringBoot和SpringCloud对应版本
SpringBoot和SpringCloud对应版本
73 0
|
3月前
|
Java Maven
SpringBoot第一次导入项目,Maven依赖全爆红,该怎样解决,idea2019.3版本,必须用application2.7.6或者以下
SpringBoot第一次导入项目,Maven依赖全爆红,该怎样解决,idea2019.3版本,必须用application2.7.6或者以下
下一篇
无影云桌面