Spring BeanFactory和FactoryBean區(qū)別解析
BeanFactory接口:
IoC容器的頂級接口,是IoC容器的最基礎(chǔ)實現(xiàn),也是訪問Spring容器的根接口,負責對bean的創(chuàng)建,訪問等工作。
其實在容器的初始化的時候,會對BeanFactory做很多事情,如:
obtainFreshBeanFactory();獲取BeanFactory;
prepareBeanFactory(beanFactory);BeanFactory的預(yù)準備工作(BeanFactory進行一些設(shè)置)
postProcessBeanFactory(beanFactory);BeanFactory準備工作完成后進行的后置處理工作;
invokeBeanFactoryPostProcessors(beanFactory);執(zhí)行BeanFactoryPostProcessor的方法;
BeanFactoryPostProcessor:BeanFactory的后置處理器。在BeanFactory標準初始化之后執(zhí)行的;
FactoryBean接口:
可以返回bean的實例的工廠bean,通過實現(xiàn)該接口可以對bean進行一些額外的操作,例如根據(jù)不同的配置類型返回不同類型的bean,簡化xml配置等。在使用上也有些特殊,BeanFactory接口中有一個字符常量String FACTORY_BEAN_PREFIX = '&'; 當我們?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定義的FactoryBeanpublic 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 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í)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 如何基于python3和Vue實現(xiàn)AES數(shù)據(jù)加密2. 10個提供免費PHP腳本下載的網(wǎng)站3. PHP擴展之APC——Alternative PHP Cache(可選PHP緩存)4. PHP設(shè)計模式(四)原型模式Prototype實例詳解【創(chuàng)建型】5. Java 基于UDP協(xié)議實現(xiàn)消息發(fā)送6. Python編寫nmap掃描工具7. Java向Runnable線程傳遞參數(shù)方法實例解析8. python 爬取嗶哩嗶哩up主信息和投稿視頻9. ASP.NET MVC前臺動態(tài)添加文本框并在后臺使用FormCollection接收值10. php5.6不能擴展redis.so的解決方法
