EnableAutoConfiguration源码解析

Springboot项目中最核心也是入门级的注解就是@SpringBootApplication,这是由@EnableAutoConfiguration、@ComponentScan和@Configuration组成的一个组合注解。
接下来我们将分析其中的EnableAutoConfiguration注解的源码。
springboot的一大特性就是“约定大于配置”,EnableAutoConfiguration这个注解从字面上就可以理解是一个实现自动配置的注解,也是“约定”能够生效的一大保障。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};

}

EnableAutoConfiguration有两大属性,exclude和excludeName都是用来指定不需要自动配置的配置类。
分析完EnableAutoConfiguration的属性,接下来和其它Enable类型的注解一下,我们进入@import注解指定的类,分析springboot是如何实现自动配置的。
AutoConfigurationImportSelector是一个ImportSelector类,selectImports的返回值就是其最后注入IOC容器的配置类。另外,AutoConfigurationImportSelector还用到了beanClassLoader、environment、resourceLoader,因此其还实现了BeanClassLoaderAware,EnviromentAware,ResourceLoaderAware接口。

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
		return NO_IMPORTS;
	}
	try {
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
		configurations = removeDuplicates(configurations);
		configurations = sort(configurations, autoConfigurationMetadata);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = filter(configurations, autoConfigurationMetadata);
		fireAuto
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值