一、什么是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版本中,优先级的定义如下:
- 最高优先级:通过@EnableAutoConfiguration注解的exclude属性排除组件
- 次高优先级:通过spring.factories中配置的‘application.properties’或‘application.yml’在应用程序级别上进行配置
- 第三优先级:通过带有@ConfigurationProperties注解的类在应用程序级别上配置
- 第四优先级:通过@ConditionalOnClass注解指定的类存在性进行自动配置
- 第五优先级:通过@ConditionalOnMissingBean注解指定的类不存在时进行自动配置
- 第六优先级:通过@Order注解指定的配置优先级
- 最低优先级:通过@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