为什么有的Maven包的META |
您所在的位置:网站首页 › factories的用法 › 为什么有的Maven包的META |
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.CachesEndpointAutoConfigurationspring拿到要自动加载的类的全路径之后,会使用ConfigurationClassParser根据条件注解判断@Conditional @ConditionalOnBean等尝试解析成spring bean,解析过程这里不详细解释。 加载接口对应的配置类List reporters = SpringFactoriesLoader.loadFactories(FailureAnalysisReporter.class,classLoader);对于如下spring.factories配置文件 # FailureAnalysisReporters org.springframework.boot.diagnostics.FailureAnalysisReporter=\ org.springframework.boot.diagnostics.LoggingFailureAnalysisReporterSpringFactoriesLoader内部会自动加载并实例化LoggingFailureAnalysisReporter,返回的reporters作为对应类的实例,方便后续调用。 Spring这种灵活的SPI机制为我们扩展spring生命周期的各个阶段提供了极大的便利,现在就用起来吧~ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |