欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Spring中BeanFactory與FactoryBean有什么區(qū)別

小編給大家分享一下Spring中BeanFactory與FactoryBean有什么區(qū)別,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)建站主要業(yè)務(wù)有網(wǎng)站營銷策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、微信公眾號開發(fā)、微信小程序、H5技術(shù)、程序開發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當(dāng)客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務(wù)的過程中,公司還積累了豐富的行業(yè)經(jīng)驗(yàn)、網(wǎng)絡(luò)營銷推廣資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶服務(wù)和保障體系。 

在Spring中有BeanFactory和FactoryBean這2個(gè)接口,從名字來看很相似,比較容易搞混。

一、BeanFactory

BeanFactory是一個(gè)接口,它是Spring中工廠的頂層規(guī)范,是SpringIoc容器的核心接口,它定義了getBean()、containsBean()等管理Bean的通用方法。Spring的容器都是它的具體實(shí)現(xiàn)如:

  • DefaultListableBeanFactory

  • XmlBeanFactory

  • ApplicationContext

這些實(shí)現(xiàn)類又從不同的維度分別有不同的擴(kuò)展。

1.1、源碼

public interface BeanFactory {

	//對FactoryBean的轉(zhuǎn)義定義,因?yàn)槿绻褂胋ean的名字檢索FactoryBean得到的對象是工廠生成的對象,
	//如果需要得到工廠本身,需要轉(zhuǎn)義
	String FACTORY_BEAN_PREFIX = "&";

	//根據(jù)bean的名字,獲取在IOC容器中得到bean實(shí)例
	Object getBean(String name) throws BeansException;

	//根據(jù)bean的名字和Class類型來得到bean實(shí)例,增加了類型安全驗(yàn)證機(jī)制。
	<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;

	Object getBean(String name, Object... args) throws BeansException;

	<T> T getBean(Class<T> requiredType) throws BeansException;

	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

	//提供對bean的檢索,看看是否在IOC容器有這個(gè)名字的bean
	boolean containsBean(String name);

	//根據(jù)bean名字得到bean實(shí)例,并同時(shí)判斷這個(gè)bean是不是單例
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	//得到bean實(shí)例的Class類型
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	//得到bean的別名,如果根據(jù)別名檢索,那么其原名也會被檢索出來
	String[] getAliases(String name);
}

1.1、使用場景

  • 從Ioc容器中獲取Bean(byName or byType)

  • 檢索Ioc容器中是否包含指定的Bean

  • 判斷Bean是否為單例

二、FactoryBean

首先它是一個(gè)Bean,但又不僅僅是一個(gè)Bean。它是一個(gè)能生產(chǎn)或修飾對象生成的工廠Bean,類似于設(shè)計(jì)模式中的工廠模式和裝飾器模式。它能在需要的時(shí)候生產(chǎn)一個(gè)對象,且不僅僅限于它自身,它能返回任何Bean的實(shí)例。

2.1、源碼

public interface FactoryBean<T> {

	//從工廠中獲取bean
	@NullablegetObject() throws Exception;

	//獲取Bean工廠創(chuàng)建的對象的類型
	@Nullable
	Class<?> getObjectType();

	//Bean工廠創(chuàng)建的對象是否是單例模式
	default boolean isSingleton() {
		return true;
	}
}

從它定義的接口可以看出,FactoryBean表現(xiàn)的是一個(gè)工廠的職責(zé)。 即一個(gè)Bean A如果實(shí)現(xiàn)了FactoryBean接口,那么A就變成了一個(gè)工廠,根據(jù)A的名稱獲取到的實(shí)際上是工廠調(diào)用getObject()返回的對象,而不是A本身,如果要獲取工廠A自身的實(shí)例,那么需要在名稱前面加上'&'符號。

  • getObject('name')返回工廠中的實(shí)例

  • getObject('&name')返回工廠本身的實(shí)例

通常情況下,bean 無須自己實(shí)現(xiàn)工廠模式,Spring 容器擔(dān)任了工廠的 角色;但少數(shù)情況下,容器中的 bean 本身就是工廠,作用是產(chǎn)生其他 bean 實(shí)例。由工廠 bean 產(chǎn)生的其他 bean 實(shí)例,不再由 Spring 容器產(chǎn)生,因此與普通 bean 的配置不同,不再需要提供 class 元素。

2.2、示例

先定義一個(gè)Bean實(shí)現(xiàn)FactoryBean接口

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

MyBean實(shí)現(xiàn)了FactoryBean接口的兩個(gè)方法,getObject()是可以返回任何對象的實(shí)例的,這里測試就返回MyBean自身實(shí)例,且返回前給message字段賦值。同時(shí)在構(gòu)造方法中也為message賦值。然后測試代碼中先通過名稱獲取Bean實(shí)例,打印message的內(nèi)容,再通過&+名稱獲取實(shí)例并打印message內(nèi)容。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class FactoryBeanTest {
    @Autowired
    private ApplicationContext context;
    @Test
    public void test() {
        MyBean myBean1 = (MyBean) context.getBean("myBean");
        System.out.println("myBean1 = " + myBean1.getMessage());
        MyBean myBean2 = (MyBean) context.getBean("&myBean");
        System.out.println("myBean2 = " + myBean2.getMessage());
        System.out.println("myBean1.equals(myBean2) = " + myBean1.equals(myBean2));
    }
}
myBean1 = 通過FactoryBean.getObject()初始化實(shí)例
myBean2 = 通過構(gòu)造方法初始化實(shí)例
myBean1.equals(myBean2) = false

2.3、使用場景

說了這么多,為什么要有FactoryBean這個(gè)東西呢,有什么具體的作用嗎?
FactoryBean在Spring中最為典型的一個(gè)應(yīng)用就是用來創(chuàng)建AOP的代理對象。

我們知道AOP實(shí)際上是Spring在運(yùn)行時(shí)創(chuàng)建了一個(gè)代理對象,也就是說這個(gè)對象,是我們在運(yùn)行時(shí)創(chuàng)建的,而不是一開始就定義好的,這很符合工廠方法模式。更形象地說,AOP代理對象通過Java的反射機(jī)制,在運(yùn)行時(shí)創(chuàng)建了一個(gè)代理對象,在代理對象的目標(biāo)方法中根據(jù)業(yè)務(wù)要求織入了相應(yīng)的方法。這個(gè)對象在Spring中就是——ProxyFactoryBean。

所以,F(xiàn)actoryBean為我們實(shí)例化Bean提供了一個(gè)更為靈活的方式,我們可以通過FactoryBean創(chuàng)建出更為復(fù)雜的Bean實(shí)例。

三、區(qū)別

  • 他們兩個(gè)都是個(gè)工廠,但FactoryBean本質(zhì)上還是一個(gè)Bean,也歸BeanFactory管理

  • BeanFactory是Spring容器的頂層接口,FactoryBean更類似于用戶自定義的工廠接口。

BeanFactoryFactoryBean的區(qū)別確實(shí)容易混淆,死記硬背是不行的,最好還是從源碼層面,置于spring的環(huán)境中去理解。

看完了這篇文章,相信你對“Spring中BeanFactory與FactoryBean有什么區(qū)別”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享名稱:Spring中BeanFactory與FactoryBean有什么區(qū)別
網(wǎng)頁鏈接:http://aaarwkj.com/article24/iggsje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、品牌網(wǎng)站制作、品牌網(wǎng)站建設(shè)、網(wǎng)站建設(shè)面包屑導(dǎo)航、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
欧美中日韩精品免费在线| 久草福利资源在线观看视频| 在线日韩欧美一区二区三区| 亚洲欧美激情国产综合久久| 国产日韩欧在线视频| 亚洲奇米精品一区二区| 亚洲国产在线一区二区| 成人粉嫩av一区二区白浆| 日本高清不卡在线一区二区| 欧美亚洲伊人久久综合| 精品欧美一区二区在线| 天堂中文字幕在线乱码一区| 午夜未满十八禁止观看| 国产成人亚洲精品乱码| 开裆丝袜高跟啪啪高潮av| 人妻少妇偷人精品免费看| 欧美黄色一区二区在线观看| 激情亚洲综合一区二区| 福利一区二区在线视频| 亚洲巨大黑人一区二区三区| 国产日韩欧美高清免费视频 | 日本欧美三级一二三区| 午夜少妇诱惑一区二区三区| 婷婷色悠悠,色悠悠激情啪啪 | 岛国av不卡一二三区| 国产裸体无遮挡免费精品| 亚洲国产精品自拍视频| 欧美国产日韩激情在线| 亚洲天堂av一区二区在线| 亚洲日本熟妇在线视频| 国产自愉自愉免费精品七| 亚洲 精品一区二区| 亚洲一区欧美二区日韩三区| 丰满人妻被猛烈进入中文版| 国产内射一级一片内射高清视频1 亚洲一区二区三区不卡伦理 | 国产在线第一页第二页| 婷婷av一区二区三区| 久碰精品少妇中文字幕av| 日本道视频一区二区三区| 久久久人妻91久久久久| 日韩精品一区二区视频大全|