网站建设与管理维护 李建青/营销策划公司名称
SpringBoot下类加入容器的几种方式
在 Spring Boot 中,类加入容器的方式不仅多样,而且每种方式都有其特定的使用场景。以下是几种常见的将类加入 Spring 容器的方法及其适用场景:
1. 使用 @Component
及其派生注解
使用场景:当开发者希望以最小的配置将某个类自动注册为 Spring 管理的 Bean 时,可以使用 @Component
注解。对于分层架构的应用程序,推荐使用 @Component
的派生注解,如 @Controller
、@Service
和 @Repository
,它们分别用于标记控制器层、业务逻辑层和服务层的组件。这种方式适用于大多数情况下,特别是当你希望利用 Spring 的自动扫描机制来简化配置时。
@Component
public class MyComponent {// 组件逻辑...
}
为了确保这些带有注解的类能够被 Spring 发现并注册,通常需要在启动类或配置类中添加 @ComponentScan
注解,并指定要扫描的基础包路径。
2. 使用 @Configuration
+ @Bean
使用场景:当需要创建复杂的 Bean 或者 Bean 的初始化逻辑较为复杂时,推荐使用 @Configuration
+ @Bean
的组合。这种方式允许通过 Java 配置类的形式定义 Bean,提供了更强大的控制力和灵活性。例如,当需要根据不同的条件创建不同类型的 Bean 实例,或者需要在 Bean 创建过程中执行额外的初始化操作时,这种方法尤为有用。
@Configuration
public class MyConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}
此外,@Bean
注解还可以接受多个参数,比如 name
用于指定 Bean 的名称,initMethod
和 destroyMethod
分别用于指定初始化和销毁方法等。
3. 使用 @Import
注解
使用场景:@Import
注解主要用于导入其他配置类或普通类到 Spring 容器中。它特别适合于框架级别的扩展,或者当需要从外部模块引入 Bean 时。通过实现 ImportSelector
接口,可以根据条件动态选择要导入的类;而通过实现 ImportBeanDefinitionRegistrar
接口,则可以自定义注册 Bean 的逻辑。
@Import(MyConfig.class)
public class Application {// ...
}
4. 实现 BeanDefinitionRegistryPostProcessor
使用场景:对于需要在 Bean 定义加载完成后对其进行修改或添加新的 Bean 定义的情况,可以通过实现 BeanDefinitionRegistryPostProcessor
接口来实现。这种方式通常用于框架级别的扩展,因为它允许在 Bean 定义加载完成后对其进行修改或添加新的 Bean 定义。
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// 手动注册 Bean 定义AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(MyComponent.class).getBeanDefinition();registry.registerBeanDefinition("myComponent", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 可选实现}
}
5. 使用 FactoryBean
接口
使用场景:当需要创建的对象不能直接通过构造函数或静态工厂方法创建时,可以考虑使用 FactoryBean
接口。这为创建复杂的对象提供了一种途径,尤其是在对象的创建过程涉及到多个步骤或依赖项的情况下。
public class MyFactoryBean implements FactoryBean<MyComponent> {@Overridepublic MyComponent getObject() throws Exception {return new MyComponent();}@Overridepublic Class<?> getObjectType() {return MyComponent.class;}@Overridepublic boolean isSingleton() {return true;}
}
6. 动态注册 Bean
使用场景:有时候,应用程序可能需要在运行时根据某些条件动态地向容器中注册 Bean。这可以通过获取 ApplicationContext
的引用,然后使用 BeanDefinitionRegistry
或 AutowireCapableBeanFactory
来实现。例如,在处理动态加载模块或插件化架构时,这种技术非常有用。
@Autowired
private ConfigurableApplicationContext applicationContext;public void registerBeanAtRuntime() {DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory();beanFactory.registerSingleton("myDynamicComponent", new MyComponent());
}
7. 使用 @Conditional
注解
使用场景:@Conditional
注解允许根据某些条件来决定是否将某个 Bean 注册到容器中。这对于构建支持多环境的应用程序非常重要,因为可以根据环境变量、操作系统类型或其他条件来有条件地注册 Bean。例如,当某个特性仅在特定环境中启用时,可以使用 @ConditionalOnProperty
来控制 Bean 的注册。
@Bean
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
public MyFeature myFeature() {return new MyFeature();
}
8. 使用 @ImportResource
注解
使用场景:如果项目中已经存在 XML 配置文件,可以使用 @ImportResource
注解来导入这些 XML 文件中的 Bean 定义。这种方式可以让开发者逐步迁移旧有的基于 XML 的配置到 Spring Boot 的注解驱动配置中,同时保持现有系统的兼容性。
@Configuration
@ImportResource("classpath:beans.xml")
public class MyConfig {// 其他配置...
}
9. 使用 @Enable*
注解
使用场景:Spring 提供了一系列以 @Enable
开头的注解,如 @EnableScheduling
、@EnableTransactionManagement
等,它们可以用来启用特定的功能或特性。这些注解通常会自动配置相关的基础设施 Bean,从而简化了开发者的配置工作。例如,当需要启用定时任务调度功能时,可以使用 @EnableScheduling
注解。
@Configuration
@EnableScheduling
public class SchedulingConfig {// 配置调度任务...
}
总结
综上所述,Spring Boot 提供了多种方式来将类加入到容器中,每种方式都有其特定的使用场景。选择合适的 Bean 注册方式不仅可以提高开发效率,还能增强应用程序的灵活性和可维护性。开发者应根据具体的应用需求和个人偏好,灵活选择最适合的方式来管理 Bean 的生命周期和依赖关系。例如,在构建微服务架构时,可能会更多地依赖于 @Component
和 @Configuration
+ @Bean
的组合;而在进行框架扩展或插件化开发时,则可能更倾向于使用 @Import
或实现 BeanDefinitionRegistryPostProcessor
接口。此外,随着 Spring Boot 不断发展,新的特性和工具也在不断涌现,开发者应当持续关注官方文档和技术社区,以便及时掌握最新的实践和技术趋势。
相关文章:

SpringBoot下类加入容器的几种方式
SpringBoot下类加入容器的几种方式 在 Spring Boot 中,类加入容器的方式不仅多样,而且每种方式都有其特定的使用场景。以下是几种常见的将类加入 Spring 容器的方法及其适用场景: 1. 使用 Component 及其派生注解 使用场景:当开…...

【Mysql】忘记Root密码后如何不影响数据进行重置密码
方法一:通用方法--启动时跳过权限表 1> 停止数据库 以管理员方式打开cmd!! C:\Users\Administrator>net stop mysql MySQL 服务正在停止.. MySQL 服务已成功停止。 2> 启动时跳过权限表 mysqld --console --skip-grant-tables -…...

宝塔内设置redis后,项目以及RedisDesktopManager客户端连接不上!
项目展现问题: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xxx.宝塔外链.ip.xxxx:6379 redis客户端连接失败: 1、宝塔中确认redis端口已放行 2、修改redis的配置 bind&#x…...

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势
简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势,帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇,审校为邱雪和许东舟。 一、会议介绍 ICPR…...

【深度学习】深刻理解BERT
BERT(Bidirectional Encoder Representations from Transformers)是由Google于2018年提出的一种预训练的语言表示模型,它基于Transformer架构并能够处理自然语言处理(NLP)中的多种任务。BERT的核心创新是其使用了双向编…...

一种基于通义千问prompt辅助+Qwen2.5-coder-32b+Bolt.new+v0+Cursor的无代码对话网站构建方法
前言 今年似乎大模型之间的“内卷”已经有些偃旗息鼓了,各大技术公司逐渐从单纯追求模型参数量的竞赛中抽身,转向更加注重模型的实际应用效果与效率,开始内卷起了LLM“载具” 不知道这个词是不是我第一个发明的哈,总之我更喜欢…...

Java版-图论-最小生成树-Kruskal算法
实现描述 为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。 实现代码 首选我们对所有的边,…...

计算机网络知识总结
1.网络协议是什么? 在计算机网络要做到有条不紊地交换数据,就必须遵守一些约定好的规则,比如交换数据地格式,是否需要发送一个应答信息。这些规则被称为网络协议。 分层结构 应用层:为计算机用户提供服务表示层&…...

普通算法——欧拉筛
欧拉筛 思路: 对欧拉筛的实现,主要是依靠一个数组模拟的栈来实现,核心思路为用栈储存已经发现的素数 在之后的遍历中,即可以素数数组中的数为因数来筛出此素数的倍数 遍历是以当前的 i i i 值为基数,来乘当前素数数…...

【知识科普】DNS(域名解析服务)深入解读
文章目录 概述一、基本概念二、域名解析的原理三、域名解析的类型四、域名解析的常见问题及解决方法五、域名解析的重要性 部署一、准备环境二、安装DNS软件三、配置DNS服务器四、测试DNS解析五、维护和管理DNS服务器 配置文件一、BIND DNS服务器配置文件格式二、Windows系统DN…...

数据结构第一弹-数据结构在不同领域的应用
大家好,今天和大家一起总结一下数据结构在不同领域和场景的应用~ 不同的数据结构适用于解决不同类型的问题,从简单的数组到复杂的图结构,每种数据结构都有其独特的应用场景。 1. 数组与链表 1.1 概念 数组:一种线性数据结构&a…...

如何创建基于udp的客户端和服务端
1.先创建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…...

ThinkPHP框架审计--基础
基础入门 搭建好thinkphp 查看版本方法,全局搜version 根据开发手册可以大致了解该框架的路由 例如访问url http://127.0.0.1:8094/index.php/index/index/index 对应代码位置 例如在代码下面添加新方法 那么访问这个方法的url就是 http://127.0.0.1:8094/index.…...

Java8 CompletableFuture异步编程
文章目录 CompletableFuturede介绍CompletableFuturede使用场景常用异步编程实现方案- Thread- ExecutorService- CountDownLatch- CyclicBarrier- ForkJoinPool- CompletableFuture各种实现方案总结 CompletableFuturede结构结构梳理- Future接口- CompletionStage接口常用方法…...

Java的Mvc整合Swagger的knife4框架
Swagger的介绍 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger,就是把相关的信息存储在它定义的描述文件里面(yml或json格式),再通过维护这个描述 文件可以去更…...

分阶段构建在复杂系统中的应用:以推荐系统为例
引言 在信息技术飞速发展的今天,复杂系统的构建已经成为许多企业和组织面临的重要挑战。复杂系统通常由多个相互依赖、相互作用的组件构成,这些组件在功能上相互关联,形成了一个高度耦合的整体。对于这样的系统,采用分阶段构建的…...

2024年12月9日历史上的今天大事件早读
1447年12月9日 中国明朝皇帝明宪宗出生 1824年12月9日 西属美洲独立战争的阿亚库乔之战爆发 1882年12月9日 中国清代数学家李善兰逝世 1917年12月9日 葡萄牙共和政府垮台 1935年12月9日 红军表示与东北抗联军一致抗日 1935年12月9日 “一二九”运动爆发 1941年12月9日 中…...

快捷构建AI大模型,源码自取可直接运行
Node.js 和 WebSocket 实现一个基于kimi(Moonshot 月之暗大模型)的AI工具 前端:前端界面比较容易,只需要简单的额css js即可,本文使用vue作为作为demo。 后端:我java很垃圾,写不出好的代码&am…...

怎么为开源项目做贡献提PR?
GitHub 慢的话,https://ask.csdn.net/questions/8166374 复刻项目 以 https://github.com/open-frame/uniapp-init 项目为例 复刻完就会在你的仓库里有个同样的项目 拉取复刻下来的项目 然后常规的改动项目、git推送。比如我改了一个忽略文件: 提交…...

如何在 JavaScript 中设置定时器?
在 JavaScript 中,设置定时器通常使用两个内置的函数:setTimeout() 和 setInterval()。它们允许你在指定的时间延迟后执行某个函数或者以某个间隔反复执行某个函数。下面,我将结合实际项目代码示例讲解如何使用它们。 1. setTimeout() — 延…...

【学习路线】Java
Java基础 基础 基础语法 面向对象 集合框架 JCF 进阶 并发编程 JVM 企业级开发 框架 Spring Boot Spring Cloud 分布式 高性能 高可用 安全 基建 Docker 实战 数据库 MySQL Redis 计算机基础 计算机组成原理 操作系统 计算机网络 数据结构与算法 设计模式 参考:…...

[GYCTF2020]Easyphp
[GYCTF2020]Easyphp 知识点 反序列化 、字符逃逸 解题 审代码 <?php error_reporting(0); session_start(); function safe($parm){$array array(union,regexp,load,into,flag,file,insert,"",\\,"*","alter");return str_replace($arr…...

JavaScript 数组的高级用法与最佳实践
在前端开发中,JavaScript 数组是不可或缺的工具。它们不仅用于存储数据,还提供了丰富的方法来操作和处理这些数据。掌握 JavaScript 数组的高级用法和最佳实践对于编写高效、可维护的代码至关重要。本文将深入探讨 JavaScript 数组的高级用法,…...

通信协议 http、tcp、udp
目录 1. 五层网络协议 2. http 3. tcp、udp 4. tcp 3次握手、4次挥手 5. socket 6. httpclient 遇到的问题 1. Q: 使用 EntityUtils.toString(responseEntity, "UTF-8") 中文乱码 2. Q: org.apache.http.NoHttpResponseException: 221.6.16.203:8890 failed …...

Scala的隐式对象和隐式类
1.隐式对象 object Test1 {case class DatabaseConfig(drive:String,url:String)//隐式对象//格式:就是在对象前面加一个 implicit//作用:给函数当默认值implicit object MySqlConfig extends DatabaseConfig("sqlserver.jdbc","localhost:3306")//定义一…...

【AIGC】2016-ACCV-即时追捕:自然环境下的自动唇音同步
2016-ACCV-Out of time: automated lip sync in the wild 摘要1. 引言1.1 相关作品 2. 表示和架构2.1 音频流2.2 视觉流2.3 损失函数2.4 训练 3. 数据集3.1 编制训练数据 4. 实验4.1 确定口型同步误差4.2 应用:主动说话人检测4.3 应用:唇读 5. 结论参考文…...

启智畅想集装箱箱号识别算法,2台相机即可实现较高识别率
启智畅想集装箱箱号识别算法,在货车通道中使用时,一般配备2台相机即可。启智畅想集装箱箱号识别算法,在货车通道中使用时,一般配备2台相机即可实现对集装箱箱号的精准捕捉与识别。这两台相机分别安装在货车通道的后侧和随意侧面&a…...

让IIS支持PUT请求解决IIS里不支持PUT请求的问题405 Method Not Allowed
文章目录 一、问题描述二、解决方案1.删除WebDav模块2.修改Web.config(可选) 一、问题描述 好不容易系统开发好了,兴高采烈地上线,部署好了网站,访问正常,打开方式正确! 但当我修改某些数据时&…...

入门级捡垃圾工作站记录
入门级捡垃圾工作站记录 想法 一直想着拥有有一台自己的多功能机子,一个笔记本很难事事包办,本来打算配一个台式机,后来研究了一下,索性捡垃圾拼装的工作站,性价比更高,稳定性也更强,而且还可…...

2024.12.9——攻防世界ics-06
知识点:index文件 ics 文件(iCalendar 格式文件) bp抓包 密码爆破 题目:云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。 一、解题思路 step 1 打开靶机审题…...