1)继承:
如果多个bean存在相同的配置信息,Spring允许我们定义一个父,子将自动继承父的配置信息。
如下:
<bean
class
=
"com.baobaobao.Car"
id=
"car1"
p:color=
"红色"
p:price=
"200000"
p:brand=
"奥迪"
>
<bean
class
=
"com.baobaobao.Car"
id=
"car2"
p:color=
"白色"
p:price=
"200000"
p:brand=
"奥迪"
></bean></bean>
这两个bean的配置存在大量重复信息,可以通过父子bean很好的消除这种重复配置:
<bean
class
=
"com.baobaobao.Car"
id=
"abstractcar"
p:color=
"黑色"
p:price=
"200000"
p:brand=
"奥迪"
abstract
=
"true"
>
<bean id=
"car1"
p:color=
"红色"
parent=
"abstractcar"
>
<bean id=
"car2"
p:color=
"白色"
parent=
"abstractcar"
>
</bean>
</bean></bean>
Car1跟Car2都继承自abstractcar,Spring会将父bean的配置信息传递给子bean,如果子bean提供了父bean已有的配置信息,那么子bean的会覆盖父bean的
父bean的功能主要是为了简化子bean的配置,所以一般声明为abstract=“true”,表示这个不实例化为一个对应的Bean,如果用户不指定该属性为true,那么IOC容器会实例化一个名叫abstractcar的Bean。
2)依赖
一般情况使用即可建立一个bean对其他bean的依赖关系,Spring负责管理这些Bean的关系,当实例化一个Bean时,Spring保证该Bean所依赖的其他Bean已经初始化。
书上举了一个比较经典而特殊的例子:
例如一个系统,有一个SystemSetting类,
|
public class SystemSetting {
public static int SESSION_TIMEOUT= 30 ;
public static int REFRESH_CYCLE= 60 ;
..... }
|
里面有一些系统参数的默认值。
而这个系统有个管理后台,可以修改这些值保存到数据库中,而有一个SysInit类,在初始化的时候从数据中拿到值,修改SystemSetting的参数
|
public class SysInit {
public SysInit(){
SystemSetting.SESSION_TIMEOUT= 100 ;
SystemSetting.REFRESH_CYCLE= 120 ;
}
}
|
假设这个系统有一个缓存刷新管理器,它需要根据系统参数SystemSetting.REFRESH_CYCLE创建缓存刷新定时任务:
|
public class CacheManager {
public CacheManager(){
Timer timer = new Timer();
TimerTask cacheTask = new CacheTask();
timer.schedule(cacheTask, 0 ,SystemSetting.REFRESH_CYCLE);
}
}
|
在上面的例子中CacheManager依赖于SystemSetting,而SystemSetting的值由SysInit负责初始化,虽然CacheManager不直接依赖于SysInit,但是,从逻辑上讲,CacheManager希望在SysInit加载并完成系统参数设置后再启动,以避免调用不到真实的参数值。如果这三个Bean都在配置中配,如何保证SysInit在CacheManager之前初始化呢
使用depends-on属性可以指定Bean的前置依赖Bean,前置依赖Bean会在本Bean实例化之前创建好:
|
<bean class = "com.baobaobao.CacheManager" id= "manager" depends-on= "sysinit" >
<bean class = "com.baobaobao.SysInit" id= "sysinit" >
</bean></bean>
|
这样配置就哦了,如果前置依赖于多个bean,可以通过逗号,空格,或分号分隔开来。
3)引用
假如一个bean要引用另一个bean的配置的id属性值,可以使用如下配置: