自定义注解和组件扫描在Spring Boot中动态注册Bean(一)

news/2025/3/6 2:04:51/

 ​

博客主页:     南来_北往

系列专栏:Spring Boot实战


在Spring Boot中,自定义注解和组件扫描是两种强大的机制,它们允许开发者以声明性的方式动态注册Bean。这种方式不仅提高了代码的可读性和可维护性,还使得Spring Boot应用的配置更加灵活和可扩展。以下将详细讲解这两种机制在Spring Boot中如何协同工作,以实现动态注册Bean。

一、自定义注解

自定义注解是Java提供的一种元数据形式,它允许开发者为代码添加额外的信息,这些信息可以在编译时、加载时或运行时被访问和处理。在Spring Boot中,自定义注解通常用于标记需要被Spring容器管理的类,或者用于配置特定的行为。

1、定义自定义注解

要定义一个自定义注解,需要使用@interface关键字,并指定注解的保留策略(@Retention)、目标元素(@Target)等元信息。例如,定义一个名为@MyComponent的自定义注解,用于标记需要被Spring容器管理的类:

java">@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.TYPE)  
public @interface MyComponent {  
}

2、使用自定义注解

在需要被Spring容器管理的类上使用自定义注解。例如:

java">@MyComponent  
public class MyBean {  // 类的实现  
}
二、组件扫描

组件扫描是Spring框架提供的一种机制,它允许Spring容器在启动时自动扫描指定包下的类,并根据类上的注解(如@Component@Service@Repository等)将其注册为Bean。在Spring Boot中,组件扫描通常通过@ComponentScan注解或启动类上的默认扫描行为来实现。

1、配置组件扫描

在Spring Boot应用中,可以通过在启动类上添加@ComponentScan注解来配置组件扫描的路径。例如:

java">@SpringBootApplication  
@ComponentScan(basePackages = "com.example.myapp")  
public class MyApplication {  public static void main(String[] args) {  SpringApplication.run(MyApplication.class, args);  }  
}

如果启动类位于根包下,并且希望扫描所有子包中的组件,则可以省略@ComponentScan注解,因为@SpringBootApplication注解已经包含了@ComponentScan注解,并且默认扫描启动类所在的包及其子包。

2、动态注册Bean

要实现通过自定义注解和组件扫描动态注册Bean,需要创建一个实现了ImportBeanDefinitionRegistrar接口的类,并在该类中编写逻辑来扫描指定包下的类,并根据自定义注解将其注册为Bean。例如:

java">public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {  @Override  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {  // 扫描指定包下的类  ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);  scanner.setResourceLoader(new PathMatchingResourcePatternResolver());  scanner.addIncludeFilter(new AnnotationTypeFilter(MyComponent.class));  scanner.scan("com.example.myapp");  }  
}

然后,需要创建一个用于启用自定义注解扫描的注解,并在该注解上使用@Import注解来导入MyBeanDefinitionRegistrar类:

java">@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.TYPE)  
@Documented  
@Import(MyBeanDefinitionRegistrar.class)  
public @interface EnableMyComponents {  
}

最后,在启动类上使用@EnableMyComponents注解来启用自定义注解扫描:

java">@SpringBootApplication  
@EnableMyComponents  
public class MyApplication {  public static void main(String[] args) {  SpringApplication.run(MyApplication.class, args);  }  
}

 现在,当Spring Boot应用启动时,它会扫描指定包下的类,并根据@MyComponent注解将其注册为Bean。

三、总结

自定义注解和组件扫描是Spring Boot中动态注册Bean的两种重要机制。通过定义和使用自定义注解,开发者可以以声明性的方式标记需要被Spring容器管理的类。而组件扫描则允许Spring容器在启动时自动扫描指定包下的类,并根据类上的注解将其注册为Bean。通过结合这两种机制,开发者可以更加灵活和可扩展地配置Spring Boot应用中的Bean。


http://www.ppmy.cn/news/1538194.html

相关文章

达梦数据库性能优化

1、SQL执行计划 拿到一条SQL的时候,首先要下达梦手册中提出的有效SQL规范,及是否命中了特殊OR子句的不规范,是否用了复杂的正则表达式,避免重复很高的索引,UINON ALL 是否可以替换UNION操作等,某些场景INSTR函数导致的…

vite+vue3实现动态路径导入

最近在做一个项目有个需求: 项目图片分为英语,中文,德语 ,我将这些图片存放到/image/language/下面的每个语言的文件夹内,如en,zh-cn文件夹下面存放对应的语言的图片,如果在代码里面写路径的话,除了要写一堆路径还要判断不同的语言,非常麻烦,但是在vue3vite里面import导入的是加…

多元统计实验报告内容

1 实验内容 实验目的: 利用R软件进行一些简单的数学运算,通过对简单统计量函数的操作了解R语言的基本操作过程,从而对R语言形成初步的认识。 实验项目名称: R语言软件的安装。R语言中赋值语句的练习。 在R中<-表示赋值,c()表示数组,X1<-c()即表示将一组数据赋…

十一、数据库的设计规范

文章目录 1. 为什么需要数据库设计2. 范式2.1 范式介绍2.2 范式都包括哪些2.3 键和相关属性的概念2.4 第一范式(1st NF)2.5 第二范式(2nd NF)2.6 第三范式(3rd NF)2.7 小结3. 反范式化3.1 概述3.2 应用举例3.3 反范式的新问题3.4 反范式的使用场景3.4.1 增加冗余字段的建议3.…

DELL R720服务器阵列数据恢复,磁盘状态为Foreign

服务器无法正常进入系统&#xff0c;物理磁盘状态变成了Foreign 虚拟磁盘状态变成了Failed 阵列已经丢失了&#xff0c;需要手工强制导入外部配置 单击 Main Menu 屏幕上的 Configuration Management。单击 Manage Foreign Configuration 单击 Preview Foreign Configurati…

企业级im架构详解, 分布式im 荔枝im即时消息分享 即时通讯im

1. 最近看了荔枝集团在infoQ 的im技术分享视频&#xff0c;干货满满。52im好像没有看到这个分享 2. b站链接&#xff1a; IM即时消息系统在荔枝的落地实践_哔哩哔哩_bilibili 3. infoQ 链接: IM即时消息系统在荔枝的落地实践 | InfoQ 公开课_架构_郑思宇_InfoQ精选视频 4. …

离岗睡岗预警系统 值班室离岗识别系统Python 结合 OpenCV 库

在众多工作场景中&#xff0c;存在着一些特殊岗位&#xff0c;这些岗位对于人员的专注度和警觉性有着极高的要求。然而&#xff0c;离岗睡岗现象却时有发生&#xff0c;给工作的正常开展和安全保障带来了严重的威胁。本文将深入探讨特殊岗位离岗睡岗的危害&#xff0c;以及如何…

Linux: network: tcp: sk_tx_skb_cache;4.18.0-283.el8;多分配内存

最近看一个问题,发现下面这个添加cache的commit,在4.18.0-283.el8版本被拿进来到RHEL8。 commit 472c2e07eef045145bc1493cc94a01c87140780a Author: Eric Dumazet <edumazet@google.com> Date: Fri Mar 22 08:56:39 2019 -0700tcp