时间:2021-05-02
在 spring 容器中,两个 bean 之间除了通过 <ref> 建立依赖关系外,还存在着一些特殊关系。
1 继承
在面向对象的编程原理中,当多个类拥有相同的方法和属性时,则可以引入父类用于消除重复的代码 。 而在 spring 容器中,如果多个 bean 存在相同的配置信息,我们可以定义一个父 bean ,这样子 bean 将会自动继承父 bean 的配置信息 。
? 1 2 3 4 5 6 7 8 9 <!-- 父 bean--> <bean id="abstractbook" class="net.deniro.spring4.bean.book" p:name="面纱" abstract="true"> </bean> <!-- 子 bean--> <bean id="book1" class="net.deniro.spring4.bean.book" p:press="重庆出版社" parent="abstractbook"/> <bean id="book2" class="net.deniro.spring4.bean.book" p:press="上海译文出版社" parent="abstractbook"/>一般情况下,父 bean 的功能是简化子 bean 的配置,所以设置为抽象类(abstract="true");如果这里没有把父 bean 设置为抽象类,那么 spring 容器会实例化父 bean 。
2 前置依赖
一般情况下,使用 <ref> 来建立 bean 之间的依赖关系, spring 容器负责管理这些关系,当实例化一个 bean 时,容器保证该 bean 所依赖的 bean 都已经完成了初始化工作。
但在某些情况下,bean 之间的依赖关系并没有那么明显。
假设这样一种场景,某系统设置了一些系统参数(如密码有效期、是否开启监控等),这些启动参数用来控制系统的运行逻辑,我们使用一个 setting 类来表示这些参数:
? 1 2 3 4 5 6 7 8 9 10 public class settings { /** * 密码过期时间(单位:天) */ public static int pass_timeout = 30; /** * 是否开启监控 */ public static boolean is_monitor = false; }在此,我们为这些参数设置了默认值。系统还有一个管理后台,管理员可以通过这个后台调整这些系统参数并保存到数据库中。所以应用启动时,需要从数据库中加载这些系统参数:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 public class system { public system() { init(); } /** * 初始化 */ private void init() { //假设这些值来源于数据库 settings.pass_timeout = 20; settings.is_monitor = true; } }系统有一个密码过期管理器,它会根据系统参数中的【密码过期的天数】,来创建检测密码是否过期的定时任务:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class passmanager { int timeout; public passmanager() { timeout = settings.pass_timeout; timertask(); } /** * 检测密码是否过期的定时任务 */ private void timertask() { } public int gettimeout() { return timeout; } }虽然 passmanager 并没有直接依赖于 settings,但从逻辑上来看,passmanager 希望 system 加载初始化系统参数后再启动。
spring 中可以通过 depends-on 属性显式地指定 bean 的前置依赖 bean, 保证这个 bean 在实例化之前,它的前置依赖 bean 已经加载完毕。
? 1 2 3 <bean id="system" class="net.deniro.spring4.bean.system"/> <bean id="manager" class="net.deniro.spring4.bean.passmanager" depends-on="system"/>如果前置依赖于多个 bean ,那么可以通过逗号、空格或分号的方式来配置 bean 名称 。
3 引用 id
假设一个 bean 需要引用另一个 bean 的 id 值(beanname),这一般用于在运行期间在 bean 中通过 getbean(beanname) 方法获取另一个 bean 的情境。
可以这样配置:
? 1 2 3 <bean id="author" class="net.deniro.spring4.bean.author"/> <bean id="book" class="net.deniro.spring4.bean.book" p:authorid="author"/>book 中新增 authorid 属性:
? 1 2 3 4 /** * author bean 的 id */ private string authorid;虽然可以以这种字面值的形式进行设置,但两者之间并没有建立真正的引用关系。所以只有等到具体调用时才会发现配置错误。
spring 提供了 <idref> 元素标签,通过 <idref> 引用另一个 bean 的名称,这样在容器启动时,就会检查引用关系的正确性,可以提前发现错误的配置信息。
? 1 2 3 4 5 6 7 <bean id="author10" class="net.deniro.spring4.bean.author"/> <bean id="book10" class="net.deniro.spring4.bean.book" > <property name="authorid"> <idref bean="author10"/> </property> </bean>如果配置发生错误,spring 容器启动时就会抛出 beandefinitionstoreexception,而且 ide 的xml 分析器也会提前发现引用错误,所以推荐使用 <idref> 元素标签的方式来引用 id。
总结
以上所述是小编给大家介绍的spring bean 之间的特殊关系,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
原文链接:https://www.jianshu.com/p/e283906af3a9
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
bean与spring容器的关系Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,
早以前,Spring推荐使用XML的方式来定义Bean及Bean之间的装配规则,但是在Spring3之后,Spring提出的强大的JavaConfig这种类型安
Spring的配置文件概述简介Spring的配置文件是用于指导Spring工厂进行Bean生成、依赖关系注入及Bean示例分发的”图纸”,他是一个或多个标砖的X
Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素。自动装配模式:有下列
1.在一些特殊的场景中需要动态向spring注册bean2.spring版本2.5.6复制代码代码如下:publicclassServiceServiceImp