spring boot 自定义@EnableXXX注解
前言
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
接口注入
下面使用这三种不同方式的实例来演示一下
- 先创建三个需要被注入的类
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");}
}
- 针对
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()};}
}
- 针对
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注解相关推荐
- Spring Boot自定义缓存注解
自定义缓存注解 使用:
- Spring Boot 中 @EnableXXX 注解的驱动逻辑
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者 | 温安适 来源 | https://juejin. ...
- Spring Boot 中 @EnableXXX 注解的驱动逻辑探讨
作者 | 温安适 来源 | https://juejin.im/post/5efdd689e51d4534af686ca9 工作中经常用到,如下注解: @EnableEurekaClient @Ena ...
- 注解参数获取不到_scm-springboot基于spring boot的统一注解缓存
scm-springboot 基于spring boot的统一注解缓存,支持mencached.redis.ehcache的缓存无缝切换.支持单个缓存设置过期时间,灵活的key设置规则,采用fastj ...
- 八、Spring Boot自定义starters
一.自定义starters • 自动装配Bean: – 自动装配使用配置类(@Configuration)结合Spring4 提供的条件判断注解 @Conditional及Spring Boot的派生 ...
- Spring Boot自定义横幅生成
每当我们启动Spring Boot应用程序时,都会显示如下所示的文本消息. 这称为横幅. 现在,如果我们可以创建一个特定于我们的Spring Boot应用程序的自定义横幅并使用它代替默认的Spring ...
- Spring Boot中常见注解诠释
一:@Mapper和@MapperScan 1.@Mapper @Mapper 将接口交给Spring进行管理,为这个接口生成一个实现类,让别的类进行引用.不再写mapper映射文件. @Mapper ...
- Spring Boot自定义Banner
Spring Boot自定义Banner https://www.jianshu.com/p/a53f324c92f2 我们在启动 SpringBoot 时,控制台会打印 SpringBoot Log ...
- Spring Boot自定义启动Banner
Spring Boot自定义启动Banner 生成工具 https://www.bootschool.net/ascii
最新文章
- 在CentOS 6.6 64bit上升级GCC到4.8.2版本
- 2.函数(代码的整洁之道)
- centos右上角wired图标消失有效解决方案【转载】
- Web 开发的 JavaScript 框架资料收集(15款)
- 《博弈论与生活》思维导图
- 学历真的重要吗?当然非常非常非常重要。
- 【学习OpenCV4】OpenCV4入门介绍
- Linux系统不同颜色文件代表什么意思?绿色、蓝色、白色、红色等代表的意义是什么?
- Win10开机黑屏进不了桌面
- 历经8年美团成功上市!回到起点看王兴,梦想并非遥不可及!
- android webview 加载过程,实战:七步完成Android Webview图片加载
- 中国防静电塑料卷轴市场深度研究分析报告
- APP上短信验证码如何验证?
- CLI 什么是 command-line interface
- 第1章第7节:如何通过大纲级别批量创建幻灯片 [PowerPoint精美幻灯片实战教程]
- LDK3读书笔记(第一章:LINUX内核简史)
- fileinclude (攻防世界web)
- 【数据分析学习笔记day25】实战案例:世界高峰数据可视化+世界高峰数据可视化 (World's Highest Mountains)
- 全球与中国射频仪表市场深度研究分析报告
- 芯讯通/SIMCOM LTE 模组接入 ThingsCloud