春の工場| spring.factories | SPI



Spring Factories Spring



この記事は以下から複製されています: https://blog.csdn.net/lvoyee/article/details/82017057

Spring Bootには、非常に分離された拡張メカニズムがあります:SpringFactory。この拡張メカニズムは、実際にはJavaのSPI拡張メカニズムをモデルにしています。



SPIメカニズムとは何ですか

SPIのフルネームはServiceProviderInterfaceです。これはメーカーまたはプラグイン向けであるため、ほとんどの開発者はなじみがないかもしれません。 java.util.ServiceLoaderのドキュメントに詳細な紹介があります。
JavaSPIメカニズムのアイデアの簡単な要約。システムで抽象化されたさまざまなモジュールには、多くの場合、logモジュール、xml解析モジュール、jdbcモジュールなどのさまざまな実装があります。オブジェクト指向設計では、通常、モジュール間にハードコードされた実装クラスを実装せずに、モジュール間のインターフェイスベースのプログラミングをお勧めします。特定の実装クラスがコードに含まれると、プラグイン可能な原則に違反します。実装を置き換える必要がある場合は、コードを変更する必要があります。モジュールの組み立て時にプログラムで動的に表示できないことを実現するには、サービス検出メカニズムが必要です。
java SPIは、そのようなメカニズムを提供します。インターフェースのサービス実装を見つけるためのメカニズムです。 IOCの考え方にいくぶん似ていますが、アセンブリコントロールをプログラムの外に移動することです。このメカニズムは、モジュラー設計で特に重要です。

SpringBootのSPIメカニズム

SpringにはJavaSPIと同様のロードメカニズムもあります。 META-INF / spring.factoriesファイルでインターフェイスの実装クラス名を構成し、プログラムでこれらの構成ファイルを読み取ってインスタンス化します。
このカスタムSPIメカニズムは、Spring BootStarter実装の基盤です。



spring.factories

SpringFactoryの実装原則

SpringFactoriesLoaderクラスは、spring-coreパッケージで定義されています。このクラスは、META-INF / spring.factoriesファイルを取得し、指定されたインターフェースの構成を取得する機能を実装します。このクラスでは、2つの外部メソッドが定義されています。



loadFactoriesは、インターフェイスクラスに従って実装クラスのインスタンスを取得します。このメソッドは、オブジェクトのリストを返します。
loadFactoryNamesは、インターフェイスに従ってインターフェイスクラスの名前を取得します。このメソッドは、クラス名のリストを返します。
上記の2つのメソッドの鍵は、指定されたClassLoaderからspring.factoriesファイルを取得し、解析してクラス名のリストを取得することです。具体的なコードは次のとおりです

private static Map loadSpringFactories(@Nullable ClassLoader classLoader) { MultiValueMap result = cache.get(classLoader) if (result != null) { return result } try { Enumeration urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)) result = new LinkedMultiValueMap() while (urls.hasMoreElements()) { URL url = urls.nextElement() UrlResource resource = new UrlResource(url) Properties properties = PropertiesLoaderUtils.loadProperties(resource) for (Map.Entry entry : properties.entrySet()) { String factoryClassName = ((String) entry.getKey()).trim() for (String factoryName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) { result.add(factoryClassName, factoryName.trim()) } } } cache.put(classLoader, result) return result } catch (IOException ex) { throw new IllegalArgumentException('Unable to load factories from location [' + FACTORIES_RESOURCE_LOCATION + ']', ex) } }

コードから、このメソッドでは、ClassLoader全体のすべてのjarパッケージの下にあるspring.factoriesファイルがトラバースされることがわかります。つまり、spring.factoriesファイルを独自のjarで構成できます。これは、他の場所の構成に影響を与えたり、他の場所の構成によって上書きされたりすることはありません。

spring.factoriesはプロパティ分析によって取得されるため、書き込みファイルのコンテンツは次の方法でインストールおよび構成されます。

com.xxx.interface=com.xxx.classname

インターフェイスに複数の実装クラスを構成する場合は、「、」を使用してインターフェイスを分割できます。

spring-bootパッケージのspring.factoriesファイル

spring.factoriesファイルは、SpringBootの多くのパッケージに含まれています。以下は、spring-bootパッケージのspring.factoriesファイルです。

# PropertySource Loaders org.springframework.boot.env.PropertySourceLoader= org.springframework.boot.env.PropertiesPropertySourceLoader, org.springframework.boot.env.YamlPropertySourceLoader # Run Listeners org.springframework.boot.SpringApplicationRunListener= org.springframework.boot.context.event.EventPublishingRunListener # Error Reporters org.springframework.boot.SpringBootExceptionReporter= org.springframework.boot.diagnostics.FailureAnalyzers # Application Context Initializers org.springframework.context.ApplicationContextInitializer= org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer, org.springframework.boot.context.ContextIdApplicationContextInitializer, org.springframework.boot.context.config.DelegatingApplicationContextInitializer, org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer # Application Listeners org.springframework.context.ApplicationListener= org.springframework.boot.ClearCachesApplicationListener, org.springframework.boot.builder.ParentContextCloserApplicationListener, org.springframework.boot.context.FileEncodingApplicationListener, org.springframework.boot.context.config.AnsiOutputApplicationListener, org.springframework.boot.context.config.ConfigFileApplicationListener, org.springframework.boot.context.config.DelegatingApplicationListener, org.springframework.boot.context.logging.ClasspathLoggingApplicationListener, org.springframework.boot.context.logging.LoggingApplicationListener, org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener # Environment Post Processors org.springframework.boot.env.EnvironmentPostProcessor= org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor, org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor, org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor # Failure Analyzers org.springframework.boot.diagnostics.FailureAnalyzer= org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.BindValidationFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.UnboundConfigurationPropertyFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyNameFailureAnalyzer, org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyValueFailureAnalyzer # FailureAnalysisReporters org.springframework.boot.diagnostics.FailureAnalysisReporter= org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter #autoconfigure org.springframework.boot.autoconfigure.EnableAutoConfiguration= org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration, org.springframework.boot.autoconfigure.aop.AopAutoConfiguration, org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration, org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,

日常業務では、他の人が使用するSDKまたはSpring BootStarterを実装する必要がある場合があります。
Factoryメカニズムを使用できます。 Factoryメカニズムを使用すると、jarパッケージをサービスに導入するだけで、SDKまたはStarterをほとんどまたはまったく構成せずに使用できます。


リンク:https://www.jianshu.com/p/00e49c607fa1
出典:ブリーフブック
著作権は作者に帰属します。商業的複製の場合は著者に連絡して許可を求め、非商業的複製の場合は出典を示してください。