Spring中depends-on的作用是什么?

原址:点击打开链接

spring的IOC容器负责bean的管理,当实例化一个bean是,spring保证该Bean所依赖的其他bean已经初始化。一般情况下,用<ref>元素建立对其他bean的依赖关系。

比如:

 

Xml代码   收藏代码
  1. <bean id="a"   class="com.yanln.spring.bean.A">   </bean>  
  2.       
  3. <bean id="b" class="com.yanln.spring.bean.B" p:a-ref="a"> </bean>  

 

 但在某些情况下,这种bean之间的依赖关系并不那么明显。

举个例子:某个论坛系统拥有很多系统参数(如会话过期时间、缓存更新时间等),这些系统参数用于控制系统的运行逻辑。比如:

 

Java代码   收藏代码
  1. public class SystemSettings{  
  2.            //缓存更新时间  
  3.            public static int REFRESH_CYCLE = 60;  
  4.            ......  
  5. }  

 

SystemSettings中为每一个系统参数提供了默认值,但对于一个灵活的论坛是需要提供一个管理后台的,在管理后台中可以调整这些系统参数并保存到后台数据库中,而在系统启动时,初始化程序从数据库后台加载这些系统参数的值来覆盖系统默认值。比如:

 

 

Java代码   收藏代码
  1. public class SystemInit{  
  2.           public SystemInit(){  
  3.                      //模拟从数据库中加载的系统参数配置值  
  4.                      SystemSettings.REFRESH_CYCLE=100;  
  5.                      ......  
  6.           }  
  7. }  

 

假设论坛系统有一个缓存刷新管理器,它需要根据系统参数SystemSettings.REFRESH_CYCLE创建缓存刷新定时任务:

 

 

Java代码   收藏代码
  1. public class CacheManager{  
  2.           public CacheManager(){  
  3.                     Timer t = new Timer();  
  4.                     TimerTask cacheTask = new CacheTask();                      
  5.                      //缓存刷新定时处理  
  6.                     t.schedule(cacheTask,0,SystemSettings.REFRESH_CYCLE);  
  7.           }  
  8.           ......  
  9. }  

 

在以上的实例中,CacheManager类需要用到SystemSetting类的值,而SystemSettings的值有SystemInit负责初始化,虽然CacheManager不直接依赖SystemInit,但从逻辑上看,CacheManager希望在SystemInit加载并完成系统参数设置后再启动,以获得最新的系统参数值。如果这三个bean都在spring配置文件中定义,我们如何保证SystemInit在CacheManager之前进行初始化呢?

 

spring允许用户通过depends-on属性指定bean前置依赖的bean,前置依赖的bean会在本bean实例化之前创建好:

 

Xml代码   收藏代码
  1. <bean id="sysinit" class="SystemInit">  
  2.   
  3. <bean id="manager" class="CacheManager"  depends-on="sysinit"/>  

 

如果前置依赖于多个 Bean,则可以通过分号,逗号或空格的方式配置 Bean 的名称。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值