程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Spring Bean的加載,SpringBean加載

Spring Bean的加載,SpringBean加載

編輯:JAVA綜合教程

Spring Bean的加載,SpringBean加載


Spring加載bean的原則:不等bean創建完成就會將創建bean的ObjectFactory提早曝光加入到緩存中。   單例bean在Spring容器裡只會創建一次,後續創建時會首先從緩存中獲取,嘗試加載,不成功則從singletonFatories中加載。當存在循環依賴的時候,依據Spring的加載bean原則,下一個bean需要依賴上一個bean的時候直接使用ObjectFactory。   緩存中保存的是bean的原始狀態,需要進行bean的實例化操作。   Spring初始化bean的時候,會首先初始化這個bean所對應的依賴。
package org.springframework.beans.factory;

/**
* Interface to be implemented by objects used within a {@link BeanFactory}
* which are themselves factories. If a bean implements this interface,
* it is used as a factory for an object to expose, not directly as a bean
* instance that will be exposed itself.
*/
public interface FactoryBean<T> {

  /**
    * Return an instance (possibly shared or independent) of the object
    * managed by this factory.
    */
  T getObject() throws Exception;

  /**
    * Return the type of object that this FactoryBean creates,
    * or {@code null} if not known in advance.  
    */
  Class<?> getObjectType();

  /**
    * Is the object managed by this factory a singleton? That is,
    * will {@link #getObject()} always return the same object
    * (a reference that can be cached)?
    * 單例對象會放在Spring單例緩存池中
    */
  boolean isSingleton();

}

工廠方法配置bean如下:

<bean id="book" class="com.xxx.model.BookFactory"/>

BookFactory實現了FactoryBean,則當使用getBean("book")時,返回FactoryBean#getObject()方法返回的對象,即FactoryBean#getObject()代理了getBean()方法:

Book book = ctx.getBean("book");

如果要獲取BookFactoryBean對象,則需要使用前綴“&”,使用如下:

BookFactory bookFactory = ctx.getBean("&book");
單例Bean(singleton)獲取步驟:   singletonObjects<BeanName, BeanInstance>.get(beanName):Map單例緩存獲取。synchronized(this.singletonObjects),全局變量同步。         ↓↓         ↓↓==Null         ↓↓ earlySingletonObjects<BeanName, BeanInstance> .get(beanName):處理循環引用依賴檢測。         ↓↓         ↓↓==Null         ↓↓ singletonFactories<BeanName, BeanFactory> .get(beanName):調用相應單例創建工廠getObject()返回Bean對象。         ↓↓         -->earlySingletonObjects.put(beanName, singletonObject)存儲獲取的Bean實例。         --> singletonFactories.remove(beanName)移除beanName對應單例工廠。   Bean創建:   Bean初始化:Aware方法,Post處理,Init處理。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved