Spring 中 BeanFactory 是什么?
BeanFactory
其實就是IoC
的底層容器,它本身只是一個接口,顧名思義Bean工廠,定義了Spring的基本功能框架,主要功能就是
-
負責從配置源中讀取 Bean 的定義,并創建、管理這些 Bean 的生命周期
-
然后是延遲初始化,它只會在 Bean 首次請求時才會實例化該 Bean,而不是在容器啟動時就立即創建所有的Bean
Spring 中的 FactoryBean 是什么?
FactoryBean
是 Spring 提供的一個特殊接口,允許開發者通過自定義的邏輯創建Bean 實例。它提供了更加靈活的初始化定制功能
FactoryBean
接口有幾個主要的方法
-
getObject()
: 返回此工廠創建的對象的實例。該返回值會被存儲到IoC
容器,解決循環依賴的第三級緩存就是工廠bean -
isSingleton()
: 判斷此FactoryBean
是否返回單例 -
getObjectType()
: 返回getObject()
方法返回的對象類型
假設你依賴一個第三方的類HappyMachine,而我們又不能修改第三方的類,并且這個對象創建比較復雜,那么你就可以創建一個 bean 來封裝它:
// 實現FactoryBean接口時需要指定泛型 // 泛型類型就是當前工廠要生產的對象的類型 public class HappyFactoryBean implements FactoryBean<HappyMachine> {private String machineName;public String getMachineName() { ? ? ? ? ?//get setreturn machineName;}public void setMachineName(String machineName) {this.machineName = machineName;}@Overridepublic HappyMachine getObject() throws Exception { ? ?//實例工廠bean,獲取bean// 方法內部模擬創建、設置一個對象的復雜過程HappyMachine happyMachine = new HappyMachine();happyMachine.setMachineName(this.machineName);return happyMachine; ? //返回對象}@Overridepublic Class<?> getObjectType() {// 返回要生產的對象的類型return HappyMachine.class;} }
這樣,我們getBean("A”)
會得到 A FactoryBean#getObject 的結果,如果單純只想要 A的FactoryBean那么加個“&”即可,即 getBean("&A")
ApplicationContext ioc = new ClassPathXmlApplicationContext("...."); ? ? HappyMachine happyMachine = ioc.getBean("happyMachine"); ? ? //返回的是getObject方法返回的對象 ? ? ? ? // &happyMachine7 這是一種固定的約束 ? ?? ? Object bean = iocContainer.getBean("&happyMachine"); ? ?//如果想要獲取FactoryBean對象, 直接在id前添加&符號即可!