BeanNameAware介面和BeanFactoryAware介面(轉)

langgufu314發表於2012-04-26
迄今為止,所接觸到的Bean都是“無知覺”的,就像黑客帝國中機械工廠裡面“養殖”的人類,他們雖然能完成一定的功能,但是根本不知道自己在工廠(BeanFactory)中的代號(id),或者自己是在哪個工廠(BeanFactory的引用)中沉睡。所以,本節的目的就是要創造出一個尼奧一樣的Bean,讓他知道自己在工廠中的id和自己原來躺在哪個工廠中。這裡,稱之為,Bean對Spring有知覺。
但是有言在先,如果要在Spring容器中做到這兩點,當然,可以自己通過某些方法實現,代價是大量冗餘程式碼,好處是跟Spring解耦。如果使用Spring提供的介面,好處當然減少程式碼的規模,“缺點”(如果算的話)是與Spring耦合。總之,無論採取那種辦法還是要看實際需要。
/////////////////////
讓Bean對Name有知覺
/////////////////////
作用:讓Bean獲取自己在BeanFactory配置中的名字(根據情況是id或者name)。


實現:通過實現BeanNameAware介面,介面中就一個方法setBeanName()
例程如下(P100,程式碼清單5-11,部分)

public class LogginBean implements BeanNameAware {

private String beanName = null;

public void setBeanName(String beanName) {

this.beanName = beanName;

}

}


額外說明:

Spring自動呼叫。並且會在Spring自身完成Bean配置之後,且在呼叫任何Bean生命週期回撥(初始化或者銷燬)方法之前就呼叫這個方法。換言之,在程式中使用BeanFactory.getBean(String beanName)之前,Bean的名字就已經設定好了。所以,程式中可以盡情的使用BeanName而不用擔心它沒有被初始化。


當然,Bean之中一定要有個String型別變數來儲存BeanName的值,這個是在編寫Bean程式碼時有程式設計師手工完成的,而不是通過什麼特殊的餓配置。


通常都是為了更好的餓配置Log,但是請注意,不要只是因為配合Log就把bean那麼中新增任何業務含義,否則會讓你自己的類關聯到某個Spring特性上去,而它帶來的好處卻是微不足道的。如果確實需要Bean帶有某種內部名稱,那麼最好讓Bean自己實現某個方法,例如setName(),然後使用DI給每個Bean注入一個名字,這樣技能保持配置Bean的名字仍然能夠簡潔,且你也無需修改自己的配置檔案,好讓Bean的名字帶有業務含義。
////////////////////////////////

讓Bean對工廠有知覺

////////////////////////////////
作用:讓Bean獲取配置他們的BeanFactory的引用。


實現:實現BeanFactoryAware介面,其中只有一個方法即setFactory(BeanFactory factory)。使用上與BeanNameAware介面無異,只不過BeanFactoryAware注入的是個工廠,BeanNameAware注入的是個Bean的名字。


額外說明:

雖然原書中並未提及setFactory()方法的呼叫時機,但是可以猜想到,這個方法可能是在根據某個配置檔案建立了一個新工廠之後,Spring才呼叫這個方法,並把BeanFactory注入到Bean中。


讓bean獲取配置自己的工廠之後,當然可以在Bean中使用這個工廠的getBean()方法,但是,實際上非常不推薦這樣做,因為結果是進一步加大Bean與Spring的耦合,而且,能通過DI注入進來的儘量通過DI來注入。


當然,除了查詢bean,BeanFactory可以提供大量其他的功能,例如銷燬singleton模式的Bean。
補充說明:
factory.preInstantiateSingletons();方法。preInstantiateSingletons()方法立即例項化所有的Bean例項,有必要對這個方法和Spring載入bean的機制做個簡單說明。


方法本身的目的是讓Spring立即處理工廠中所有Bean的定義,並且將這些Bean全部例項化。因為Spring預設例項化Bean的情況下,採用的是lazy機制,換言之,如果不通過getBean()方法(BeanFactory或者ApplicationContext的方法)獲取Bean的話,那麼為了節省記憶體將不例項話Bean,只有在Bean被呼叫的時候才例項化他們。

相關文章