Bean之间的关系
IOC容器中的Bean之前存在两种关系:继承和依赖。
继承
不同于Java中的继承,这里指的是配置上的继承。可以通过parent属性指定要继承的父Bean。可以继承父Bean的配置,但是不是所有的属性都可以被继承,如autowire、abstract,子Bean可以覆盖从父Bean中继承下来的属性。可以配置abstract属性为true使得这个Bean成为抽象Bean,抽象Bean不能被实例化,仅作为模板,用来被继承配置。但是如果一个Bean没有指定class属性,那么必须把它声明为抽象Bean。
假设我们实际开发中遇到如下情况:
配置了5个地址Bean,也可能会有更多,可以看出来他们的属性重复的部分比较多,如果Bean数量很多,并且属性也很多的话,我们的配置文件就会变得复杂,冗余,这时候我们可以使用继承,来简化配置文件:
让address1作为其他4个address的父Bean,然后继承address1的配置。当然也可以添加一个抽象的address作为模板,让其他Bean继承。
注意:抽象Bean是无法实例化的。
依赖
Spring允许用户通过depends-on属性设定Bean前置依赖的Bean,前置依赖的Bean会在本Bean实例化之前创造好。如果有多个依赖的Bean则可以通过逗号或空格的方式配置Bean的名称。
如果depends-on所指定的对象没有就会报错:
依赖并不是装配,从下图的运行结果可以看出,car并没有被装配。只是保证了在person实例化之前,car以及被实例化了。
这个depends-on并不一定要像上面的例子一样,要求A有B的一个引用,也就是不直接依赖也是可以的,它就是保证,B在A实例化之前已经实例化了。