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被呼叫的時候才例項化他們。
相關文章
- 轉向Kotlin——類和介面Kotlin
- API介面------外部介面和內部介面區別API
- 【ionic】介面跳轉
- 『居善地』介面測試 — 2、介面和介面文件概念
- RPC介面和http介面的區別RPCHTTP
- 轉賬介面設計
- 介面和抽象理解抽象
- 抽象類和介面抽象
- 07圖形化介面和命令列介面操作命令列
- public interface View介面和public interface ViewResolver介面介紹View
- Set介面和常用方法
- 介面和抽象類 (abstract)抽象
- SATA介面和M.2介面的固態硬碟哪個好?SSD硬碟SATA介面和M.2介面的區別硬碟
- MVC下的DAO介面類和SERVICE介面類區別?MVC
- 介面卡模式(類介面卡,物件介面卡,介面介面卡)模式物件
- 高效能USB轉串列埠介面卡,讓USB和序列介面輕鬆實現雙向通訊!串列埠
- 談談Spring中的BeanPostProcessor介面(轉)SpringBean
- Flutter中如何進行介面跳轉Flutter
- 簡單的list介面和edit介面使用java swing實現Java
- 介面測試工具和使用
- java中抽象類和介面Java抽象
- Go 語言 nil 和介面Go
- 介面和抽象類詳解抽象
- Spring MVC 核心類和介面SpringMVC
- Lock介面之Condition介面
- Android開發實現連續跳轉幾個介面後在最後一個介面完美跳回最初的介面Android
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- 介面和微信有互動,各位都是如何介面測試的?
- selenium+python 如何請求介面和獲取介面返回值Python
- 【python介面自動化】- 使用json及jsonpath轉換和提取資料PythonJSON
- Android 跳轉過後關閉本介面Android
- MACH SYSTEMS—匯流排介面轉換工具Mac
- Java基礎-抽象類和介面Java抽象
- ubuntu 介面和終端切換Ubuntu
- Java Comparable 和 Comparator 介面詳解Java
- golang拾遺:指標和介面Golang指標
- Java抽象類和介面 小白版Java抽象
- typescript 介面和物件型別(四)TypeScript物件型別
- Kotlin教程(三)類、物件和介面Kotlin物件