Bean之间主要有继承和依赖的关系,这里的继承并不是我们面向对象里面所提到的继承。
继承
我们先来创建一个新的配置文件beans-relation.xml
- <bean id="address" class="com.figsprite.bean.autowire.Address"
- p:city="福州" p:street="闽侯"/>
- <bean id="address2" class="com.figsprite.bean.autowire.Address"
-
p:city="福州" p:street="晋江"/>
在Main.java测试一下有没有问题:
- ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-relation.xml");
- Address address = (Address)ctx.getBean("address");
- Address address2 = (Address)ctx.getBean("address2");
- System.out.println(address);
-
System.out.println(address2);
现在咱们看看这两个Address容器,大部分的属性配置是一样的,所以我们就想,在id="address2"中能不能只配id和p:street,其他的就用之前id="address"配置好的呢?这就是标签之间的继承关系,可以用到parent属性
- <bean id="address" class="com.figsprite.bean.autowire.Address"
- p:city="福州" p:street="闽侯"/>
-
<bean id="address2" p:street="晋江" parent="address" />
输出也是没有问题的:
Address{city='福州', street='闽侯'}
Address{city='福州', street='晋江'}
针对继承Bean配置我们需要注意一下几点:
- 子Bean从父Bean中继承配置,包括Bean的属性配置。
- 子Bean也可以覆盖父Bean继承过来的配置。
- 父Bean可以作为配置模板,也可以作为Bean实例。如果只想把父Bean作为模板,可以设置<bean>的abstract属性为true,这样Spring不会实例化这个Bean。
- 不是<bean>元素里面的所有属性都会被继承,比如autowire,abstract等
- 可以忽略父Bean中的class属性,让子Bean指定自己的类,而共享相同的属性配置,但此时abstract必须为true,也可以这么说若某个bean的class属性没有指定,则该bean必须是一个抽象bean
依赖
我们来定义一个person容器对象,若现在有个新要求,要求Person,必须要有一个关联的Car即Person依赖于Car这个bean
- <bean id="car" class="com.figsprite.bean.autowire.Car"
- p:brand="奥迪" p:price="233"/>
- <bean id="person" class="com.figsprite.bean.autowire.Person"
- p:name="小明" p:address-ref="address2" depends-on="car"/>
Spring允许用户通过depends-on属性设定Bean前置依赖的Bean,这个前置依赖的Bean'会在本Bean的实例化前创建好,如果前置依赖于多个Bean,则可以通过逗号隔开,
上面的例子中虽然打印出来的car属性依旧是空值,不过如果我们删去<bean id="car">就会报错