Springソースの--getBenの完全な流れ
=>org.springframe ext.annotations.AnnotationConfigAplicationControtext
public AnnotationConfigAplicationConttext(Class)...annotatedClass)
-->refresh()
=>org.springframe ework.com.support.AbstractAplication Contect
public void refresh()throws BensException,Illagal Station
-->finish BeanFactory Initialization(beanFactory);
protected void finish BeanFactory Initiazation(Configrable Listable BenFactory BeanFactory)
-->beanFactory.preInstantiateSingletons();
=>org.springframe ework.beans.factory.support.Abstract BenFactory
public void preInstantiateSingletons()throws BeansException
-->this.getBean;
public Object getBean(String name)throws BensException
-->return doGetBen(name,null,null,false);
着信パラメータ:
String name、beanの名前(別名かもしれません)
final Class requiredTypeは、容器から取得するタイプです.
final Object[]args,着信するコンストラクタパラメータは,このパラメータを通してどのコンストラクタを具体的に使うかを指定します.
bootlean type CheckOnlyは現在のbeanをチェックマークしていますか?
protected T doGetBen@Nullable final Class requiredType@Nullable final Object[]args,bolean type CheckOnly)
-->final String beanname=tranformedBeanName;
入ってきた名前は別名かもしれません.ここで別名解析を行います.
-->Object sharedInstance=get Singleton(beanName);
キャッシュに行ってオブジェクトを取得します(三級キャッシュ)
singleton Objectの一例キャッシュ池は、作成済みのオブジェクトを保存するために使用されます.
第一歩:まず一例キャッシュに行って取得し、作成されたオブジェクトがあるかどうかを確認し、直接にオブジェクトに戻ります.
第二ステップ:一例キャッシュ池singleton Objectには対象が見つからず、かつsingletons CurrenntlyInCreationは現在beanが作成中であるかどうかをマーキングしています.mapの中から探してみます.見つけたら作成中です.
ステップ3:二段キャッシュに行って、earlySingleton Objectを取得します.取得していない場合は、三段キャッシュで取得します.
ステップ4:singleton Factoresは三級キャッシュに行って取得しますが、いつ容器に入れましたか?
CreateBeanInstanceを呼び出した後、poputlateBeanの前に入れました.
=>if sharedInstance is null=>
-->bean=getObject ForBeanInstance(sharedInstance、name、beanName、null);
作成した対象は私たちが望んでいるものではないかもしれませんし、FactoryBeanかもしれません.ここで工場を処理する必要があります.
現在のbeanは工場beanではないかと判断します.ここで直接戻ります.
-->return bean
=>else
-->BenFactory parentBenFactory=getPantBenFactory();
親工場を取得する
-->contains BenDefinition(beanName)
父の容器は空ではありません.現在の容器はこのbeanを含んでいません.ある場合はdefaultです.
ここの論理分岐とは、現在の容器には親容器があり、現在の容器には現在のbean定義が含まれていないため、親容器を使ってbeanを作成するプロセスです.
-->final RootBenDefinition mbod=get Merged LocanDefinition;
Beanの定義を統合して、父親が存在するのは抽象的なbeanで、もっぱら子供のために継承します.
-->checkMergdBenDefinition;
現在のbean定義をチェックして、現在のbean定義がabstractであれば直接に異常を投げます.
-->register DependentBean(dep,beanName);
依存するbeanを解析して登録して、
例えばInstancAがオブジェクトを作成するにはInstance Bに依存しなければならないと、まずBオブジェクトを作成します.
sharedInstance=getSingleton(beanName)->{}
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
ビーン定義のscopeによってビーンを作成します.=>org.springframe ework.beans.factory.support.DefaultSingleton BenRegistry
public Object getSingleton(String beanName,Object Factory)
before Singleton Creation;
現在作成されているオブジェクトを識別するためのsingletons CurrenentlyInCreationオブジェクトに入れます.
singleton Object=singleton Factory.getObject()
Object Facotry.getObject()によりcreateBenの流れが触発され、上記の匿名クラスのcreateBen()
return createBean(beanName、mbd、args);
=>org.springframe ework.beans.factory.support.Abstract AutowireCapable BenFactory
protected Object createBean(String beanname,RootBenDefinition mbd,@Nullable Object[]args)
Object bean=reolveBefore Instantiation;
ここでバックプロセッサに機会を与えてエージェントのオブジェクトに戻りますが、ここではプロキシを作成していません.
オブジェクトは、切断情報を解析してキャッシュするだけです.
Object beanInstance=doCreateBean(beanName、mbToUse、args);
protected Object doCreateBen(final String beanname、final RootBenDefinition mbd、final@Nullable Object[]args)
instance Wrapper=createBenInstance;
protected BenWrapper createBeanInstance(String beanname,RootBenDefinition mbd,@Nullable Object[]args)
return instantiateUsingFactoryMethod;
工場法によりビーンインスタンス@ビーンの形式構成を作成する
return at wireContructor(beanName、mbd、null、null);
構造関数に@Autowiredをマークした注入方法は構造方法を呼び出して作成します.
return instantiateBean(beanName、mbd);
参照なしのコンストラクタを呼び出してオブジェクトを作成します.
@compone@Service.
protected Object doCreateBen(final String beanname、final RootBenDefinition mbd、final@Nullable Object[]args)
addSingleton Factory(beanName、()->getEarlyBenReference;
作成したばかりのオブジェクト属性がまだ与えられていないオブジェクトを、Object Factoryという形でキャッシュに追加し、循環依存を解決します.
/**
* Add the given singleton factory for building the specified singleton
* if necessary.
* To be called for eager registration of singletons, e.g. to be able to
* resolve circular references.
* @param beanName the name of the bean
* @param singletonFactory the factory for the singleton object
*/
protected void addSingletonFactory(String beanName, ObjectFactory> singletonFactory) {
Assert.notNull(singletonFactory, "Singleton factory must not be null");
synchronized (this.singletonObjects) {
if (!this.singletonObjects.containsKey(beanName)) {
this.singletonFactories.put(beanName, singletonFactory);
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName);
}
}
}
popullateBean(beanName、mbd、instance Wrapper);作成対象の属性に値を割り当てます.
exposedObject=initializaBen(beanName、exposedObject、mbd)
protected Object initializaBen(final String beanme、final Object bean、@Nullable RootBenDefinition mbod)
invoke AwareMethods;
XAwareインターフェース
wrappedBean=appyBenPostProcessors BeforeInitiazation(wrappedBen、beanName)
バック処理を呼び出します.
invokeInit Methods;
呼び出しinit方法
wrappedBen=appyBenPostProcessors After Initialization(wrappedBean、beanName)
バックプロセッサのafterメソッドを呼び出します.
==>org.springframe ework.beans.factory.support.Default Singleton BenRegistry
public Object getSingleton(String beanName,Object Factory)
afterSingleton Creation;
現在のbeanはすでに作成されました.現在のbeanをsingletons CurrenntlyInCreationから削除します.
addSingleton;
作成したオブジェクトをキャッシュに入れる場合、キャッシュは二三段階になります.
/**
* Add the given singleton object to the singleton cache of this factory.
* To be called for eager registration of singletons.
* @param beanName the name of the bean
* @param singletonObject the singleton object
*/
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName);
}
}
=>org.springframe ework.beans.factory.support.Abstract BenFactoryprotected T doGetBen@Nullable final Class requiredType、 @Nullable final Object[]args,bolean type CheckOnly)
bean=getObject ForBenInstance(sharedInstance、name、beanName、mbod);
作成した対象は私たちが望んでいるものではないかもしれませんし、FactoryBeanかもしれません.ここで工場を処理する必要があります.
return bean