Spring-5:Bean之间的继承与依赖

来源:互联网 发布:淘宝网摩托车专区 编辑:程序博客网 时间:2024/05/13 04:02

在Spring框架中Bean之间的关系分为两种:继承和依赖。

继承

1、继承配置

Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean。子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置。子 Bean 也可以覆盖从父 Bean 继承过来的配置。

<!-- 用parent属性指定继承,子bean可从父bean继承所有配置,也可以覆盖部分配置 --><bean id="address" class="com.atguigu.spring.beans.relation.Address" p:city="NanJing" p:street="NanRuiLu"></bean><bean id="address2" class="com.atguigu.spring.beans.relation.Address" p:street="ZhongShanLu" parent="address"></bean>

这时,address2将继承address并获得address的属性设置,并覆盖了street属性。

这里讲的继承关系和面向对象编程的继承有很大不同。这里的继承的是继承属性配置,并不要求父Bean和子Bean对应的类相同或者有实际上的继承关系,只要拥有一致的属性名和类型即可。不过一般还是不要过于随意的去继承。

2、配置模板

父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean
并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等.

<!-- 用abstract属性设置抽象bean,这种bean和抽象类一样,不能被实例化、只能被继承 --><bean id="car" class="com.atguigu.spring.beans.relation.Car" p:brand="Baoma" p:price="500000" abstract="true"></bean><bean id="car2" class="com.atguigu.spring.beans.relation.Car" parent="car" p:price="300000"></bean>

abstract属性为true的bean不能被实例化,如果执行以下语句,会报错

Car car = (Car) ctx.getBean("car");
3、也可以忽略父Bean 的class 属性,让子Bean指定自己的类,而共享相同的属性配置.但此时abstract 必须设为true。


依赖

Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称
<!-- 用depends-on指定依赖 --><bean id="person" class="com.atguigu.spring.beans.relation.Person" p:name="mike" depends-on="car2,address"></bean>
在bean person被实例化之前,会检测car2和address是否已经实例化,如果没有,则会首先实例化car2和address。
在目前所学的范围内,xml文件中所有的非模板bean在加载xml文件的时候都会被实例化,产生一个对象,这也是bean的默认加载方式,后面的内容中会提到bean也可以被设置为加载xml文件时不自动实例化。这是依赖的作用就体现出来了。

0 0
原创粉丝点击