学習の春ロード豆

最後に長い時間の後、登録Beanを更新しなかった、二日間利用可能なデータも自身の調査の検索getBeanは春たBeanFactory(のbeanName)を参照してくださいに見えた。この方法を。線でコード行をコピーする前のようなものやメモを書くことができない限られた時間に、これはコードに注釈を付けるのプロセスのうちのいくつかの方法をコピーするだけです。

春バージョンは5.1.3.RELEASEです

最初は、getBean(文字列のbeanName)です。

Person person = (Person) context.getBean("person");

getBean 1.public(文字列名)オブジェクト、
1.1.doGetBean(名前、NULL、NULL、偽に);
1.1.1.finalのbeanNameストリング= transformedBeanName(名前);最初のbeanName取得する対応
1.1.2.Object sharedInstance = getSingletonを(のbeanName);作成されたBeanは、いくつかの地図関係の内側にキャッシュが存在するかどうかを確認する
キー;民間最終地図<文字列、オブジェクト>のConcurrentHashMapの=新しい新しいsingletonObjects <>(256):のbeanName値:Beanインスタンス
民間最終地図<を文字列、オブジェクト> earlySingletonObjectsは=新しいHashMapの <>(16);キー:のbeanName値:豆の違いsingletonObjects ObjectFactory.getObjectを格納するためのインスタンス(); Beanインスタンスが返された
民間最終地図<文字列、ObjectFactoryの< >> singletonFactoriesを? =新しいHashMapの<>(16) ;キー:のbeanName値:ObjectFactoryの単一のキャッシュ工場
1.1.3.if(isPrototypeCurrentlyInCreation(のbeanName));現在のBeanは直接スロー新しい新しいBeanCurrentlyInCreationExceptionに投(のbeanName)が作成されている場合は、
1.1.4.BeanFactory parentBeanFactory = getParentBeanFactory();親コンテナparentBeanFactory現在のBean定義が存在して取得例えば、春springmvc父とコンテナ
1.1.5.markBeanAsCreated(のbeanName)は、ブランドのアイデンティティ作成され、現在のBeanをマークし
、民間最終セットalreadyCreated = Collections.newSetFromMapを(新しいのConcurrentHashMap <>(256)); ストレージはすでにのbeanNameで作成された
民間最終地図<文字列、RootBeanDefinition> mergedBeanDefinitions =新規のConcurrentHashMap <>(256);キー:のBEANNAME値:beanDefinitionの記憶有り有りのbeanName既に作成されビーン定義
1.1.6.final RootBeanDefinitionは= getMergedLocalBeanDefinition(のbeanName)をMBD ; のbeanNameは、対応して得られました初めて、mergedBeanDefinitionsから得られbeanDefinitionは新しいRootBeanDefinitionを返すことです
1.1.7.checkMergedBeanDefinition(MBD、のbeanName、引数) ; Beanが新しい新しいBeanIsAbstractException投(のbeanName)スロー抽象クラスであるかどうかを確認し、
1.1.8.String [] =()DEPENDSON mbd.getDependsOn、取得プロセスかあなたは、Bean DEPENDSON要素トラバーサルがgetBean(DEP)を呼び出すに頼る必要がある場合は、
1.1.9.if(mbd.isSingleton())Beanがシングルトンである場合は、直接作成
1.2.0.getSingleton(文字列のbeanName、ObjectFactoryにsingletonFactoryを< ?> );メソッド;たcreateBean二番目のパラメータ(のbeanName、MBD、引数)に主コア、Beanを作成するgetSingletonメソッド呼び出し

パブリックオブジェクトgetSingleton(文字列のbeanName、ObjectFactoryにsingletonFactory <?>);

; getSingletonの2.public(<?>文字列のbeanName、のObjectFactory singletonFactory)オブジェクト
2.1.Object singletonObject = this.singletonObjects.get(のbeanName)は、取得が豆の破壊よりも小さい場合に取得しようとすると例外がキャッシュからスローをスローされますBeanCreationNotAllowedException新新(のbeanName、メッセージ);
プライベートsingletonsCurrentlyInDestructionブール= falseは、アイデンティティの破壊
2.2.beforeSingletonCreation(のbeanName)は、豆豆キャッシュシングルトンの作成に参加
2.3.singletonObject = singletonFactory.getObjectを();ダイレクトコールに集中するのObjectFactory .createBean(のbeanName、MBD、引数) ; メソッドがBeanの作成に
2.4.addSingleton(のbeanName、singletonObject)を、最後にキャッシュに良い豆が作成されますオン
民間最終セットregisteredSingletons =新しいLinkedHashSetの< >(256); ストレージが作成されますbeanName

保護オブジェクトたcreateBean(文字列のbeanName、RootBeanDefinition MBD、@Nullableオブジェクト[]引数)。

3.1.Class resolvedClass = resolveBeanClass(MBD、のbeanName )<?>; ビーンは、対応するクラス得る
3.2.mbdToUse.prepareMethodOverridesを(); Beanがオーバーライドメソッド設定している場合
3.3.Object豆= resolveBeforeInstantiation(のbeanName、mbdToUseの ) にBeanがインスタンス化される前に、プロキシプロキシオブジェクトを返すために必要があるかどうかを確認してください。
3.4.Object beanInstance = doCreateBean(のbeanName、mbdToUse 、引数); Beanをインスタンス化します

保護オブジェクトdoCreateBean(最終列のbeanName、最終RootBeanDefinitionのMBD、最終@Nullableオブジェクト[]引数)。

4.1.instanceWrapper = createBeanInstance(のbeanName、MBD、引数); コンストラクタを呼び出すために使用されて作成されたBeanがリフレクタ豆のインスタンス作成
4.2.applyMergedBeanDefinitionPostProcessors(MBD、BeanType、のbeanName)を、BeanPostProcessor MergedBeanDefinitionPostProcessor決定されていないすべての要素を取得し、その後、呼び出しMergedBeanDefinitionPostProcessor .postProcessMergedBeanDefinition(MBD、BeanType、のbeanName);
4.3.populateBean(のbeanName、MBD、instanceWrapper);関数の豆は、データ初期化
4.4.initializeBean(のbeanName、exposedObject、MBD)を 、 豆、いくつかの後処理(BeanNameAware、BeanClassLoaderAware、BeanFactoryAwareを行います、BeanPostProcessor);
4.5.registerDisposableBeanIfNecessary(のbeanName、豆、MBD);登録破壊豆コールバック

保護された無効populateBean(文字列のbeanName、RootBeanDefinition MBD、@Nullable BeanWrapper BW)。

(!Mbd.isSynthetic()&& hasInstantiationAwareBeanPostProcessors( ))5.1.ifこのステップが完了しているが、まだBeanインスタンスすべてInstantiationAwareBeanPostProcessor実装クラスはpostProcessAfterInstantiation(bw.getWrappedInstance()、のbeanName)を呼び出し取って、属性値のセットを開始するときに 、 InstantiationAwareBeanPostProcessor Bean実装クラスが状態を変更することができる場合
5.2.PropertyValuesのPVSの=(mbd.hasPropertyValues()mbd.getPropertyValues ():?NULL); 抽出された豆の特性の全て
5.3.autowireByName(のbeanName、MBD、BW、 newPvs );名によってすべてのプロパティ値を見つける
5.4.autowireByType(のbeanName、MBD、BW、newPvs);タイプのすべてのプロパティの値を見つける
5.5.for(BeanPostProcessor BP:getBeanPostProcessors())BeanPostProcessorのすべての取得
)5.6.if InstantiationAwareBeanPostProcessorのinstanceof(BPをInstantiationAwareBeanPostProcessorのすべてのタイプを見つけます
5.7.pvsToUse = ibp.postProcessPropertyValues(PVS、filteredPds、 bw.getWrappedInstance()、のbeanName); @Autowired依存アノテーションが値field.set(豆、値)を使用して提供される。
5.8.if(!= NULL PVS)applyPropertyValuesを(のbeanName、MBD、BW、PVS ); セットは、Beanの属性値

保護オブジェクトinitializeBean(最終列のbeanName、最終的なオブジェクト豆、@Nullable RootBeanDefinitionはMBD)。

6.1.invokeAwareMethods(のbeanName、豆); Beanはアウェア(BeanNameAware、BeanClassLoaderAware、BeanFactoryAware)コールセット割り当て方法に対応するインタフェース実装する場合
6.2.wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean、のbeanName) ; 呼び出し取得対応BeanPostProcessorの全てを電流= processor.postProcessBeforeInitializationオブジェクト(結果のbeanName);
6.3.invokeInitMethods(のbeanName、wrappedBean、MBD)、ビーンは、対応InitializingBean((InitializingBean)ビーン).afterPropertiesSet()を呼び出すためのインタフェースを実装する場合、
6.4.invokeCustomInitMethod(のbeanName 、豆、MBD);定義された豆の方法からのinitメソッドを呼び出し
6.5.wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean、のbeanName) ; 取得したすべての対応するBeanPostProcessorは、現在= processor.postProcessAfterInitialization(結果のbeanNameオブジェクト呼び出し )。

バネ仕掛けの豆後に終了の6段階の実装は返すように層ごとに終わりました。あなたが指摘欠陥を書いた場合、そのメモリの統合を助け、あなたが見ることを望むありがとう!

注記

idとname

あなたがのbeanNameによってBeanができますもエイリアスを取得することができたときに各Beanの構成は、一意の名前と複数の別名を持つ場合

beanFactory.getBean("beanName or alias");

結果は次のような構成である。人としてのbeanName、それぞれ3つのエイリアス、P1、P2、P3があります。

<bean id="person" name="p1, p2, p3" class="com.feil.springtest.ioc.test01.Person">

結果は以下の構成である:P1とのbeanName二別名、それぞれ、P2、P3が存在します。

<bean name="p1, p2, p3" class="com.javadoop.example.MessageServiceImpl" />

、com.feil.springtest.ioc.test01.Person#0:としてのbeanName:結果は次のような構成であります

<bean class="com.feil.springtest.ioc.test01.Person" />

人ではなく、エイリアスなどのbeanName:結果は次のような構成です。

<bean id="person" class="com.feil.springtest.ioc.test01.Person" />
プロフィール

私たちは別々のファイルに設定されている異なる環境を設定することができます

<beans profile="dev" ....>
	<bean ... />
	<bean ... />
	<bean ... />
</beans>
<beans profile="test" ....>
	<bean ... />
	<bean ... />
	<bean ... />
</beans>

もちろん、我々はまた、設定ファイルを使用することができます。

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="...">

    <beans profile="dev">
        ...
    </beans>

    <beans profile="test">
        ...
    </beans>
</beans>

だから、春には、別の環境を特定する方法ですか?起動のプロセスで春には、プロパティの値に応じて、「spring.profiles.active」プロパティ値を検索します。そのことは、この値を設定する方法?
プロパティ値を検索します春にはいくつかの場所でspring.profiles.active:オペレーティングシステム環境変数、JVMのシステム変数、web.xmlで定義されたパラメータ、JNDIを。
必ずする最も簡単な方法は、プログラムの起動時に指定することです。

-Dspring.spring.profiles.active="dev"
BeanPostProcessor

BeanPostProcessorインターフェースの役割は:
私たちは豆を完了したい場合は、インスタンス化する前にSpringコンテナおよびその他の初期化メソッドで設定し、独自のロジックの一部を追加したいです。私たちは、1つ以上のクラスBeanPostProcessorインターフェイスを定義し、その後、春のIoCコンテナを登録する必要があります。
BeanPostProcessorのコンセプトは春でより重要です。私たちは、インターフェイスの定義を見て:

public interface BeanPostProcessor {
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

1:初期化前postProcessorBeforeInitailization方法ポストプロセッサは、Bean postProcessBeforeInitializationにこの方法を行います。
2:初期Beanの完了後postProcessAfterInitializationこの方法を実行postProcessorAfterInitailization方法ポストプロセッサ。
第一の方法を見て、このメソッドの最初のパラメータは、戻り値のBeanインスタンスが新しいBeanインスタンスとして焦点になる受け入れ、それが何を意味するのでしょうか?考えるのは簡単です、私たちは修正したいいくつかのBeanインスタンスのためにここで何かを行うことができます。しかし、Springフレームワークのために、それはこの方法エージェントにBeanインスタンスを返すかどうかを決定します。

おすすめ

転載: blog.csdn.net/qq_16830879/article/details/89921794