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

在Spring Boot中,自定义注解和组件扫描是实现动态注册Bean的两种重要手段。通过它们,开发者可以灵活地管理Spring容器中的Bean,提高开发效率和代码的可维护性。本文将详细讲解自定义注解和组件扫描在Spring Boot中如何动态注册Bean。

自定义注解动态注册Bean

自定义注解是一种强大的工具,它允许开发者定义自己的注解并在代码中使用它们,以实现特定的功能。在Spring Boot中,自定义注解可以用于动态注册Bean。

步骤一:创建自定义注解

首先,需要定义一个自定义注解。这个注解可以包含一些元信息,用于后续的处理。例如:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.TYPE) // 注解的目标为类
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时保留,可通过反射访问
public @interface MyCustomAnnotation {String value() default ""; // 定义一个属性
}
步骤二:在类上使用自定义注解

然后,在需要被动态注册为Bean的类上使用这个自定义注解。例如:

import org.springframework.stereotype.Service;@Service
@MyCustomAnnotation("someValue")
public class MyService {public void myMethod() {// 方法实现}
}
步骤三:处理自定义注解

最后,需要编写一个类来处理这个自定义注解。这个类通常会实现ImportBeanDefinitionRegistrar接口,并在其中注册Bean。例如:

import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.beans.factory.annotation.BeanClassLoaderAware;
import org.springframework.beans.factory.annotation.BeanClassLoaderAware;
import org.springframework.core.env.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoaderAware;
import org.springframework.core.io.ResourceLoader;public class MyCustomAnnotationRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware {private ResourceLoader resourceLoader;private ClassLoader classLoader;private Environment environment;@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {this.classLoader = classLoader;}@Overridepublic void setEnvironment(Environment environment) {this.environment = environment;}@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);scanner.setResourceLoader(this.resourceLoader);scanner.addIncludeFilter(new AnnotationTypeFilter(MyCustomAnnotation.class));// 扫描指定的包scanner.scan("com.example.demo");}
}
步骤四:在启动类上启用自定义注解

最后,需要在Spring Boot的启动类上启用这个自定义注解。这通常通过定义一个包含@Import注解的元注解来实现:

import org.springframework.context.annotation.Import;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(MyCustomAnnotationRegistrar.class)
public @interface EnableMyCustomAnnotation {
}

然后,在启动类上使用这个元注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableMyCustomAnnotation
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

通过以上步骤,Spring Boot会在启动时扫描所有带有@MyCustomAnnotation注解的类,并将它们注册为Bean。

组件扫描动态注册Bean

组件扫描是Spring框架中的一个核心功能,它允许Spring自动发现应用中的组件并将其注册为Bean。在Spring Boot中,组件扫描通常通过@ComponentScan注解来实现。

步骤一:使用@ComponentScan注解

可以在Spring Boot的启动类上直接使用@ComponentScan注解来配置组件扫描。例如:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo", "com.example.other"})
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

在这个例子中,Spring Boot会扫描com.example.democom.example.other包及其子包中的所有类,并将带有@Component@Service@Repository@Controller等注解的类注册为Bean。

步骤二:使用@Component及其衍生注解

在需要被自动注册为Bean的类上使用@Component及其衍生注解(如@Service@Repository@Controller等)。例如:

import org.springframework.stereotype.Service;@Service
public class MyService {public void myMethod() {// 方法实现}
}

在这个例子中,MyService类会被Spring Boot自动扫描并注册为Bean。

总结

自定义注解和组件扫描是Spring Boot中动态注册Bean的两种重要手段。通过自定义注解,开发者可以灵活地定义自己的注解并在代码中使用它们,以实现特定的功能。而组件扫描则允许Spring自动发现应用中的组件并将其注册为Bean,简化了Bean的管理和配置。在实际开发中,可以根据具体需求选择适合的方式来动态注册Bean。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html嵌入vue如何使用?

html嵌入vue如何使用&#xff1f; <script src"https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script> <script src"https://cdn.bootcdn.net/ajax/libs/vuex/3.6.2/vuex.min.js"></script> <script src&q…

Java使用HttpClient5实现发送HTTP请求

1、HttpClient5 的介绍 HttpClient5 是 Apache HttpComponents 项目中的一个重要组件&#xff0c;它是一个功能齐全且高度可定制的 HTTP 客户端库&#xff0c;专门用于发送 HTTP 请求、处理 HTTP 响应并支持各种 HTTP 协议特性。 以下是对 HttpClient5 的详细介绍&#xff1a…

部署Qwen2.5-7b大模型详解

部署Qwen2.5-7b大模型详解 本文参考教程&#xff1a;https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html 下载模型 https://modelscope.cn/organization/qwen 搜索 qwen2.5-7b 可以看到它提供了六个模型&#xff0c;以满足不同的需求&#xff0c;从下…

深度学习的全面解析

深度学习的全面解析 深度学习,作为人工智能领域的一项革命性技术,正在引领着数据科学的新时代。对于很多人来说,它可能依然是个陌生的概念,但想象一下,你的手中握着一把钥匙,这把钥匙可以打开无数扇大门,让你进入一个充满智慧的世界。今天,我们将一同探索深度学习的定…

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

【MATLAB代码,带TDOA数据导入】TDOA三维空间的位置(1主锚点、3副锚点),多个时间点、输出位置的坐标

TDOA介绍 TDOA&#xff08;到达时间差&#xff09;是一种用于定位和跟踪信号源的技术&#xff0c;常用于无线通信、导航和雷达系统。它通过测量信号到达不同接收器的时间差&#xff0c;来计算信号源的位置。 基本原理 TDOA的基本原理是利用多个接收器&#xff08;或锚点&…

Power BI - 设置Waterfall Chart第一个Pillar的颜色

1.简单介绍 有的用户可能会单独设置Column Chart&#xff08;条形图&#xff09;的第一个柱子的颜色&#xff0c;如下图所示&#xff0c; 这种其实可以通过Column Chart的Conditional formating进行设置&#xff0c; - SWICH SELECTEDVALUE 或者也可以直接对单独的Column进行…

网络安全入门

网络安全入门是指学习和了解网络安全基础知识和技术的入门阶段。网络安全是指保护计算机系统、网络和数据免受未经授权的访问、使用、泄露、破坏以及其他威胁的技术和措施。 要入门网络安全&#xff0c;可以按照以下步骤进行&#xff1a; 了解网络安全基本概念&#xff1a;学习…

用户界面设计:视觉美学与交互逻辑的融合

1、什么是用户界面 用户界面&#xff08;UI&#xff09;是人与机器之间沟通的桥梁&#xff0c;同时也是用户体验&#xff08;UX&#xff09;的重要组成部分。用户界面设计包括两个核心要素&#xff1a;视觉设计&#xff08;即产品的外观和感觉&#xff09;和交互设计&#xff…

CSS 入门

1. CSS 1.1 概念 CSS&#xff08;Cascading Style Sheet&#xff09;&#xff0c;层叠样式表&#xff0c;用于控制页面的样式 CSS 能够对网页中元素位置的排版进行像素级精确控制&#xff0c;实现美化页面的效果&#xff0c;能够做到页面的样式和结构分离&#xff08;类似于…

slab 缓存以及slabtop 命令学习

一、slab 缓存介绍 1.1、什么是slab 缓存 SLAB缓存是Linux内核中用于优化内存分配和管理的一种机制&#xff0c;特别针对频繁分配和释放的固定大小的小对象。它是基于 通用内存分配器(如伙伴系统) 之上的一个中间层&#xff0c;旨在通过减少分配和释放小对象的开销、降低内存…

【数字图像处理】第5章 图像空域增强方法

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…

十大云手机排行榜:哪个云手机更好用?

近些年&#xff0c;市场上涌现出许多云手机产品&#xff0c;不同产品适合的应用场景也各不相同。在选用云手机之前&#xff0c;企业和个人用户需要了解它们的功能、特点以及适用的场景。本文将对当前主流的云手机进行对比&#xff0c;帮助大家挑选出最适合的云手机产品。 1. 红…

【数据结构与算法】之链表详解

链表是一种常用的数据结构&#xff0c;它是一种线性数据结构&#xff0c;但与数组不同&#xff0c;它并非连续存储数据&#xff0c;而是通过指针将数据节点连接起来。每个节点都包含数据域和指向下一个节点的指针域。这种结构赋予链表独特的优势和局限性&#xff0c;使其在某些…

九种排序,一次满足

我们在算法题进行练习提升时&#xff0c;经常会看到题目要求数据从大到小输出&#xff0c;从小到大输出&#xff0c;前一半从小到大输出&#xff0c;后一半从大到小输出等&#xff0c;那么这时候就需要用到排序算法&#xff0c;通过排序算法将数据按照一定的顺序进行排序。本文…

【C#生态园】提升数据处理效率:C#中多款数据清洗库全面解析

数据清洗利器&#xff1a;探索C#中的多款数据处理库 前言 在现代软件开发中&#xff0c;数据清洗和处理是非常常见的任务。特别是在C#开发中&#xff0c;处理各种数据文件如CSV、Excel等是一个必不可少的环节。为了更高效地完成这些任务&#xff0c;我们需要依赖一些优秀的数…

解决PyCharm 2023 Python Packages列表为空

原因是因为没有设置镜像源 展开 > 之后&#xff0c;这里 点击齿轮 添加一个阿里云的源 最后还需要点击刷新 可以选择下面的任意一个国内镜像源&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/…

设计模式之-策略模式配合枚举

1、定义枚举接收不同的参数使用不同的handler, 2、定义个handerl接口&#xff0c;统一方法处理&#xff0c;每个handler实现该接口 public interface IMethodHandler<T, R> {/*** 处理统一入口** param req*/R process(T req); } java3、定义一个简单工厂统一处理 Comp…

【代码随想录——数组——二刷】

数组 1. 二分查找(704) 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 1.1 二分法的第一种写法 我们定义 target 是在…

送给正在入行的小白:最全最有用的网络安全学习路线已经安排上了,零基础入门到精通,收藏这一篇就够了

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发安全研究&#xff1a;二进制方向安全研究&#xff1a;网络渗透方向 下面逐一说明一下。 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#xf…