1,继承关系
首先从简单的代码来看,有一个Address类,配置文件有两个bean
(1)Address类
package com.zsq; public class Address { private String city; private String street; public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @Override public String toString() { return "Address [city=" + city + ", street=" + street + "]"; } }
(2)配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="address1" class="com.zsq.Address" p:city="贵阳" p:street="喷水池"></bean> <bean id="address2" class="com.zsq.Address" p:city="贵阳" p:street="文昌北路"></bean> </beans>
(3)Main方法
package com.zsq; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml"); Address address = (Address) ctx.getBean("address1"); System.out.println(address); address = (Address) ctx.getBean("address2"); System.out.println(address); } }
运行结果
现在来看一下配置文件
发现对于同一个类型的bean,其中好多地方是相同的,那么就可以使用继承。怎么实现呢?
假设address1我们不修改,使用address2继承address1
(1)我们需要把address2中和address1中相同的去掉:
(2)在address2中声明继承address1,其实就是添加一个属性
修改之后:
此时的结果正常:
•Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean
•子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置
下面再看一个:
•子 Bean 也可以覆盖从父 Bean 继承过来的配置
其实在一个bean中有了parent="address1" 那么除了bean的ID,其他的都是继承父bean的,如果在子bean中添加部分属性,那么就是覆盖了父bean的配置,上面的street就是覆盖了从父bean继承过来的配置。
有的时候不希望某个bean可以实例化,我们把它配置成模版,其他bean从它继承,比如上面的address1,那么怎么设置呢?
只要在想配置的模板bean里面加入abstract="true",那么这个bean就不可以被实例化,但是其他bean可以继承。
如果代码不修改会出错:
•父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean
•并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等.
•也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true。这句的意思就是如果某个bean没有class,一定要有abstract="true"。
2,依赖关系
•Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
•如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称
这个说的是什么意思呢?举个以前的例子吧,一个人,有名字(String),有地址(Address类型),有车(Car类型),现在实例化的时候如果这个人必须有个车的时候,我们可以使用depends-on 属性设定 Person Bean 前置依赖的Car Bean。
主方法中加入:
结果:
上面的配置使用了p:car-ref="car"
但是从配置文件本身表达不出实例化的人必须要有车的这个意图。但是如果像下面的配置,那么就会知道实例化的人必须要有车。
结果却是:
p:car-ref="car"和depends-on="car"的区别比较大。
p:car-ref="car" 说明我不仅想在实例化一个bean的时候先初始化 car 这个bean,而且此bean还是我的一部分
depends-on="car" 仅说明我在实例化一个bean的时候只是想先初始化 car 这个bean,但是我并不是想要这个car bean成为我的一部分。