@EnableXX 注解的使用场景
SpringBoot 为开发人员提供了很多便利, 例如如果想要定时功能, 只要添加 @EnableSchedule, 即可配合 @Schedule 注解实现定时任务功能, 不需要额外配置定时任务的处理线程, 就可以直接使用 (框架提供默认配置, 在找不到用户自定配置的执行器时, 使用默认配置)
@EnableXXX 注解给人的感觉就是有一个 "开关", 只要开关打开就可以对应的功能, 非常方便.
有时候, 我们可能也想实现一个功能, 打包发布后, 其他项目只要引入依赖, 添加 @Enable 注解就可以直接使用.
那么 @EnableXXX 的原理是什么呢?
个人认为 @Enable 的核心就是将 XXX 配置引入到当前容器内, 而这个操作就由 @Import 注解来完成,@Import 引入的类, 一般是配置类, 该配置类可能会使用两种方式引入相关的 Bean
1在配置类中使用 @Bean 构造相关的 Bean
2使用 @ComponentScan 扫描指定路径, 引入 Bean.
这些 Bean 就用于提供 XXX 功能.
那如果是这样, 直接使用 @Import 就好了, 干嘛还需要 @EnableXXX?
直接使用 @Import 确实够了, 但是 @EnableXXX 有两个好处
1可以整合多个配置, 便于记忆. 例如要提供 XXX 功能, 可能需要 @Import 多个配置类
2内容封装且用户友好. 用户不需要知道使用 XXX 功能需要引入哪些配置. 直接 @Enable 就好了.
简单案例
@Enable 提供 health 接口
- //project 1
- @Target({java.lang.annotation.ElementType.TYPE})
- @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
- @Documented
- @Import({HealthConfig.class}) // 指明引入 HealthConfig 类
- public @interface EnableHealth {
- }
- @Configuration
- @ComponentScan({"com.test.controller"}) // 扫描当前项目的 controller
- public class HealthConfig {
- }
- @RestController
- public class HealthController { // 提供 health 接口
- @GetMapping("/health")
- public String health() {
- return "{\"status\":\"UP\"}";
- }
- }
- //project2
- @EnableHealth // 开启 health 功能, 最终将 HealthController 注入到当前容器中
- @SpringBootApplication
- public class DemoApplication {
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
- }
1)project1 是一个普通的 maven 项目, 封装一个 Health 功能.
2)project2 就是一个普通的 SpringBoot 项目, 只要引入 project1 依赖, 并使用 @EnableHealth 即可提供 health 接口
3)project1 项目中需要使用 Spring 的注解, 需要引入 spring 依赖, 这可能与 project2 的版本不同, 故 project1 的 spring 相关依赖的 scope 可以指定为 provided, 由外部提供.
来源: https://www.cnblogs.com/longfurcat/p/12643544.html