欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

FactoryBean?BeanFactory方法使用示例詳解講解

 更新時間:2022年12月29日 16:28:27   作者:刨紅薯的小羊竿爾  
這篇文章主要為大家介紹了FactoryBean?BeanFactory方法使用示例詳解講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、FactoryBean:用來自定義Bean的創(chuàng)建邏輯

FactoryBean是接口,是為IOC容器中的Bean的實(shí)現(xiàn)提供了更加靈活的方式,F(xiàn)actoryBean在IOC容器的基礎(chǔ)上,給Bean的實(shí)現(xiàn)加上了一個簡單工廠模式和裝飾模式。一般情況下實(shí)例化一個Bean對象:Spring通過反射機(jī)制利用bean的class屬性指定實(shí)現(xiàn)類實(shí)例化Bean;在某些情況下,實(shí)例化Bean過程比較復(fù)雜,如果按照傳統(tǒng)的方式,則需要在bean中提供大量的配置信息。配置方式的靈活性是受限的,這時采用編碼的方式可能會得到一個簡單的方案。

Spring為此提供了一個org.springframework.bean.factory.FactoryBean的工廠類接口,用戶可以通過實(shí)現(xiàn)該接口, 然后在getObject()方法中靈活配置,來定制實(shí)例化Bean的邏輯。FactoryBean接口對于Spring框架來說占用重要的地位,Spring自身就提供了70多個FactoryBean的實(shí)現(xiàn)——(xxxFactoryBean)。它們隱藏了實(shí)例化一些復(fù)雜Bean的細(xì)節(jié),給上層應(yīng)用帶來了便利。從Spring3.0開始,F(xiàn)actoryBean開始支持泛型,即接口聲明改為FactoryBean的形式。從BeanFactory及其實(shí)現(xiàn)類的getBean() 方法中獲取到的Bean對象,實(shí)際上是FactoryBean的getObject()方法創(chuàng)建并返回的Bean對象,而不是FactoryBean本身。

public interface FactoryBean<T> {
    String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
    @Nullable
    T getObject() throws Exception;
    @Nullable
    Class<?> getObjectType();
    default boolean isSingleton() {
        return true;
    }
}

方法一:getObject():返回Bean對象;

方法二,getObjectType() :返回的Bean對象的類型;

方法三,isSingleton() :是否是單例對象,true是單例,false是非單例;

實(shí)現(xiàn)SqlSessionFactoryBean:

public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent>

定義TestBean實(shí)現(xiàn)FactoryBean接口并實(shí)現(xiàn)getObject()和getObjectType()方法,其中在getObject()方法中實(shí)例化一個TestBean對象,并對message進(jìn)行了一些特殊處理(區(qū)別于構(gòu)造方法)。

@Component
public class TestBean implements FactoryBean {
    private String message;
    public TestBean() {
        this.message = "通過構(gòu)造方法初始化實(shí)例";
    }
    @Override
    public Object getObject() throws Exception {
        TestBean testBean = new TestBean();
        testBean.message = "通過FactoryBean.getObject()創(chuàng)建實(shí)例";
        // 這里并不一定要返回TestBean自身的實(shí)例,可以是其他任何對象的實(shí)例
        return testBean;
    }
    @Override
    public Class<?> getObjectType() {
        return TestBean.class;
    }
    public String getMessage() {
        return message;
    }
}

TestBean測試類:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class FactoryBeanTest {
    @Autowired
    private ApplicationContext context;
    @Test
    public void test() {
        TestBean myBean1 = (TestBean) context.getBean("testBean");
        System.out.println("myBean1 = " + myBean1.getMessage());
        TestBean myBean2 = (TestBean) context.getBean("&testBean");
        System.out.println("myBean2 = " + myBean2.getMessage());
        System.out.println("myBean1.equals(myBean2) = " + myBean1.equals(myBean2));
    }
}

輸出結(jié)果:

myBean1 = 通過FactoryBean.getObject()初始化實(shí)例
myBean2 = 通過構(gòu)造方法初始化實(shí)例
myBean1.equals(myBean2) = false

結(jié)論:

可見當(dāng)調(diào)用getBean("testBean")時,Spring通過反射機(jī)制發(fā)現(xiàn)TestBean實(shí)現(xiàn)了FactoryBean接口,這時Spring容器就調(diào)用接口方法TestBean#getObject()方法返回,這時返回的并不是FactoryBean本身,而是FactoryBean#getObject()方法內(nèi)部所返回的對象TestBean,相當(dāng)于FactoryBean#getObject()代理了getBean() 方法。如果希望獲取TestBean的實(shí)例,則需要在使用getBean(beanName)方法時在beanName前顯示的加上 "&"前綴,如getBean("&testBean")。

當(dāng)通過getBean()方法獲取到一個Bean時,返回的并不是xxxFactoryBean本身,而是其創(chuàng)建的Bean對象; 如果要獲取xxxFactoryBean對象本身,請在參數(shù)前面加一個&符號來獲取,即:getBean(&BeanName)

二、BeanFactory:負(fù)責(zé)生產(chǎn)和管理bean的一個工廠類頂層接口

BeanFactory是一個負(fù)責(zé)生產(chǎn)和管理bean的一個工廠類(接口)。在Spring中,BeanFactory是IOC容器的核心接口,它的職責(zé)包括:實(shí)例化、定位、配置應(yīng)用程序中的對象及建立這些對象間的依賴。我們通過getBean()方法,傳入?yún)?shù)——bean的名稱或者類型,便可以從Spring容器中來獲取bean。 

BeanFactory是用于訪問Spring容器的根接口,是從Spring容器中獲取Bean對象的基礎(chǔ)接口,提供了IOC容器最基本的形式,給具體的IOC容器的實(shí)現(xiàn)提供了規(guī)范。BeanFactory只是個接口,并不是IOC容器的具體實(shí)現(xiàn),Spring容器給出了很多種 BeanFactory的 擴(kuò)展實(shí)現(xiàn),如:DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。

從類圖中可以看出,我們更常用的ApplicationContext就是一個BeanFactory。ApplicationContext接口由BeanFactory接口派生而來,ApplicationContext包含BeanFactory的所有功能,還提供了以下更多的功能:

1、MessageSource, 提供國際化的消息訪問 ;

2、資源訪問,如URL和文件;

3、事件傳播。

相比BeanFactory,通常建議優(yōu)先使用ApplicationContext。

BeanFactory的一些是實(shí)現(xiàn),除了ApplicationContext,還有很多,例如:

  • AbstractBeanFactory:抽象Bean工廠,絕大部分的實(shí)現(xiàn)類,都是繼承于他
  • DefaultListableBeanFactory:Spring默認(rèn)的工廠類
  • XmlBeanFactory:前期使用XML配置用的比較多的時候用的Bean工廠
  • AbstractXmlApplicationContext:抽象應(yīng)用容器上下文對象
  • ClassPathXmlApplicationContext:XML解析上下文對象,用戶創(chuàng)建Bean對象我們早期寫Spring的時候用它

三、FactoryBean與BeanFactory區(qū)別

BeanFactory是個Factory,也就是IOC容器或?qū)ο蠊S,F(xiàn)actoryBean是個Bean。 在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)來進(jìn)行管理的。但對FactoryBean而言,這個Bean不是簡單的Bean,而是一個能生產(chǎn)或者修飾對象生成的工廠Bean,它的實(shí)現(xiàn)與設(shè)計模式中的工廠模式和修飾器模式類似。

以上就是FactoryBean BeanFactory方法使用示例詳解講解的詳細(xì)內(nèi)容,更多關(guān)于FactoryBean BeanFactory方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論