Rumah > Java > javaTutorial > teks badan

SpringBoot spring.factories memuatkan analisis kod sumber pemasaan

WBOY
Lepaskan: 2023-05-17 21:31:04
ke hadapan
1362 orang telah melayarinya

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();
	}
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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;
	}
Salin selepas log masuk

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;
	}
Salin selepas log masuk
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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan