springBeanFactoryAware
(轉)要直接在自己的代碼中讀取spring的bean,我們除了根據常用的set外,也可以通過spring的BeanFactoryAware接口實現,只要實現setBeanFactory方法就可以,
- private BeanFactory beanFactory;
- public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
- this.beanFactory = beanFactory;
- }
這樣我們就可以直接拿東西用了,如
- Object object = beanFactory.getBean(beanName);
我們既然可以通過set來拿到我們要的對象,為什么還要用這個beanFactory呢,道理很簡單,因為有些情況是需要動態的去獲取
對象的,比如說我有10個銀行的處理對象,他們都繼承了我的BankService對象,但是具體處理的時候要哪家銀行的對象呢?這個依賴于用戶的選擇。
你可以注入10個BankService實例,然后用if --else來搞,不過那樣太坨了。每增加一家銀行你都需要改代碼。
通過beanFactory的話,那就一行代碼搞定,只要給beanName就OK了,動點腦筋吧beanName配置的有規律點,然后根據用戶的銀行選擇,湊出個beanName,大功告成了!
另外注意:
使用ClassPathXmlApplicationContext 加載bean.xml文件才能將實現BeanFactoryAware接口的bean的BeanFactory注入進去。
spring的IoC容器核心為BeanFactory接口,該接口的最常用實現是XmlBeanFactory類,該類使用xml配置文件來初始化一個BeanFactory實例。
ApplicationContext是對BeanFactory接口的擴展,在大多數的應用中,使用ApplicationContext的優先級要高于BeanFactory,兩者對比如下:
特性 |
BeanFactory |
ApplicationContext |
Bean 實例化/裝配 |
Yes |
Yes |
自動 BeanPostProcessor 注冊 |
No |
Yes |
自動 BeanFactoryPostProcessor 注冊 |
No |
Yes |
便捷的 MessageSource 訪問( i18n) |
No |
Yes |
ApplicationEvent 發送 |
No |
Yes
|
文章列表