Spring从零开始学使用系列(五)--Bean定义继承与容器扩展点

1.引言

        Spring框架因其强大的依赖注入和灵活的配置管理而广受欢迎。Bean定义继承容器扩展点是其提供的两个核心特性,它们为开发者在维护大型应用时提供了极大的便利。本文旨在详细探讨这些特性的工作原理和实际应用,帮助开发者更好地理解和利用这些高级功能来优化和定制他们的Spring应用。

2. Bean定义继承的深入探讨

        ·Bean定义继承允许开发者通过“模板”Bean简化共同配置,从而提高配置的复用性和可维护性。这类似于面向对象编程中的类继承,但专注于配置而非行为。

2.1 概念与原理

        在Spring中,可以创建一个父Bean定义,包含一组共享的属性和配置,而子Bean可以继承这些属性,并根据需要覆盖它们。父Bean通常被设置为抽象的,这意味着它不会被实例化,仅作为配置的模板。

2.2 示例:配置继承
<!-- 父Bean定义 -->
<bean id="baseRepository" abstract="true" class="com.example.repository.GenericRepository"><property name="connectionString" value="jdbc:mysql://localhost:3306/myDb"/>
</bean><!-- 子Bean继承父Bean -->
<bean id="userRepository" class="com.example.repository.UserRepository" parent="baseRepository"><property name="table" value="users"/>
</bean>

在上述示例中,userRepository继承了baseRepository的连接字符串,只需指定特有的表名即可。

2.3 应用场景与优势
  • 减少重复配置:集中管理数据库连接、服务接口等常见配置。
  • 提高可维护性:更新父Bean配置,子Bean自动继承变更,简化维护工作。
3. 深入容器扩展点BeanPostProcessor与BeanFactoryPostProcessor
3.1 BeanPostProcessor详解

   BeanPostProcessor提供在Bean初始化前后进行干预的能力,非常适合执行依赖注入后的数据校验或处理Bean的代理。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class ConfigurationApplyingBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 在Bean初始化之前无需特殊处理return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 检查Bean是否实现了Configurable接口if (bean instanceof Configurable) {// 调用配置方法进行额外的设置((Configurable) bean).configure();}return bean;}
}interface Configurable {void configure();
}
3.1.1使用场景和实践意义

        这种实现方式允许开发者针对实现了特定接口的Bean进行自动的后处理,这不仅提高了代码的灵活性和可维护性,还使得BeanPostProcessor的应用更加通用和强大。

3.1.2 应用场景
  • 自定义接口实现的动态配置:适用于需要在运行时根据不同条件动态调整Bean配置的应用。
  • 功能增强和行为修改:对于实现了特定接口的Bean,可以在初始化后自动应用增强或修改其行为,例如添加日志、性能监控等。
3.2 BeanFactoryPostProcessor
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;public class RoleBasedPrototypeEnforcerPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {for (String beanName : beanFactory.getBeanDefinitionNames()) {BeanDefinition definition = beanFactory.getBeanDefinition(beanName);// 检查Bean是否标记为需要原型作用域if (requiresPrototype(definition)) {definition.setScope(BeanDefinition.SCOPE_PROTOTYPE);}}}private boolean requiresPrototype(BeanDefinition definition) {// 检查Bean定义中是否包含特定属性或元数据,标记为需要原型return "true".equals(definition.getAttribute("requiresPrototype"));}
}

        在这个示例中,requiresPrototype方法将检查Bean定义中是否存在特定属性或条件,表明该Bean需要设置为原型作用域。

3.2.1使用场景和实践意义

这种动态检查和配置修改机制特别适用于以下场景:

  • 开发与测试环境中的动态配置更改:在这些环境中,开发者可能需要针对不同的测试场景动态调整Bean的行为和生命周期。
  • 多租户应用中的Bean隔离:在多租户架构中,确保每个租户使用独立的Bean实例可以避免数据泄漏或交叉污染。
4.结语

        掌握Spring的这些高级功能将使您能够构建更加健壮、可维护和灵活的企业级应用。随着对这些功能的深入理解和实践。

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

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

相关文章

学习记录之数学表达式(4)

文章目录 八、min 与 argmin8.1 min8.2 argmin8.3 作业 九、累加、累乘与积分9.1 累加9.2 累乘9.3 定积分9.4 作业 八、min 与 argmin min 和 argmin 在机器学习中常用&#xff1b;max 和argmax 同理&#xff1b; 8.1 min min 是 minimal 的缩写&#xff0c;用于获得集合中的…

5.6代码

1.最大公约数 这个题最重要的是要找到一个区间是1&#xff0c;找到之后就可以直接加次数就可以了 #include <bits/stdc.h>using namespace std;main() {long long n,i,j,a0,b,ans99999;cin>>n;long long s[n],dp[n][n];for(i0;i<n;i){cin>>s[i];if(s[i]1…

sorted_numbers = numbers_int.sort()对不对??不对!!!

不对&#xff0c;numbers_int.sort() 方法会直接修改 numbers_int 列表&#xff0c;并且它不返回任何值&#xff08;在 Python 中&#xff0c;对列表的原地修改方法通常返回 None&#xff09;。因此&#xff0c;将 numbers_int.sort() 的结果赋值给 sorted_numbers 变量会导致 …

238. 除自身以外数组的乘积/41. 缺失的第一个正数

238. 除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&a…

shell常用文件处理命令

1. 解压 1.1 tar 和 gz 文件 如果你有一个 .tar 文件,你可以使用以下命令来解压: tar -xvf your_file.tar在这个命令中,-x 表示解压缩,-v 表示详细输出(可选),-f 后面跟着要解压的文件名。 如果你的 .tar 文件同时被 gzip 压缩了(即 .tar.gz 文件),你可以使用以下…

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程笔记

HarmonyOS NEXT是纯血鸿蒙&#xff0c;鸿蒙原生应用&#xff0c;彻底摆脱安卓 本课程是基于harmony os4的&#xff0c;与next仅部分api有区别 套件 语言&框架 harmony os design ArkTs 语言 ArkUI 提供各种组件 ArkCompiler 方舟编译器 开发&测试 DevEco Studio 开发…

Vue3工程化配置

Vue3工程化配置 目录 Vue3工程化配置创建项目vue-clivite(推荐) 快速体验2和3的差别vue3vue2 ref和reactive 创建项目 vue-cli 具体环境配置请点这里 记得新建配置时这里选vue3 vite(推荐) 注&#xff1a;Vite 需要 Node.js 版本 18&#xff0c;20 1.选定路径后再cmd输入创建…

免费在线录屏、无需注册、免费可用、无限制

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…

羊大师解读,当代年轻人焦虑应对指南

羊大师解读&#xff0c;当代年轻人焦虑应对指南 当代年轻人面临焦虑问题时&#xff0c;羊大师提出以下综合建议&#xff0c;要增强自我认知了解自身的需求和期望&#xff0c;明确自己的价值观和目标。这有助于避免盲目跟风和过度比较&#xff0c;从而减轻不必要的焦虑。 合理规…

apk反编译修改教程系列---修改指定apk 让其开机自动打开运行【十四】

通过前面的几期反编译apk的博文 。应该初步了解反编译apk的一些常识和简单的修改步骤。在与有些工作室合作中。一些客户需要安卓机型开机自动打开运行指定的apk。这类需求常规我们都先要检查apk有没有加密 加固。然后对应修改其中的代码。今天以一款apk实例步骤演示修改的过程 …

c++ 线程同步的临界区应用举例

在C中&#xff0c;临界区通常是通过互斥量&#xff08;mutex&#xff09;来实现的&#xff0c;因为互斥量用于保护代码段&#xff08;即临界区&#xff09;&#xff0c;以确保在任意时刻只有一个线程可以执行该代码段。然而&#xff0c;从技术上来说&#xff0c;"临界区&q…

企业怎样进行IT外包以及IT外包服务内容

在数字化时代的浪潮中&#xff0c;企业逐渐认识到信息技术的关键作用&#xff0c;特别是制造业基地对于IT外包和运维服务的需求持续增长。然而&#xff0c;在诸多可供选择的IT外包和运维方案中&#xff0c;企业如何推动与IT外包公司的合作&#xff1f;本文将深入介绍IT外包方案…

液位开关常开常闭怎么区分

如今随着科学技术的不断发展&#xff0c;液位检测技术也不断改进&#xff0c;液位开关是如今常用的液位检测技术之一&#xff0c;那么液位开关常开常闭怎么区分&#xff1f; 常开液位开关是指在没有液体存在的情况下就处于导通状态。当液体液面上升到液位开关处时&#xff0c;…

C++| std::copy与memcpy区别

前言&#xff1a;最近在读项目源码&#xff0c;发现有些地方用std::copy&#xff0c;有些地方用memcpy。但是并不知道为什么要这样&#xff0c;但是原作者也不认识&#xff0c;就只好自己研究一下了。 std::copy与memcpy区别 对比使用场景使用std::copymemcpy 对比 相同&#…

探索大型语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进展。特别是在信息提取&#xff08;IE&#xff09;任务中&#xff0c;LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文…

跨考专业课142分,上岸重邮!

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学是我的“关门弟子”&#xff0c;小叮当&#xff0c;跨考上岸重邮通信工程&#xff01;从平时和小叮当的交流和测试&#xff0c;就能看出专业课水平&#xff0c;我一直和她开玩笑说&#xff0c;早点遇到我&#xff…

网站为什么需要固态硬盘服务器

首先&#xff0c;SSD没有旋转磁盘&#xff0c;所以它读写数据的速度比HDD快。了解通过选择SSD固态硬盘服务器可以获得的其他潜在好处。 1.更快的速度&#xff1a;固态硬盘服务器上的站点加载速度可以比HDD服务器上的站点快三倍 2.更高的可靠性&#xff1a;由于缺少活动部件&am…

运行容器时发现内存不足(<2G)--docker版本低:重装docker

一、卸载&#xff1a; sudo yum install -y yum-utilssudo yum remove docker-ce docker-ce-cli containerd.iosudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd 二、安装&#xff1a; sudo yum-config-manager --add-repo https://download.docker.com/linux/ce…

如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手

如果你作 为Java程序员曾经遭遇过NullPointerException&#xff0c;请举起手 1.让Optional发光发热&#xff1a;去除代码中对null的检查&#xff0c; 采用防御式检查减少NullPointerException java8实战 书籍 第225页 免费下载链接&#xff1a; https://pan.quark.cn/s/5cf68…

python flask css样式无效

解释&#xff1a; Flask是一个Python的轻量级Web框架&#xff0c;它没有为CSS提供任何内置的支持。如果你在Flask项目中引入了CSS文件&#xff0c;但是这个CSS没有生效&#xff0c;可能的原因有&#xff1a; 路径不正确&#xff1a;你的CSS文件没有放在正确的目录下&#xff0…