Springでのrefとdepends-onの違い

3579 ワード

参照先:http://yanln.iteye.com/blog/2210723 どちらも他のbeanへの依存を表すが、refでよく使われるのは、このbeanが現在のbeanの属性として使用される場合である.例えば、
id="a" class="ClassA"/>
id="b" class="ClassB">
<property name="aref" ref="a" />

これは強い依存関係ですが、依存関係はそれほど明らかではありません.私たちが依存している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を使用することができます.
id="sysinit" class="SystemInit">  

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

それ以外に、depends-onを使用した場合、他人に依存するbeanは依存beanによって破棄される前のまとめである:depends-onは表面的には2つのbeanの間に属性などの強い接続がないように見えるbeanに適用されるが、2つのbeanは確かに前後の依存関係が存在する場合があり、depends-onを使用した場合、他人に依存するbeanは依存beanによって破棄される前のものである