大牛深入解析SpringBoot核心运行原理和运作原理源码( 三 )
注 解 中 组 合 了 @SpringBootConfiguration 、@EnableAutoConfiguration 和@ComponentScan 。 因此 , 在实践过程中也可以使用这 3 个注解来替代@SpringBootApplication 。
在 Spring Boot 早期版本中并没有@SpringBootConfiguration 注解 , 版本升级后新增了@SpringBootConfiguration 并在其内组合了@Configuration 。
@EnableAutoConfiguration 注解组合了@AutoConfigurationPackage.我们忽略掉一些基础注解和元注解 ,@SpringBootApplication 注解的组合结构可以参考图2-2 。
文章插图
在图2-2中 , @SpringBootApplication除 了组合元注解之外 , 其核心作用还包括:激活SpringBoot 自 动 配 置 的 @EnableAutoConfiguration 、 激 活 @Component 扫 描 的@ComponentScan、激活配置类的@Configuration 。
其中@ComponentScan 注解和@Configuration 注解在日常使用 Spring 时经常用到 , 也非常 基 础,大 家应该都有一些了 解,这 里 就 不 再 赘 述 了。下 面 详 细 介 绍@EnableAuto-Configuration 的功能 。
文章插图
注解@EnableAutoConfiguration功能解析在未使用 Spring Boot 的情况下 , Bean 的生命周期由 Spring 来管理 , 然而 Spring 无法自动配置@Configuration 注解的类 。 而 Spring Boot 的核心功能之- 就是根据约定自动管理该注解标注的类 。 用来实现该功能的组件之-便是@EnableAutoConfiguration 注解 。
@EnableAutoConfiguration 位 于 spring-boot autoconfigure 包 内,当 使 用@SpringBootApplication 注解时 , @EnableAutoConfiguration 注 解会自动生效 。
@EnableAutoConfiguration 的主要功能是启动 Spring 应用程序上下文时进行自动配置 , 它会尝试猜测并配置项目可能需要的 Bean 。 自动配置通常是基于项目 classpath 中引入的类和已定义的 Bean 来实现的 。 在此过程中 , 被自动配置的组件来自项目自身和项目依赖的 jar包中 。
举 个 例 子 : 如 果 将 tomcat-embedded.jar 添 加 到 classpath 下,那 么@EnableAutoConfiguration 会认为你准备用 TomcatServletWebServerFactory 类 , 并帮你初始化相关配置 。 与此同时 , 如果自定义了基于 ServletWebServerFactory 的 Bean, 那么@EnableAutoConfiguration 将不会进行 TomcatServletWebServerFactory 类的初始化 。 这一系列的操作判断都由 Spring Boot 来完成 。
下面我们来看一下@EnableAutoConfiguration 注解的源码 。
@Target(ElementType . TYPE)@Retention( RetentionPolicy . RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(AutoConf igurat ionImportSelector. class)public @interface EnableAutoConfiguration {//用来餐盖配置开启/关闭自动配置的功能String ENABLED. OVERRIDE_ PROPERTY = "spring. boot . enableautoconf iguration" ;//根据类(Class) 排除指定的自动配置Class>[] exclude() default {};//根据类名排除指定的自动配置String[] excludeName() default {};}
@EnableAutoConfiguration 注解提供了一-个常量和两个成员参数的定义 。
ENABLED OVERRIDE PROPERTY:用来覆盖开启/关闭自动配置的功能 。
-exclude:根据类(Class) 排除指定的自动配置 。
excludeName:根据类名排除指定的自动配置 。
正如上文所说 , @EnableAutoConfiguration 会猜 测你需要使用的 Bean,但如果在实战中你并不需要它预置初始化的 Bean , 可通过该注解的 exclude 或 excludeName 参数进行有针对性的排除 。 比如 , 当不需要数据库的自动配置时 , 可通过以下两种方式让其自动配置失效 。
推荐阅读
- 国家工业互联网标识解析二级节点(威海)上线
- 全新8核国产CPU深入探秘:马上能买到
- 多就是好吗?解析智能手机多摄发展困局
- 新基建下,系统集成商数字化建设及渠道管理深度解析
- 四个维度解析区域发展与治理
- 智媒视角看深圳用数据解析城市
- “联邦的战斗力量”再现,华硕Z490主板机动战士高达版解析
- 天翼云全国首个工业互联网平台二级解析节点上线
- 16G运存+256G内存,专业骁龙865旗舰,性价比深入人心
- 深入理解Netty编解码、粘包拆包、心跳机制