日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AbstractBeanFactory 生产Bean 实例对象

發布時間:2024/4/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AbstractBeanFactory 生产Bean 实例对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AbstractBeanFactory 類中生產Bean 實例對象的主要源碼如下:

//Bean工廠生產Bean實例對象 protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {//Bean工廠是單態模式,并且Bean工廠緩存中存在指定名稱的Bean實例對象if (factory.isSingleton() && containsSingleton(beanName)) {//多線程同步,以防止數據不一致synchronized (getSingletonMutex()) {//直接從Bean工廠緩存中獲取指定名稱的Bean實例對象Object object = this.factoryBeanObjectCache.get(beanName);//Bean工廠緩存中沒有指定名稱的實例對象,則生產該實例對象if (object == null) {//調用Bean工廠的getObject方法生產指定Bean的實例對象object = doGetObjectFromFactoryBean(factory, beanName);// Only post-process and store if not put there already during getObject() call above// (e.g. because of circular reference processing triggered by custom getBean calls)Object alreadyThere = this.factoryBeanObjectCache.get(beanName);if (alreadyThere != null) {object = alreadyThere;}else {if (shouldPostProcess) {try {object = postProcessObjectFromFactoryBean(object, beanName);}catch (Throwable ex) {throw new BeanCreationException(beanName,"Post-processing of FactoryBean's singleton object failed", ex);}}//將生產的實例對象添加到Bean工廠緩存中this.factoryBeanObjectCache.put(beanName, object);}}return object;}}//調用Bean工廠的getObject方法生產指定Bean的實例對象else {Object object = doGetObjectFromFactoryBean(factory, beanName);if (shouldPostProcess) {try {object = postProcessObjectFromFactoryBean(object, beanName);}catch (Throwable ex) {throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);}}return object;} } //調用Bean工廠的getObject方法生產指定Bean的實例對象 private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)throws BeanCreationException {Object object;try {if (System.getSecurityManager() != null) {AccessControlContext acc = getAccessControlContext();try {//實現PrivilegedExceptionAction接口的匿名內置類//根據JVM檢查權限,然后決定BeanFactory創建實例對象object = AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () ->factory.getObject(), acc);}catch (PrivilegedActionException pae) {throw pae.getException();}}else {//調用BeanFactory接口實現類的創建對象方法object = factory.getObject();}}catch (FactoryBeanNotInitializedException ex) {throw new BeanCurrentlyInCreationException(beanName, ex.toString());}catch (Throwable ex) {throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);}// Do not accept a null value for a FactoryBean that's not fully// initialized yet: Many FactoryBeans just return null then.//創建出來的實例對象為null,或者因為單態對象正在創建而返回nullif (object == null) {if (isSingletonCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName, "FactoryBean which is currently in creation returned null from getObject");}object = new NullBean();}return object; }

從上面的源碼分析中,我們可以看出,BeanFactory 接口調用其實現類的getObject 方法來實現創建Bean 實例對象的功能。

?

總結

以上是生活随笔為你收集整理的AbstractBeanFactory 生产Bean 实例对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。