@EnableAutoConfiguration原理

preview
需积分: 0 0 下载量 68 浏览量 更新于2022-08-12 收藏 22KB MD 举报
### @EnableAutoConfiguration 原理详解 #### 一、概览 在Spring Boot中,`@EnableAutoConfiguration`是一个非常关键的注解,它负责启动自动配置功能,即自动根据项目的依赖和类路径来配置应用程序。这使得开发者在创建项目时能够减少大量的配置工作,仅需关注业务逻辑。 #### 二、核心概念解析 ##### 2.1 启动自动配置 正如注解文档所描述: ``` @EnableAutoConfiguration ``` 这一注解的核心作用在于使Spring ApplicationContext能够自动猜测并配置开发者可能需要的bean。这种自动配置主要基于类路径中的依赖以及已定义的bean来进行。 ##### 2.2 自动配置的应用时机 自动配置类通常会在以下情况被应用: - 当类路径中存在特定依赖时,如`tomcat-embedded.jar`,则会自动配置相应的`TomcatServletWebServerFactory`(前提是用户没有自定义`ServletWebServerFactory` bean)。 - 当使用`@SpringBootApplication`时,自动配置会默认开启,因此单独添加`@EnableAutoConfiguration`注解并不会带来额外的效果。 - 用户可以通过`exclude()`或`excludeName()`方法排除不需要的自动配置项;若没有权限访问这些配置,可以通过属性`spring.autoconfigure.exclude`进行排除。 ##### 2.3 注解内部结构 ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; } ``` - `@Target(ElementType.TYPE)`:指定该注解只能应用于类型级别。 - `@Retention(RetentionPolicy.RUNTIME)`:表示该注解会被保留至运行时。 - `@Documented`:确保该注解会被Javadoc工具记录。 - `@Inherited`:表示该注解可以被子类继承。 - `@AutoConfigurationPackage`:指示Spring Boot将包内的组件自动注册为bean。 - `@Import(AutoConfigurationImportSelector.class)`:导入了`AutoConfigurationImportSelector`类,该类是决定哪些自动配置类应该被导入的关键。 ##### 2.4 自动配置类的特点 - 自动配置类通常是标准的Spring配置bean。 - 它们使用Spring Factories Loader机制定位(对于此类),通常自动配置bean是条件化的bean,最常用的是`@ConditionalOnClass`和`@ConditionalOnMissingBean`注解。 #### 三、模块装配详解 要深入理解`@EnableAutoConfiguration`,还需了解Spring框架的模块装配机制,具体体现在各种`@EnableXXX`注解中。 ##### 3.1 模块装配示例 例如常见的`@EnableFeignClients`、`@EnableScheduling`、`@EnableAsync`等注解,它们是如何实现模块开关的功能呢? - **实现方式**:这些注解都含有`@Import`注解,该注解是模块装配的核心。 - **作用机理**:通过`@Import`指定具体的配置类或选择器,从而决定哪些bean将被注册到容器中。 ##### 3.2 @Import 注解解析 ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Import { // 指定配置类、选择器或注册器 Class<?>[] value(); } ``` - **配置类**:直接指定要导入的配置类。 - **选择器**:指定一个选择器类,该类将决定哪些配置类需要被导入。 - **注册器**:允许自定义bean的注册逻辑。 #### 四、总结 `@EnableAutoConfiguration`作为Spring Boot框架的核心注解之一,其背后的原理和设计思想非常重要。通过自动配置功能,Spring Boot简化了大量配置工作,使得开发者能够专注于业务逻辑的实现。同时,了解`@Import`注解及其作用机制也是深入理解Spring Boot自动配置机制的关键。