Ini adalah serupa dengan fungsi SPI dalam Java Apabila SpringBoot bermula, ia akan membaca fail META-INF/spring.factories
di bawah semua pakej jar; Kelas pelaksanaan yang sepadan dengan antara muka/kelas abstrak semuanya dipetakan bersama-sama, dan kelas pelaksanaan yang sepadan boleh dijadikan instantiated apabila diperlukan
Mari kita analisis kod sumber untuk melihat senario penggunaan
spring.factories
Analisis kod sumber
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); this.webApplicationType = WebApplicationType.deduceFromClasspath(); setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass(); }
Kaedah
digunakan untuk mendapatkan contoh kelas yang ditentukan dalam Spring dan pemerolehan adalah berdasarkan bacaan keseluruhan projek Laluan fail ialah kandungan dalam yang membuat instantiat kelas contoh yang sepadan; Kemudian cari fail getSpringFactoriesInstances( ApplicationContextInitializer.class)
, kemudian kami dapati fail ini dalam pakej META-INF/spring.factories
jar
ApplicationContextInitializer
META-INF/spring.factories
spring-boot:2.1.0
dan baca bahawa kelas pelaksanaan yang perlu digunakan ialah
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\ org.springframework.boot.context.ContextIdApplicationContextInitializer,\ org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\ org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer
Dan juga mendapati fail ini dalam
spring-boot-autoconfigure-2.1.0.RELEASE.jar
Kemudian kedua-dua kelas pelaksanaan dalam fail itu juga akan dijadikan instantiated ditambah dengan 4 di atas, terdapat 6
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\ org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
Anda boleh melihat bahawa bukan sahaja kelas contoh
dihuraikan dan disimpan apabila kelas lain perlu dihuraikan , mereka boleh diambil terus dari ingatan;Selepas proses di atas mendapat kelas instance, langkah seterusnya ialah proses instantiation
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) { ClassLoader classLoader = getClassLoader(); // Use names and ensure unique to protect against duplicates Set<String> names = new LinkedHashSet<>( SpringFactoriesLoader.loadFactoryNames(type, classLoader)); List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names); AnnotationAwareOrderComparator.sort(instances); return instances; }
Kaedahorg.springframework.context.ApplicationContextInitializer
Ia adalah proses mencipta contoh; anda boleh melihat bahawa kelas antara muka yang sepadan dihantar dalam
private <T> List<T> createSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, ClassLoader classLoader, Object[] args, Set<String> names) { List<T> instances = new ArrayList<>(names.size()); for (String name : names) { try { Class<?> instanceClass = ClassUtils.forName(name, classLoader); Assert.isAssignable(type, instanceClass); Constructor<?> constructor = instanceClass .getDeclaredConstructor(parameterTypes); T instance = (T) BeanUtils.instantiateClass(constructor, args); instances.add(instance); } catch (Throwable ex) { throw new IllegalArgumentException( "Cannot instantiate " + type + " : " + name, ex); } } return instances; }Jika tiada apa-apa dalam proses instantiation Apa yang memerlukan khas penjelasan;
createSpringFactoriesInstances
Terdapat kaedah org.springframework.context.ApplicationContextInitializer
di atas yang digunakan untuk mengisih semua keadaan; kelas pelaksanaan perlu melaksanakan antara muka
Penggunaan
Selepas mengetahui penggunaan AnnotationAwareOrderComparator.sort(instances);
, kita boleh menggunakan ciri ini untuk mencapai tujuan kita sendiri; Ordered
Atas ialah kandungan terperinci SpringBoot spring.factories memuatkan analisis kod sumber pemasaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!