为什么有的Maven包的META

您所在的位置:网站首页 factories的用法 为什么有的Maven包的META

为什么有的Maven包的META

2023-03-09 18:31| 来源: 网络整理| 查看: 265

META-INF/spring.factories是spring spi指定加载的文件。

SpringFactoriesLoader负责加载META-INF/spring.factories属性配置文件并解析。

SpringFactoriesLoader作为spring framework在3.2版本引入的SPI机制,在spring框架内部一直默默无闻,直至spring boot和spring cloud的出现,SpringFactoriesLoader作为spring全家桶最重要的扩展之一,开始大放异彩。

SPI(Service Provider Interface),是一种服务提供发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类,在运行时给程序提供了良好的拓展功能。

每一个伟大的框架背后,总有一位默默付出的SPI:)。java中有ServiceLoader,Spring中有SpringFactoriesLoader,Dubbo中有ExtensionLoader。这些SPI机制对扩展程序功能至关重要,可以说理解SPI是每一个javaer必备的技能。

SpringFactoriesLoader把META-INF/spring.factories作为properties文件解析

Properties properties = PropertiesLoaderUtils.loadProperties(resource);

SpringFactoriesLoader有两种用法:

加载注解对应的配置类(这里不要求加载的类和对应的注解存在继承关系)@EnableAutoConfiguration作为spring boot中自动装配的核心注解,在spring.factories中配置格式如下org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.actuate.autoconfigure.amqp.RabbitHealthContributorAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.audit.AuditAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.audit.AuditEventsEndpointAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.availability.AvailabilityHealthContributorAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.availability.AvailabilityProbesAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.beans.BeansEndpointAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.cache.CachesEndpointAutoConfiguration

调用方式如下:

List autoConfiguration = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, Thread.currentThread().getContextClassLoader());

SpringFactoriesLoader会自动扫描并加载类路径下的所有spring.factories文件,过滤出所有以@EnableAutoConfiguration类路径为属性key的url并返回,这里返回的autoConfiguration为:

org.springframework.boot.actuate.autoconfigure.amqp.RabbitHealthContributorAutoConfiguration org.springframework.boot.actuate.autoconfigure.audit.AuditAutoConfiguration org.springframework.boot.actuate.autoconfigure.audit.AuditEventsEndpointAutoConfiguration org.springframework.boot.actuate.autoconfigure.availability.AvailabilityHealthContributorAutoConfiguration org.springframework.boot.actuate.autoconfigure.availability.AvailabilityProbesAutoConfiguration org.springframework.boot.actuate.autoconfigure.beans.BeansEndpointAutoConfiguration org.springframework.boot.actuate.autoconfigure.cache.CachesEndpointAutoConfiguration

spring拿到要自动加载的类的全路径之后,会使用ConfigurationClassParser根据条件注解判断@Conditional @ConditionalOnBean等尝试解析成spring bean,解析过程这里不详细解释。

加载接口对应的配置类List reporters = SpringFactoriesLoader.loadFactories(FailureAnalysisReporter.class,classLoader);

对于如下spring.factories配置文件

# FailureAnalysisReporters org.springframework.boot.diagnostics.FailureAnalysisReporter=\ org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter

SpringFactoriesLoader内部会自动加载并实例化LoggingFailureAnalysisReporter,返回的reporters作为对应类的实例,方便后续调用。

Spring这种灵活的SPI机制为我们扩展spring生命周期的各个阶段提供了极大的便利,现在就用起来吧~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3