面試題:BeanFactory與FactoryBean
Spring
BeanFactory
是工廠類(介面),用於管理bean的工廠,是Spring IOC的核心,用於實例化、定位、配置對象,以及建立對象間的關係。
BeanFactory實例化Bean的過程:
1、 調用bean的默認構造方法(或指定的構造方法),生成bean1。
2、 將配置文件中配置的屬性值注入bean1,生成bean2。
3、 如bean實現了InitalizingBean介面,則執行afterPropertiesSet()方法,生成bean3。
4、 如配置文件配置了init-method屬性,則執行指定的方法,生成bean4。
構造函數-->set-->InitalizingBean#afterPropertiesSet()-->init-method
FactoryBean
通常來講,根據XML的<bean>節點中配置的class路徑,Spring可以通過反射機制來實例化。
如:
<bean id="beanA" class="org.leo.BeanA">
<property name="userName" value="leo"/>
</bean>
但實際工作中,實例化一個對象並不如此簡單。比如要在實例化的時候做一些複雜的處理。這就用上FactoryBean了。
比如最常用的Quartz框架,我們在配置調度任務的時候,配置的都是FactoryBean。
FactoryBean隱藏了許多實例化的複雜細節,方便上層調用。
如果在<bean>中配置的是FactoryBean,那麼getBean()返回的其實是FactoryBean#getObject()返回的對象。
如:
<bean id="beanA" class="org.leo.BeanAFactoryBean"/>
getBean("beanA")返回的其實是BeanAFactoryBean#getObject()返回的對象,至於是什麼,就由BeanAFactoryBean來決定了。
要想返回BeanFactory的實例,應該getBean("&beanA")。


TAG:Java個人學習心得 |