当前位置: 首页 > news >正文

7、IOC 之Bean定义继承 parent

7、IOC 之Bean定义继承 parent

bean定义可以包含许多配置信息,包括构造函数参数,属性值和特定于容器的信息,例如初始化方法,静态工厂方法名称等。

子bean从父bean继承配置数据。 子bean可以根据需要覆盖某些值或添加其他值。

Spring Bean 定义继承与 Java 类继承无关,但继承概念是相同的。 可以将父bean定义为模板,其他子bean可以从父bean继承所需的配置。

使用基于XML的配置元数据时,带有 parent 属性的 <bean/> 为子bean,并将父bean指定为此属性的值。

<bean id="inheritedTestBean" abstract="true"
        class="org.springframework.beans.TestBean">
    <property name="name" value="parent"/>
    <property name="age" value="1"/>
</bean>

<bean id="inheritsWithDifferentClass"
        class="org.springframework.beans.DerivedTestBean"
        parent="inheritedTestBean" init-method="initialize">  
    <property name="name" value="override"/>
    <!-- age 属性值 1 将从父项继承 -->
</bean>

子 Bean 定义从父级继承作用域、构造函数参数值、属性值和方法重写,并可以选择添加新值。你指定的任何作用域、初始化方法、销毁方法或静态工厂方法设置都会覆盖相应的父设置。

其余设置始终从子定义中获取:依赖于,自动装配模式,依赖项检查,单例,惰性初始化。

上面的示例通过使用abstract 属性将父bean定义显式标记为抽象bean。 如果父定义没有指定类,则需要将父类定义显式标记为抽象bean,如下所示:

<bean id="inheritedTestBeanWithoutClass" abstract="true">
    <property name="name" value="parent"/>
    <property name="age" value="1"/>
</bean>

<bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"
        parent="inheritedTestBeanWithoutClass" init-method="initialize">
    <property name="name" value="override"/>
    <!-- age 属性值 1 将从父项继承 -->
</bean>

父 bean 不能单独实例化,因为它不完整,并且还显式标记为 abstract。当定义 abstract bean时,它只能作为纯模板bean定义使用,作为子定义的父定义。尝试单独使用这样的 abstract 父Bean,通过将其引用为另一个bean的ref属性,或者对父 Bean 的 id 执行显式 getBean() 调用,将返回一个错误。类似地,容器的内部方法 preInstantiateSingletons() 会忽略定义为抽象的 Bean 定义。

ApplicationContext 默认情况下,预实例化所有单例。因此,重要的是(至少对于单例 Bean 而言),如果有一个(父)Bean 定义,并且打算仅将其用作模板,并且此定义指定了一个类,则必须确保将 abstract 属性设置为 true,否则应用程序上下文将实际(尝试)预先实例化 Bean。

相关文章:

  • J9数字论:模块化公链能否成为公链新趋势?
  • UVM环境中reset复位的处理
  • 示波器探头的选择和作用及原理
  • 新学期,我的FLAG不能倒~
  • 好心情精神心理科医生:精神病人为何会出现幻觉?
  • java计算机毕业设计ssm电子元件仓库管理系统
  • 数据结构与算法--数组
  • jvm oom内存溢出,导出dump,使用mat进行问题分析
  • 百钱百鸡问题(C++枚举法)
  • 基于SSM实现智慧幼儿园信息管理系统
  • 九月组队学习计划!
  • OJ在线编程输入输出(Java版)
  • Matlab代码批处理中国地面气象日值数据集(2400站点数据集),提取所需省份全部站点数据
  • 链表之头指针、头结点、首元结点、空链表
  • 【Linux】静态库与共享库
  • 分享的文章《人生如棋》
  • crontab执行失败的多种原因
  • css的样式优先级
  • gcc介绍及安装
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Mocha测试初探
  • Promise初体验
  • Python语法速览与机器学习开发环境搭建
  • 分享几个不错的工具
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 入手阿里云新服务器的部署NODE
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 异常机制详解
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​secrets --- 生成管理密码的安全随机数​
  • # include “ “ 和 # include < >两者的区别
  • (39)STM32——FLASH闪存
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Forward) Music Player: From UI Proposal to Code
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)计算机毕业设计ssm电影分享网站
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)socket Aio demo
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .aanva
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net framework4与其client profile版本的区别
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .netcore 获取appsettings
  • /etc/skel 目录作用
  • ??myeclipse+tomcat
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)