Vårfabrikker | vårfabrikker | SPI

Spring Factories Spring



Denne artikkelen er gjengitt fra: https://blog.csdn.net/lvoyee/article/details/82017057

Det er en veldig frakoblet forlengelsesmekanisme i Spring Boot: Spring Factories. Denne utvidelsesmekanismen er faktisk modellert etter SPI-utvidelsesmekanismen i Java.



Hva er SPI-mekanismen

Det fulle navnet på SPI er Service Provider Interface. De fleste utviklere er kanskje ikke kjent, fordi dette er for produsenter eller plugin-moduler. Det er en mer detaljert introduksjon i java.util.ServiceLoader-dokumentasjonen.
En kort oppsummering av ideene til Java SPI-mekanismen. De forskjellige modulene som er abstraherte i systemet vårt, har ofte mange forskjellige implementeringer, for eksempel loggmodulen, xml-parseringsmodulen og jdbc-modulen. I objektorientert design anbefaler vi generelt grensesnittbasert programmering mellom moduler, uten å implementere hardkodede implementeringsklasser mellom moduler. Når den spesifikke implementeringsklassen er involvert i koden, bryter den det pluggbare prinsippet. Hvis du trenger å erstatte en implementering, må du endre koden. For å innse at det ikke kan angis dynamisk i programmet når modulen er samlet, krever dette en tjenesteoppdagingsmekanisme.
java SPI gir en slik mekanisme: en mekanisme for å finne implementering av tjenester for et grensesnitt. Noe som ligner ideen til IOC, er å flytte monteringskontrollen utenfor programmet, og denne mekanismen er spesielt viktig i modulutformingen.



SPI-mekanisme i Spring Boot

Det er også en lastemekanisme som ligner på Java SPI om våren. Den konfigurerer navnet på implementeringsklassen til grensesnittet i META-INF / spring.factories-filen, og deretter leser og instantierer disse konfigurasjonsfilene i programmet.
Denne tilpassede SPI-mekanismen er grunnlaget for implementering av Spring Boot Starter.



våren. fabrikker

Vårfabrikkens implementeringsprinsipp

SpringFactoriesLoader-klassen er definert i vårkjernepakken. Denne klassen implementerer funksjonen for å hente META-INF / spring.factories-filen og få konfigurasjonen av det angitte grensesnittet. To eksterne metoder er definert i denne klassen:



loadFactories får en forekomst av implementeringsklassen i henhold til grensesnittklassen, denne metoden returnerer en liste over objekter.
loadFactoryNames får navnet på grensesnittklassen i henhold til grensesnittet. Denne metoden returnerer en liste over klassenavn.
Nøkkelen til de to ovennevnte metodene er å hente spring.factories-filen fra den angitte ClassLoader og analysere for å få en liste over klassenavn. Den spesifikke koden er som følger

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) } }

Fra koden kan vi vite at spring.factories-filen i denne metoden under alle jar-pakker i hele ClassLoader vil bli krysset. Med andre ord, vi kan konfigurere spring.factories-filen i vår egen krukke, som ikke vil påvirke konfigurasjonen til andre steder, og den vil heller ikke bli overskrevet av andres konfigurasjon.

Spring.fabrikkene oppnås gjennom eiendomsanalyse, slik at innholdet i skrivefilen installeres og konfigureres på følgende måte:

com.xxx.interface=com.xxx.classname

Hvis du vil konfigurere flere implementeringsklasser for et grensesnitt, kan du bruke ',' til å dele det.

spring.factories-fil i vår-boot-pakke

Spring.factories-filen finnes i mange pakker med Spring Boot. Følgende er spring.factories-filen i vår-boot-pakken

# 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,

I det daglige arbeidet kan det hende vi trenger å implementere noen SDK eller Spring Boot Starter som skal brukes av andre,
Vi kan bruke fabrikkmekanismen. Med Factories-mekanismen kan SDK eller Starter brukes med liten eller ingen konfigurasjon, bare ved å introdusere jar-pakken vår i tjenesten.


lenke: https://www.jianshu.com/p/00e49c607fa1
Kilde: Kort bok
Opphavsretten tilhører forfatteren. For kommersiell reproduksjon, vennligst kontakt forfatteren for autorisasjon, og for ikke-kommersiell reproduksjon, vennligst oppgi kilden.