Rumah  >  Artikel  >  Java  >  SpringBoot spring.factories memuatkan analisis kod sumber pemasaan

SpringBoot spring.factories memuatkan analisis kod sumber pemasaan

WBOY
WBOYke hadapan
2023-05-17 21:31:041342semak imbas

Peranan spring.factories

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

Mulakan Aplikasi Spring dan lihat kaedah pembinaan

	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.factoriesjar

ApplicationContextInitializerMETA-INF/spring.factoriesspring-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 SpringBoot spring.factories memuatkan analisis kod sumber pemasaan

spring-boot-autoconfigure-2.1.0.RELEASE.jarKemudian 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

SpringBoot spring.factories memuatkan analisis kod sumber pemasaan

Anda boleh melihat bahawa bukan sahaja kelas contoh

dihuraikan dan disimpan apabila kelas lain perlu dihuraikan , mereka boleh diambil terus dari ingatan;

SpringBoot spring.factories memuatkan analisis kod sumber pemasaanSelepas 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

; maka ia akan dijadikan instantiated dan kelas pelaksanaan yang sepadan ditemui di atas;

	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;

createSpringFactoriesInstancesTerdapat 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

Sebagai contoh, kita juga boleh menulis kelas pelaksanaan antara muka kelas

.

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam