springboot如何实现自动装配源码解读
SpringBoot自动装配
最重要的注解@SpringBootApplication
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters={@Filter(type=FilterType.CUSTOM,classes=TypeExcludeFilter.class),
		@Filter(type=FilterType.CUSTOM,classes=AutoConfigurationExcludeFilter.class)})
public@interfaceSpringBootApplication{
	@AliasFor(annotation=EnableAutoConfiguration.class)
	Class>[]exclude()default{};
	@AliasFor(annotation=EnableAutoConfiguration.class)
	String[]excludeName()default{};
	@AliasFor(annotation=ComponentScan.class,attribute="basePackages")
	String[]scanBasePackages()default{};
	@AliasFor(annotation=ComponentScan.class,attribute="basePackageClasses")
	Class>[]scanBasePackageClasses()default{};
	@AliasFor(annotation=Configuration.class)
	booleanproxyBeanMethods()defaulttrue;
}
EnableAutoConfiguration
是实现自动装配的核心注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public@interfaceEnableAutoConfiguration{
}
getAutoConfigurationMetadata()
@Override
publicvoidprocess(AnnotationMetadataannotationMetadata,DeferredImportSelectordeferredImportSelector){
	Assert.state(deferredImportSelectorinstanceofAutoConfigurationImportSelector,
			()->String.format("Only%simplementationsaresupported,got%s",
					AutoConfigurationImportSelector.class.getSimpleName(),
					deferredImportSelector.getClass().getName()));
	AutoConfigurationEntryautoConfigurationEntry=((AutoConfigurationImportSelector)deferredImportSelector)
			.getAutoConfigurationEntry(
					//加载配置元数据
					getAutoConfigurationMetadata(),annotationMetadata);
	this.autoConfigurationEntries.add(autoConfigurationEntry);
	for(StringimportClassName:autoConfigurationEntry.getConfigurations()){
		this.entries.putIfAbsent(importClassName,annotationMetadata);
	}
}
privateAutoConfigurationMetadatagetAutoConfigurationMetadata(){
	if(this.autoConfigurationMetadata==null){
		//加载配置信息
		this.autoConfigurationMetadata=AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
	}
	returnthis.autoConfigurationMetadata;
}
staticAutoConfigurationMetadataloadMetadata(ClassLoaderclassLoader,Stringpath){
	try{
	//获取资源路径
		Enumerationurls=(classLoader!=null)?classLoader.getResources(path)
				:ClassLoader.getSystemResources(path);
		Propertiesproperties=newProperties();
		while(urls.hasMoreElements()){
			properties.putAll(PropertiesLoaderUtils.loadProperties(newUrlResource(urls.nextElement())));
		}
		returnloadMetadata(properties);
	}
	catch(IOExceptionex){
		thrownewIllegalArgumentException("Unabletoload@ConditionalOnClasslocation["+path+"]",ex);
	}
}
protectedstaticfinalStringPATH="META-INF/spring-autoconfigure-metadata.properties"; 
注意:这个文件在target编译后的文件夹中
自动装配
spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
该文件内存有:
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,\
EnableConfigurationProperties
@ConfigurationProperties(prefix="spring.redis")
publicclassRedisProperties{
	/**
	*Databaseindexusedbytheconnectionfactory.
	*/
	privateintdatabase=0;
	/**
	*ConnectionURL.Overrideshost,port,andpassword.Userisignored.Example:
	*redis://user:password@example.com:6379
	*/
	privateStringurl;
	/**
	*Redisserverhost.
	*/
	privateStringhost="localhost";
	/**
	*Loginpasswordoftheredisserver.
	*/
	privateStringpassword;
	/**
	*Redisserverport.
	*/
	privateintport=6379;
	/**
	*WhethertoenableSSLsupport.
	*/
	privatebooleanssl;
	/**
	*Connectiontimeout.
	*/
	privateDurationtimeout;
	/**
	*ClientnametobesetonconnectionswithCLIENTSETNAME.
	*/
	privateStringclientName;	
}
希望通过本篇对于springboot自动装配的解读,让大家对springboot底层有了一个大致了解,只分析了主要方法,希望对大家有帮助
到此这篇关于springboot如何实现自动装配源码赏析的文章就介绍到这了,更多相关springboot自动装配内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!