AbstractBeanFactory 生产Bean 实例对象
生活随笔
收集整理的這篇文章主要介紹了
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 实例对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AbstractBeanFactory
- 下一篇: 工厂Bean 的实现类getObject