最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的FactoryBean實現(xiàn)原理詳解

 更新時間:2024年02月14日 08:50:49   作者:軍偉@  
這篇文章主要介紹了Spring中的FactoryBean實現(xiàn)原理詳解,spring中有兩種類型的Bean,一種是普通的JavaBean,另一種就是工廠Bean(FactoryBean),這兩種Bean都受Spring的IoC容器管理,但它們之間卻有一些區(qū)別,需要的朋友可以參考下

1、概述

spring中有兩種類型的Bean:

  1. 一種是普通的JavaBean;
  2. 另一種就是工廠Bean(FactoryBean)

這兩種Bean都受Spring的IoC容器管理,但它們之間卻有一些區(qū)別。

2、詳述

普通的JavaBean不再多說,我們將其定義好,然后在配置文件中定義并配置其依賴關系,就可以通過IoC容器的getBean獲取到。

那么FactoryBean呢?

FactoryBean跟普通Bean不同,它是實現(xiàn)了FactoryBean<T>接口的Bean,通過BeanFactory類的getBean方法直接獲取到的并不是該FactoryBean的實例,而是該FactoryBean中方法getObject返回的對象。但我們可以通過其它途徑獲取到該FactoryBean的實例,方法就是在通過getBean方法獲取實例時在參數(shù)name前面加上“&”符號即可。

FactoryBean接口提供的方法如下:

public interface FactoryBean<T> {
	//獲取FactoryBean初始化的Bean實例
	T getObject() throws Exception;
	//獲取Bean實例的類型
	Class<?> getObjectType();
	//判斷是否是單例模式
	boolean isSingleton();
}

3、示例

創(chuàng)建MyFactoryBean

public class MyFactoryBean implements FactoryBean<Date>,BeanNameAware {  
    private String name;  
    @Override  
    public Date getObject() throws Exception {  
        return new Date();  
    }  
    @Override  
    public Class<?> getObjectType() {  
        return Date.class;  
    }  
    @Override  
    public boolean isSingleton() {  
        return false;  
    }  
    public void sayName() {  
        System.out.println("My name is " + this.name);  
    }  
    @Override  
    public void setBeanName(String name) {  
        this.name = name;  
    }  
}  

在Spring的配置文件ApplicationContext.xml中注入MyFactoryBean

<bean id ="myFactoryBean" class="com.xxxx.MyFactoryBean"></bean>

測試代碼

public class MainFactoryBean {
 
	@SuppressWarnings("resource")
	public static void main(String [] args){  
		ApplicationContext appCtx = new ClassPathXmlApplicationContext("applicationContext.xml");
	    Date now = (Date) appCtx.getBean("myFactoryBean");  
	    System.out.println(now);  
	    MyFactoryBean factoryBean = (MyFactoryBean) appCtx.getBean("&myFactoryBean");  
	    factoryBean.sayName();  
	}  
}

運行結果

通過myFactoryBean名稱獲取到的Bean是Date對象實例,通過&myFactoryBean獲取到的是MyFactoryBean對象實例。

4、實現(xiàn)原理

我們來看一下執(zhí)行Date now = (Date) appCtx.getBean("myFactoryBean");  時會做的處理操作。 AbstractBeanFactory中會進行一系列的操作。

getBean獲取bean

@Override
	public Object getBean(String name) throws BeansException {
		return doGetBean(name, null, null, false);
	}

doGetBean中獲取bean實例

protected <T> T doGetBean(
			final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {
		.........//省略部分代碼
		bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		.........//省略部分代碼
		return (T) bean;
	}

getObjectForBeanInstance中會選擇bean實例是普通的Bean還是FactoryBean,同時通過判斷name中是否有&來選擇判斷是或者FactoryBean還是其getObject方法中獲取的bean

protected Object getObjectForBeanInstance(
			Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {
		.........//省略部分代碼
		//判斷bean類型是否是FactoryBean,或者name是否是以&開頭,如果是則直接返回
		if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
			return beanInstance;
		}
		//如果是則從getObjectFromFactoryBean中獲取
		if (object == null) {
			// Return bean instance from factory.
			FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
			if (mbd == null && containsBeanDefinition(beanName)) {
				mbd = getMergedLocalBeanDefinition(beanName);
			}
			boolean synthetic = (mbd != null && mbd.isSynthetic());
			object = getObjectFromFactoryBean(factory, beanName, !synthetic);
		}
		return object;
	}

getObjectFromFactoryBean接下來會執(zhí)行FactoryBean的getObject方法獲取bean了。

protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
		.........//省略部分代碼				
		Object object = doGetObjectFromFactoryBean(factory, beanName);
		.........//省略部分代碼
		return object;
	}
	
private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)
			throws BeanCreationException {
		Object object;
		.........//省略部分代碼
		//調用Factory的getObject方法
		object = factory.getObject();
		.........//省略部分代碼
		return object;
	}

總結

Spring對FactoryBean的實現(xiàn)機制是當你獲取一個Bean時,如果獲取的Bean的類型是FactoryBean,并且其name中并沒有&則調用bean的getObject方法獲取FactoryBean實現(xiàn)類中提供bean,否則就是直接返回普通的bean類型。

到此這篇關于Spring中的FactoryBean實現(xiàn)原理詳解的文章就介紹到這了,更多相關FactoryBean實現(xiàn)原理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中截取字符串方法的兩種用法

    Java中截取字符串方法的兩種用法

    這篇文章主要給大家介紹了關于Java中截取字符串方法的兩種用法,在Java開發(fā)中經(jīng)常會涉及到對字符串進行截取操作,字符串截取是一種常見且重要的字符串處理技巧,可以根據(jù)實際需求獲取字符串的指定部分,需要的朋友可以參考下
    2023-09-09
  • 一文帶你深入了解Java的自動拆裝箱

    一文帶你深入了解Java的自動拆裝箱

    Java推出了對于基本數(shù)據(jù)類型的對應的對象,將基本數(shù)據(jù)類型轉換為對象就稱為裝箱,反之則是拆箱,本文主要為大家介紹了Java自動拆裝箱的原理與應用,需要的可以參考下
    2023-11-11
  • 攜程Apollo(阿波羅)安裝部署以及java整合實現(xiàn)

    攜程Apollo(阿波羅)安裝部署以及java整合實現(xiàn)

    這篇文章主要介紹了攜程Apollo(阿波羅)安裝部署以及java整合實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Java實戰(zhàn)個人博客系統(tǒng)的實現(xiàn)流程

    Java實戰(zhàn)個人博客系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+mybatis+redis+vue+elementui+Mysql實現(xiàn)一個個人博客系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • SpringBoot加載SQLite數(shù)據(jù)源方式

    SpringBoot加載SQLite數(shù)據(jù)源方式

    文章介紹了SpringBoot中配置SQLite數(shù)據(jù)源的流程,包括DBeaver連接數(shù)據(jù)庫、執(zhí)行建表與數(shù)據(jù)插入、引入依賴、初始化連接、定義實體類與Mapper,以及測試查詢操作,同時提及多數(shù)據(jù)源適配的擴展方式
    2025-09-09
  • 淺析Java異常處理中斷言的使用

    淺析Java異常處理中斷言的使用

    這篇文章主要介紹了Java異常處理中斷言的使用,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • java反射調用方法NoSuchMethodException的解決方案

    java反射調用方法NoSuchMethodException的解決方案

    這篇文章主要介紹了java反射調用方法NoSuchMethodException的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java?Lambda表達式語法及用法示例

    Java?Lambda表達式語法及用法示例

    這篇文章主要給大家介紹了關于Java?Lambda表達式語法及用法的相關資料,lambda表達式是JAVA8中提供的一種新的特性,它支持Java也能進行簡單的"函數(shù)式編程",文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Java中實現(xiàn)對象深克隆的四種方式

    Java中實現(xiàn)對象深克隆的四種方式

    這篇文章主要介紹了如何在Java中實現(xiàn)對象的深克隆,可以通過手動實現(xiàn)clone()方法、使用序列化、第三方庫Apache Commons Lang或Hutool等幾種方式,每種方式都有其特點,需要的朋友可以參考下
    2025-10-10
  • 多種情況下jar包獲取文件的路徑,讀取文件方式

    多種情況下jar包獲取文件的路徑,讀取文件方式

    文章介紹了在不同情況下(IDEA運行和JAR包運行)獲取文件路徑的方法,并總結了每種方式的適用場景
    2024-11-11

最新評論

托克逊县| 隆子县| 潼关县| 阳春市| 霸州市| 金溪县| 报价| 张家川| 固始县| 民权县| 体育| 贵定县| 高淳县| 卫辉市| 将乐县| 浦城县| 东阳市| 怀柔区| 太白县| 格尔木市| 济阳县| 安平县| 广东省| 静安区| 彩票| 泰来县| 石嘴山市| 冕宁县| 白朗县| 登封市| 资中县| 宜宾县| 长海县| 南召县| 通化县| 九台市| 潜山县| 武邑县| 广宗县| 南投县| 汉阴县|