前言

spring boot 自带了很多@EnableXXX这样的注解,通过这些注解我们可以很方便地启用某些功能,比如@EnableAutoConfiguration用来开启自动装配的功能。内部实现主要是通过@Import注解将指定的类实例注入之Spring IOC Container中,从下面代码可以看到@EnableAutoConfiguration@Import

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {…………
}

@Import注解

spring boot 的@Import注解可以配置三种不同的class,根据不同的场景来选择不同的注入方式

  • 普通的bean 或者 带有@Configuration的bean 直接注入
  • 实现ImportSelector接口注入
  • 实现 ImportBeanDefinitionRegistrar接口注入

下面使用这三种不同方式的实例来演示一下

  1. 先创建三个需要被注入的类
public class LoggerService {public void saveLog(String log){System.out.println("log is saved");}
}
public class MonitorService {public  void saveMonitor(){System.out.println("cpu、memory is saved");}
}
public class CounterService {public void add(int count ){System.out.println("count is added");}
}
  1. 针对MonitorServic我们使用ImportSelector的方式来注入,这里需要创建ImportSelector的实现类
public class MonitorImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {AnnotationAttributes annotationAttributes = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(EnableCustService.class.getName()));//在这里可以拿到所有注解的信息,可以根据不同注解的和注解的属性来返回不同的class,// 从而达到开启不同功能的目的return new String[]{MonitorService.class.getName()};}
}
  1. 针对CounterService我们使用ImportBeanDefinitionRegistrar的方式来注入,这里需要创建ImportSelector的实现类
public class CounterDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {Class beanClass = CounterService.class;RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);String beanName = StringUtils.uncapitalize(beanClass.getSimpleName());//在这里可以拿到所有注解的信息,可以根据不同注解来返回不同的class,从而达到开启不同功能的目的//通过这种方式可以自定义beanNameregistry.registerBeanDefinition(beanName, beanDefinition);}
}

自定@EnableXXX注解

准备工作做好后,我们开始创建自定义@EnableCustService

@Import({LoggerService.class,MonitorImportSelector.class,CounterDefinitionRegistrar.class})
public @interface EnableCustService {}

模拟使用@EnableCustService

@EnableCustService
@SpringBootApplication
public class SpringbootCodeMain {public static void main(String[] args) {ConfigurableApplicationContext applicationContext  = SpringApplication.run(SpringbootCodeMain.class, args);System.err.println("-->"+applicationContext.getBean(LoggerService.class));System.err.println("-->"+applicationContext.getBean(MonitorService.class));System.err.println("-->"+applicationContext.getBean(CounterService.class));}
}

启动程序输出:
–>com.maple.learn.enable.LoggerService@4943defe
–>com.maple.learn.enable.MonitorService@5eefa415
–>com.maple.learn.enable.CounterService@181d7f28

本文的项目代码git地址:https://github.com/amapleleaf/springboot-code.git ,本文只是讲了如何使用@EnableXXX,如果想了解其原理可以参考本人的另一篇文章<<spring boot自动装配之@EnableAutoConfiguration详解>>

spring boot 自定义@EnableXXX注解相关推荐

  1. Spring Boot自定义缓存注解

    自定义缓存注解 使用:

  2. Spring Boot 中 @EnableXXX 注解的驱动逻辑

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者 | 温安适 来源 | https://juejin. ...

  3. Spring Boot 中 @EnableXXX 注解的驱动逻辑探讨

    作者 | 温安适 来源 | https://juejin.im/post/5efdd689e51d4534af686ca9 工作中经常用到,如下注解: @EnableEurekaClient @Ena ...

  4. 注解参数获取不到_scm-springboot基于spring boot的统一注解缓存

    scm-springboot 基于spring boot的统一注解缓存,支持mencached.redis.ehcache的缓存无缝切换.支持单个缓存设置过期时间,灵活的key设置规则,采用fastj ...

  5. 八、Spring Boot自定义starters

    一.自定义starters • 自动装配Bean: – 自动装配使用配置类(@Configuration)结合Spring4 提供的条件判断注解 @Conditional及Spring Boot的派生 ...

  6. Spring Boot自定义横幅生成

    每当我们启动Spring Boot应用程序时,都会显示如下所示的文本消息. 这称为横幅. 现在,如果我们可以创建一个特定于我们的Spring Boot应用程序的自定义横幅并使用它代替默认的Spring ...

  7. Spring Boot中常见注解诠释

    一:@Mapper和@MapperScan 1.@Mapper @Mapper 将接口交给Spring进行管理,为这个接口生成一个实现类,让别的类进行引用.不再写mapper映射文件. @Mapper ...

  8. Spring Boot自定义Banner

    Spring Boot自定义Banner https://www.jianshu.com/p/a53f324c92f2 我们在启动 SpringBoot 时,控制台会打印 SpringBoot Log ...

  9. Spring Boot自定义启动Banner

    Spring Boot自定义启动Banner 生成工具 https://www.bootschool.net/ascii

最新文章

  1. 在CentOS 6.6 64bit上升级GCC到4.8.2版本
  2. 2.函数(代码的整洁之道)
  3. centos右上角wired图标消失有效解决方案【转载】
  4. Web 开发的 JavaScript 框架资料收集(15款)
  5. 《博弈论与生活》思维导图
  6. 学历真的重要吗?当然非常非常非常重要。
  7. 【学习OpenCV4】OpenCV4入门介绍
  8. Linux系统不同颜色文件代表什么意思?绿色、蓝色、白色、红色等代表的意义是什么?
  9. Win10开机黑屏进不了桌面
  10. 历经8年美团成功上市!回到起点看王兴,梦想并非遥不可及!
  11. android webview 加载过程,实战:七步完成Android Webview图片加载
  12. 中国防静电塑料卷轴市场深度研究分析报告
  13. APP上短信验证码如何验证?
  14. CLI 什么是 command-line interface
  15. 第1章第7节:如何通过大纲级别批量创建幻灯片 [PowerPoint精美幻灯片实战教程]
  16. LDK3读书笔记(第一章:LINUX内核简史)
  17. fileinclude (攻防世界web)
  18. 【数据分析学习笔记day25】实战案例:世界高峰数据可视化+世界高峰数据可视化 (World's Highest Mountains)
  19. 全球与中国射频仪表市场深度研究分析报告
  20. 芯讯通/SIMCOM LTE 模组接入 ThingsCloud

热门文章

  1. Linux下穿件带点文件夹和隐藏文件显示隐藏文件命令
  2. 如何有效阅读他人代码(一)
  3. 验证Hu矩的旋转不变性
  4. Synchronized锁升级底层原理
  5. 人工智能的“斯芬克斯之谜”
  6. Neighbor2Neighbor源码解读
  7. html+css制作盾牌飞入效果
  8. linux服务器上的回收站,为linux系统实现回收站
  9. 初识MIMO(四):MIMO的接收端检测技术及其仿真
  10. c语言判断一个数是否为偶数源代码,c语言判断一个数是否为偶数