Spring中的ref和depends-on区别

参考:http://yanln.iteye.com/blog/2210723
这两者都是表示对其他bean的依赖,但是ref常用的情况是这个bean作为当前bean的属性,比如:

<bean id="a" class="ClassA"/>
<bean id="b" class="ClassB">
<property name="aref" ref="a" />
</bean>

这是很强的一个依赖关系了,但是有时候依赖关系并不会这么明显,我们依赖的bean也许并不是我们当前bean的属性,比如当前bean B,我们需要初始化一些值,这些值的初始化是依赖于bean A的,那么我们的bean B肯定是依赖于A的,但是A并不是B的什么,这个时候用ref肯定是不合适的,就可以用depends-on


举个例子:某个论坛拥有很多系统参数:

public class SystemSettings{  
           //缓存更新时间  
           public static int REFRESH_CYCLE = 60;  
           ......  
} 

现在我们这些参数不再是写死的,需要在后台对这些参数进行管理:管理员可以对这些参数进行更改,并且会存储入库,系统启动的时候,会从数据库加载这些参数,假设加载参数的类是SystemInit

public class SystemInit{  
          public SystemInit(){  
                     //模拟从数据库中加载的系统参数配置值  
                     SystemSettings.REFRESH_CYCLE=100;  
                     ......  
          }  
}  

我们的系统现在有一个定时配置刷新器,用于定时刷新这些配置:

    public class CacheManager{  
          public CacheManager(){  
                    Timer t = new Timer();  
                    TimerTask cacheTask = new CacheTask();                      
                     //缓存刷新定时处理  
                    t.schedule(cacheTask,0,SystemSettings.REFRESH_CYCLE);  
          }  
          ......  
}  

在这个例子中,我们的CacheManager如果想要获取最新配置,必须用到SystemSettings的值,而这个值需要用到我们的Bean SystemInit,SystemInit并不属于我们的CacheManager的属性或者其他的什么。但是逻辑上SystemInit是要先于CacheManager加载的,这个时候就可以用dependds-on了:

<bean id="sysinit" class="SystemInit">  

<bean id="manager" class="CacheManager"  depends-on="sysinit"/>  

除此之外,使用了depends-on的时候,依赖他人的bean是先于被依赖bean销毁的

总结:depends-on适用于表面上看起来两个bean之间没有使用属性之类的强连接的bean,但是两个bean又确实存在前后依赖关系的情况,使用了depends-on的时候,依赖他人的bean是先于被依赖bean销毁的

猜你喜欢

转载自blog.csdn.net/u014473112/article/details/80662728
今日推荐