enableAutoConfiguration详解

一、什么是enableAutoConfiguration

在Spring Boot中,enableAutoConfiguration是非常重要的一个组件,它可以方便我们进行Spring Boot应用程序的自动配置。简单的说,enableAutoConfiguration会自动根据当前项目中添加的依赖来推断该如何配置Spring应用程序。这很大程度上可以减少程序员的工作量。

二、enableAutoConfiguration的实现机制

当我们添加一个Spring Boot-Starter依赖时,enableAutoConfiguration就会自动进行装配。Spring Boot提供了AutoConfigurationImportSelector类来帮助我们实现自动装配。这个类会根据classpath下 META_INF/spring.factories文件中的配置来自动配置我们项目的各种组件。

Spring Boot 2.x版本的spring.factories中自动配置类键的前缀是org.springframework.boot.autoconfigure.EnableAutoConfiguration,这个是Spring Boot按照注解方式进行自动装配的很重要的一个注解。通过这个注解,Spring Boot能够根据添加的依赖进行动态的自动装配。

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {

	private static final Log logger = LogFactory.getLog(AutoConfigurationImportSelector.class);

	private static final String[] NO_IMPORTS = {};

	/**
	 * 基于默@Configuration式的SpringBoot自动装配机制:SpringApplication的run()方法会触发AutoConfigurationImportSelector这个类,
	 * 这个类会使用SpringFactoriesLoader的loadFactoryNames()方法加载classpath路径下所有的META-INF/spring.factories的自动装配配置后进一步处理。
	 * 自动配置优先级高于指定配置,最后自动配置完成后再应用指定配置
	 */
	@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		try {
			AutoConfigurationMetadata metadata = AutoConfigurationMetadataLoader
					.loadMetadata(this.beanClassLoader);
			AnnotationAttributes attributes = getAttributes(annotationMetadata);
			List configurations = getCandidateConfigurations(annotationMetadata, attributes);
			configurations = removeDuplicates(configurations);
			Set exclusions = getExclusions(annotationMetadata, attributes);
			checkExcludedClasses(configurations, exclusions);
			configurations.removeAll(exclusions);
			configurations = filter(configurations, metadata);
			fireAutoConfigurationImportEvents(configurations, exclusions);
			return StringUtils.toStringArray(configurations);
		}
		catch (IOException ex) {
			throw new IllegalStateException(ex);
		}
	}

}

三、enableAutoConfiguration的使用场景

enableAutoConfiguration使Spring Boot应用程序的启动变得非常快速和便捷。我们无需手动配置各种组件,只需要添加相应的依赖包就可以了。例如,如果我们需要连接MySQL数据库,只需要在pom.xml文件中添加mysql-connector-java包的依赖,不用管具体的数据库连接代码,enableAutoConfiguration会自动帮我们完成数据库连接配置。

@SpringBootApplication
public class ExampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(ExampleApplication.class, args);
	}

}

四、enableAutoConfiguration的缺点

虽然enableAutoConfiguration能够极大地方便我们使用Spring Boot,但是有时候也会出现一些问题。例如,我们在开发时可能会引入多个自动配置库,这时就会发现自动装配出现了问题,普通的Java类可能被Spring Boot认为是一个可配置的类。

此外,自动配置可能会受限于Spring Boot版本的支持。对于一些较老的版本,可能存在某些组件无法自动装配的问题。解决这些问题需要我们手动编写一些配置代码。

五、enableAutoConfiguration的配置优先级

对于相同类型的配置,最后加载的配置会覆盖之前的配置,这意味着配置优先级高的会替换掉配置优先级低的。

在Spring Boot2.x版本中,优先级的定义如下:

  1. 最高优先级:通过@EnableAutoConfiguration注解的exclude属性排除组件
  2. 次高优先级:通过spring.factories中配置的‘application.properties’或‘application.yml’在应用程序级别上进行配置
  3. 第三优先级:通过带有@ConfigurationProperties注解的类在应用程序级别上配置
  4. 第四优先级:通过@ConditionalOnClass注解指定的类存在性进行自动配置
  5. 第五优先级:通过@ConditionalOnMissingBean注解指定的类不存在时进行自动配置
  6. 第六优先级:通过@Order注解指定的配置优先级
  7. 最低优先级:通过@EnableAutoConfiguration注解指定的默认自动配置
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet")
public class MyAutoConfiguration {
     // Custom configuration implementation
}

上面的示例代码中,我们使用了@Order注解来设置了最高优先级,因此这个自动配置类将会覆盖系统默认的自动配置。

六、总结

enableAutoConfiguration是Spring Boot中非常重要的一个自动装配组件,它为我们提供了自动装配的功能,极大地方便了Spring Boot应用程序的开发和配置。在进行使用时,需要注意组件的优先级,避免在使用过程中出现问题。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/312023.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-05 16:05
下一篇 2025-01-06 09:40

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论