spring.factories 的妙用

本文探讨了Spring Boot中的spring.factories文件在自动配置中的作用,解释了为何在已有@Configuration注解的情况下仍需要它。内容包括:Spring Boot扩展机制、SPI服务发现原理、SpringFactoriesLoader的工作方式,以及如何利用spring.factories文件注册非项目包内的bean到Spring容器。
摘要由CSDN通过智能技术生成

现象

在阅读 Spring-Boot 相关源码时,常常见到 spring.factories 文件,里面写了自动配置(AutoConfiguration)相关的类名,因此产生了一个疑问:“明明自动配置的类已经打上了 @Configuration 的注解,为什么还要写 spring.factories 文件?

用过 Spring Boot 的都知道

@ComponentScan 注解的作用是扫描 @SpringBootApplication 所在的 Application 类所在的包(basepackage)下所有的 @component 注解(或拓展了 @component 的注解)标记的 bean,并注册到 spring 容器中。

那么问题来了

在 Spring Boot 项目中,如果你想要被 Spring 容器管理的 bean 不在 Spring Boot 包扫描路径下,怎么办?

解决 Spring Boot 中不能被默认路径扫描的配置类的方式,有 2 种:

(1)在 Spring Boot 主类上使用 @Import 注解
(2)使用 spring.factories 文件

以下是对 使用 spring.factories 文件的简单理解

Spring Boot 的扩展机制之 Spring Factories

Spring Boot 中有一种非常解耦的扩展机制:Spring Factories。这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的。

什么是 SPI 机制?

SPI 的全名为 Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。

简单的总结下 java SPI 机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。

java SPI 就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。

Spring Boot 中的 SPI 机制

在 Spring 中也有一种类似与 Java SPI 的加载机制。它在 resources/META-INF/spring.factories 文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。

这种自定义的SPI机制是 Spring Boot Starter 实现的基础。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: spring.factories可以用来注册到Spring容器中的bean,以便在应用程序启动时自动配置。例如,当spring.factories文件包含以下条目时,将自动注册com.example.MyBean到Spring容器中: org.springframework.context.annotation.Configuration=com.example.MyBean ### 回答2: spring.factoriesSpring框架中的一个重要文件,用于定义自动装配的配置。其作用类似于META-INF/services目录下的Java SPI机制,用于自动扫描并加载Spring应用程序中的配置文件。 具体来说,spring.factories文件是在jar包的META-INF目录下,在文件中可以定义各个模块的配置类。下面是一个spring.factories文件的示例: ``` # Auto Configuration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.myapp.config.MyConfig # Custom Bean Definition org.springframework.context.annotation.ImportSelector=\ com.example.myapp.config.CustomImportSelector ``` 上面的示例中,定义了两个关键的配置项。 第一个配置项`org.springframework.boot.autoconfigure.EnableAutoConfiguration`指定了一个自动装配配置类`com.example.myapp.config.MyConfig`。当Spring应用程序启动时,该配置类会被自动加载,其中可以定义一些自动装配的规则和@Bean注解的类。 第二个配置项`org.springframework.context.annotation.ImportSelector`指定了一个自定义的ImportSelector类`com.example.myapp.config.CustomImportSelector`。ImportSelector是一个接口,实现了该接口的类可以在该接口方法中动态地选择需要导入的配置类。通过在spring.factories文件中指定ImportSelector类,可以灵活地导入和组合各种配置类。 总结来说,spring.factories文件通过定义各个模块的配置项,实现了Spring在应用启动时自动加载和组合配置类的功能。这样可以方便地进行自动装配和配置的管理,提高了开发效率和灵活性。 ### 回答3: spring.factoriesSpring Boot框架中的一个配置文件,用于自动装配和加载Spring Boot提供的各种功能。 首先,我们需要新建一个META-INF/spring.factories文件,并将其放置在classpath下的resources目录中。然后在spring.factories文件中,可以通过键值对的形式配置Spring Boot的自动装配类。 一个使用spring.factories的例子是配置自定义的Starter。在Spring Boot中,Starter是一种约定的依赖,它可以自动带入所需的依赖和配置,以快速启动一个特定的功能。例如,假设我们打算开发一个自定义的邮件功能,我们可以创建一个新的Starter项目。 首先,我们在Starter项目的resources目录下新建META-INF/spring.factories文件,并在其中配置自动装配类的全限定名,例如: org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.custommail.CustomMailAutoConfiguration 在CustomMailAutoConfiguration类中,我们可以配置自定义的邮件相关的bean、属性等。通过在spring.factories中配置CustomMailAutoConfiguration的自动装配,Spring Boot会自动将相应的bean和配置导入到应用程序中,方便我们直接使用。 另一个例子是配置自定义的自动配置类。自动配置类是Spring Boot中的一个重要概念,用于自动装配和配置各种功能。我们可以通过在spring.factories文件中配置自定义的自动配置类,实现快速实现自定义功能的目的。 总之,spring.factoriesSpring Boot中用于配置自动装配类的配置文件。通过在其中配置相应的类,我们可以方便地实现自定义的Starter和自动配置,提供更多的扩展和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值