BeanNameAware介面和BeanFactoryAware介面(轉)
迄今為止,所接觸到的Bean都是“無知覺”的,就像黑客帝國中機械工廠裡面“養殖”的人類,他們雖然能完成一定的功能,但是根本不知道自己在工廠(BeanFactory)中的代號(id),或者自己是在哪個工廠(BeanFactory的引用)中沉睡。所以,本節的目的就是要創造出一個尼奧一樣的Bean,讓他知道自己在工廠中的id和自己原來躺在哪個工廠中。這裡,稱之為,Bean對Spring有知覺。
但是有言在先,如果要在Spring容器中做到這兩點,當然,可以自己通過某些方法實現,代價是大量冗餘程式碼,好處是跟Spring解耦。如果使用Spring提供的介面,好處當然減少程式碼的規模,“缺點”(如果算的話)是與Spring耦合。總之,無論採取那種辦法還是要看實際需要。
/////////////////////
讓Bean對Name有知覺
/////////////////////
讓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;
}
}
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對工廠有知覺
////////////////////////////////
作用:讓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的機制做個簡單說明。
factory.preInstantiateSingletons();方法。preInstantiateSingletons()方法立即例項化所有的Bean例項,有必要對這個方法和Spring載入bean的機制做個簡單說明。
方法本身的目的是讓Spring立即處理工廠中所有Bean的定義,並且將這些Bean全部例項化。因為Spring預設例項化Bean的情況下,採用的是lazy機制,換言之,如果不通過getBean()方法(BeanFactory或者ApplicationContext的方法)獲取Bean的話,那麼為了節省記憶體將不例項話Bean,只有在Bean被呼叫的時候才例項化他們。
相關文章
- COM 物件 和 介面 (轉)物件
- centos 圖形介面和命令列介面切換(轉載)CentOS命令列
- 轉向Kotlin——類和介面Kotlin
- API介面------外部介面和內部介面區別API
- 『居善地』介面測試 — 2、介面和介面文件概念
- MFC登入介面,跳轉到功能介面
- 【ionic】介面跳轉
- Linux字元介面和圖形介面Linux字元
- RPC介面和http介面的區別RPCHTTP
- 什麼是介面?為什麼使用介面? 什麼時候使用介面?(轉)
- 重繼承、介面和異常處理 (轉)繼承
- 介面和抽象理解抽象
- 抽象類和介面抽象
- abstract類和介面
- 介面和抽象類抽象
- 07圖形化介面和命令列介面操作命令列
- 轉賬介面設計
- 套介面選項(轉)
- 多文件介面(MDI)(轉)
- DeviceIoControl介面(轉)dev
- java介面的妙用 (轉)Java
- 繼承與介面 (轉)繼承
- JDBC介面技術(轉)JDBC
- MySQL 的 API 介面(轉)MySqlAPI
- linux圖形介面和命令列介面切換Linux命令列
- 深入理解java的抽象類和介面(轉載)Java抽象
- 介面和抽象類 (abstract)抽象
- Java繼承和介面Java繼承
- JAVA的類和介面Java
- SATA介面和M.2介面的固態硬碟哪個好?SSD硬碟SATA介面和M.2介面的區別硬碟
- 介面卡模式(類介面卡,物件介面卡,介面介面卡)模式物件
- 轉 介面濫用問題
- MVC下的DAO介面類和SERVICE介面類區別?MVC
- Java Comparable排序介面和Comparator比較器介面Java排序
- 介面和微信有互動,各位都是如何介面測試的?
- java中抽象類和介面Java抽象
- 介面測試工具和使用
- EA UML 介面和實現