spring boot自定义@EnableXXX注解
程序员文章站
2022-05-01 23:05:30
...
前言
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 {
@Override
public 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 {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
Class beanClass = CounterService.class;
RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);
String beanName = StringUtils.uncapitalize(beanClass.getSimpleName());
//在这里可以拿到所有注解的信息,可以根据不同注解来返回不同的class,从而达到开启不同功能的目的
//通过这种方式可以自定义beanName
registry.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));
}
}
启动程序输出:
–>[email protected]
–>[email protected]
–>[email protected]
本文的项目代码git地址:https://github.com/amapleleaf/springboot-code.git ,本文只是讲了如何使用@EnableXXX
,如果想了解其原理可以参考本人的另一篇文章<<spring boot自动装配之@EnableAutoConfiguration详解>>
上一篇: 智能合约可能出现的安全问题(三)
下一篇: 【agc019F】Yes or No
推荐阅读
-
详解使用Spring AOP和自定义注解进行参数检查
-
Spring boot创建自定义starter的完整步骤
-
[Spring Boot]使用自定义注解统一请求返回值
-
浅谈Spring自定义注解从入门到精通
-
spring boot使用自定义的线程池执行Async任务
-
Spring-Boot使用嵌入式容器,那怎么配置自定义Filter呢
-
spring-boot-2.0.3不一样系列之番外篇 - 自定义session管理,绝对有值得你看的地方
-
Spring boot 学习笔记 1 - 自定义错误
-
IDEA开发spring boot应用时 application.yml 或 application.properties 自定义属性提示
-
浅谈Spring Boot 属性配置和自定义属性配置