Spring BeanFactory和FactoryBean區(qū)別解析
BeanFactory接口:
IoC容器的頂級接口,是IoC容器的最基礎(chǔ)實現(xiàn),也是訪問Spring容器的根接口,負責(zé)對bean的創(chuàng)建,訪問等工作。
其實在容器的初始化的時候,會對BeanFactory做很多事情,如:
obtainFreshBeanFactory();獲取BeanFactory;
prepareBeanFactory(beanFactory);BeanFactory的預(yù)準(zhǔn)備工作(BeanFactory進行一些設(shè)置)
postProcessBeanFactory(beanFactory);BeanFactory準(zhǔn)備工作完成后進行的后置處理工作;
invokeBeanFactoryPostProcessors(beanFactory);執(zhí)行BeanFactoryPostProcessor的方法;
BeanFactoryPostProcessor:BeanFactory的后置處理器。在BeanFactory標(biāo)準(zhǔn)初始化之后執(zhí)行的;
FactoryBean接口:
可以返回bean的實例的工廠bean,通過實現(xiàn)該接口可以對bean進行一些額外的操作,例如根據(jù)不同的配置類型返回不同類型的bean,簡化xml配置等。在使用上也有些特殊,BeanFactory接口中有一個字符常量String FACTORY_BEAN_PREFIX = "&"; 當(dāng)我們?nèi)カ@取BeanFactory類型的bean時,如果beanName不加&則獲取到對應(yīng)bean的實例;
如果beanName加上&,則獲取到BeanFactory本身的實例;FactoryBean接口對應(yīng)Spring框架來說占有重要的地位,Spring本身就提供了70多個FactoryBean的實現(xiàn)。他們隱藏了實例化一些復(fù)雜的細節(jié),給上層應(yīng)用帶來了便利。從Spring3.0開始,F(xiàn)actoryBean開始支持泛型。
代碼展示:
//創(chuàng)建一個Spring定義的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
//返回一個Color對象,這個對象會添加到容器中
@Override
public Color getObject() throws Exception {
// TODO Auto-generated method stub
System.out.println("ColorFactoryBean...getObject...");
return new Color();
}
@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Color.class;
}
//是單例?
//true:這個bean是單實例,在容器中保存一份
//false:多實例,每次獲取都會創(chuàng)建一個新的bean;
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return false;
}
}
public class Color {
private Car car;
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Color [car=" + car + "]";
}
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<bean id="colorFactoryBean" class="spring2.ColorFactoryBean"></bean>
</beans>
測試類:
public class Test1 {
ClassPathXmlApplicationContext xmlBeanFactory = null;
@Before
public void initXmlBeanFactory() {
System.out.println("\n========測試方法開始=======\n");
xmlBeanFactory = new ClassPathXmlApplicationContext("spring3.xml");
}
@After
public void after() {
System.out.println("\n========測試方法結(jié)束=======\n");
}
@Test
public void test8() {
System.out.println(xmlBeanFactory.getBean("colorFactoryBean"));
System.out.println("===================");
System.out.println(xmlBeanFactory.getBean("&colorFactoryBean"));
}
}
測試結(jié)果:
========測試方法開始======= 十二月 09, 2019 4:49:52 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2e5c649: startup date [Mon Dec 09 16:49:52 CST 2019]; root of context hierarchy 十二月 09, 2019 4:49:52 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [spring3.xml] ColorFactoryBean...getObject... Color [car=null] =================== spring2.ColorFactoryBean@6ddf90b0 ========測試方法結(jié)束=======
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud實現(xiàn)全鏈路灰度發(fā)布的示例詳解
灰度發(fā)布是指在軟件或服務(wù)發(fā)布過程中,將新版本的功能或服務(wù)以較小的比例引入到生產(chǎn)環(huán)境中,僅向部分用戶或節(jié)點提供新功能的一種發(fā)布策略,下面我們就來學(xué)習(xí)一下SpringCloud如何實現(xiàn)全鏈路灰度發(fā)布2023-11-11
java如何利用poi解析doc和docx中的數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于java如何利用poi解析doc和docx中數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Java 如何將前端傳來的數(shù)字轉(zhuǎn)化為日期
這篇文章主要介紹了Java 如何將前端傳來的數(shù)字轉(zhuǎn)化為日期,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-06-06
Java開發(fā)中讀取XML與properties配置文件的方法
這篇文章主要介紹了Java開發(fā)中讀取XML與properties配置文件的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-01-01
解決@RequestBody接收json對象報錯415的問題
這篇文章主要介紹了解決@RequestBody接收json對象報錯415的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

