ホームページ  >  記事  >  Java  >  Spring ソース コードの BeanDefinition クラスの詳細な紹介

Spring ソース コードの BeanDefinition クラスの詳細な紹介

不言
不言転載
2019-03-22 16:38:563627ブラウズ

この記事では、Spring ソース コードの BeanDefinition クラスについて詳しく説明します。これには特定の参考値があります。必要な友人は参照できます。お役に立てば幸いです。

Spring のバージョンは 5.1.5

Spring を使用したことのある人なら誰でも、オブジェクトを Spring コンテナに挿入し、Spring に管理させていることを知っています。この種のオブジェクトは Bean オブジェクトと呼ばれます。しかし、これらの Bean オブジェクトは Spring コンテナ内にどのような形式で存在し、どのような属性や動作を持っているのでしょうか?今日は Spring のソースコードを入力して調べます。

Bean 作成ファクトリ BeanFactory には、デフォルトの実装クラス DefaultListableBeanFactory があり、これには、注入されたすべての Bean オブジェクト情報を格納する Map が含まれています

/** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

Map の値オブジェクト BeanDefinition は、Spring の Bean の定義と説明です。具体的な概要は次のとおりです。

##dependsOn String[] getDependsOn();依存 Bean オブジェクトを設定します。依存 Bean オブジェクトBean オブジェクトは最初に作成されますautowireCandidateboolean isAutowireCandidate();自動注入を行うかどうかを設定します。 @Autowired アノテーションにのみ有効で、設定ファイルはプロパティ displayprimaryboolean isPrimary();Bean を主候補 Bean として設定します。同じインターフェースまたはクラスの複数の実装クラスが Spring コンテナーに複数回注入される場合、この属性を使用して Bean を主候補 Bean として構成します。タイプ別に注入する場合、デフォルトでは主候補 Bean を注入に使用しますfactoryBeanNameString getFactoryBeanName();作成された Bean のファクトリ名を設定しますfactoryMethodNameString getFactoryMethodName();Bean を作成する特定のメソッドを設定しますBean が作成されるファクトリーinitMethodNameString getInitMethodName();Set Bean 作成時のデフォルトの初期化メソッドdestroyMethodNameString getDestroyMethodName(); Beanを破棄する際に呼び出されるメソッド名を設定します。 roleint getRole();descriptionvoid setDescription(@Nullable String description);#注意: BeanDefinition は、Bean オブジェクトのいくつかの基本的な動作を内部的に定義するだけのインターフェースです。上の表のプロパティは実際には BeanDefinition に存在せず、set メソッドと get メソッドを通じてのみ設定および取得されます。以下は、誰もが認識できるように BeanDefinition ソース コードの一部を抜粋したものです
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    /**
     * Override the target scope of this bean, specifying a new scope name.
     * @see #SCOPE_SINGLETON
     * @see #SCOPE_PROTOTYPE
     */
    void setScope(@Nullable String scope);

    /**
     * Return the name of the current target scope for this bean,
     * or {@code null} if not known yet.
     */
    @Nullable
    String getScope();
}
属性 動作 説明
parentName String getParentName();
void setParentName(@Nullable StringparentName);
Bean 定義オブジェクトの親クラス定義オブジェクト名
beanClassName String getBeanClassName();
void setBeanClassName(@Nullable String beanClassName);
Bean オブジェクトの実際のクラス クラス
scope String getScope();
void setScope(@Nullable Stringscope);
Bean オブジェクトがシングルトンであるかどうか<シングルトンかプロトタイプ> ;
lazyInitboolean isLazyInit();
void setLazyInit(boolean LazyInit);
遅延読み込みかどうか
void setDependsOn(@Nullable String... dependsOn);
void setAutowireCandidate(boolean autowireCandidate);
void setPrimary(boolean Primary); を通じて挿入できます。
void setFactoryBeanName(@Nullable String FactoryBeanName);
void setFactoryMethodName(@Nullable String FactoryMethodName);
void setInitMethodName(@Nullable String initMethodName);
void setDestroyMethodName(@Nullable String destroyMethodName);
void setRole(int role);# を呼び出すには、コンテキストの close() メソッドを呼び出す必要があることに注意してください。
##Bean 分類を設定します
String getDescription();# #Bean の場合 オブジェクトの説明
実際の使用法
次の 2 つの Bean があると仮定します。Java コードは次のとおりです

MyTestBean

package com.yuanweiquan.learn.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Description;

public class MyTestBean {
    @Autowired
    private AutowireCandidateBean autowireCandidateBean;

    public void init() {
        System.out.println("inti MyTestBean");
    }

    public AutowireCandidateBean getAutowireCandidateBean() {
        return autowireCandidateBean;
    }
    public void setAutowireCandidateBean(AutowireCandidateBean bean) {
        this.autowireCandidateBean = bean;
    }
}

AutowireCandidateBean
package com.yuanweiquan.learn.bean;

public class AutowireCandidateBean {
    public void initBean() {
        System.out.println("init AutowireCandidateBean");
    }

    public void destroyBean() {
        System.out.println("destroy AutowireCandidateBean");
    }
}
構成ファイル applicationContext.xml
   <bean id="myTestBean" class="com.yuanweiquan.learn.bean.MyTestBean" 
         depends-on="autowireCandidateBean" 
         init-method="init"/>
         
   <bean id="autowireCandidateBean" 
         class="com.yuanweiquan.learn.bean.AutowireCandidateBean"
         init-method="initBean"
         autowire-candidate="true"
         destroy-method="destroyBean"
         scope="singleton"
         parent="myTestBean"
         lazy-init="default"
         primary="true">
      <description>autowireCandidateBean description</description>
   </bean> で構成する方法を見てみましょう<p>次のステップはテスト コードです</p>
<pre class="brush:php;toolbar:false">FileSystemXmlApplicationContext factory = 
        new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
BeanDefinition myTestBeanDefinition = 
        factory.getBeanFactory().getBeanDefinition("autowireCandidateBean");
//输出
System.out.println("bean description:" + myTestBeanDefinition.getDescription());
System.out.println("bean class name:" + myTestBeanDefinition.getBeanClassName());
System.out.println("parent name:" + myTestBeanDefinition.getParentName());
System.out.println("scope:" + myTestBeanDefinition.getScope());
System.out.println("is lazyinit:" + myTestBeanDefinition.isLazyInit());
System.out.println("depends On:" + myTestBeanDefinition.getDependsOn());
System.out.println("is autowireCandidate:" + myTestBeanDefinition.isAutowireCandidate());
System.out.println("is primary:" + myTestBeanDefinition.isPrimary());
System.out.println("factory bean name:"+myTestBeanDefinition.getFactoryBeanName());
System.out.println("factory bean method name:" + myTestBeanDefinition.getFactoryMethodName());
System.out.println("init method name:" + myTestBeanDefinition.getInitMethodName());
System.out.println("destory method name:" + myTestBeanDefinition.getDestroyMethodName());
System.out.println("role:" + myTestBeanDefinition.getRole());
//关闭context,否则不会调用bean的销毁方法
factory.close();

コンソール出力は次のとおりです

init AutowireCandidateBean
inti MyTestBean
bean description:autowireCandidateBean description
bean class name:com.yuanweiquan.learn.bean.AutowireCandidateBean
parent name:myTestBean
scope:singleton
is lazyinit:false
depends On:null
is autowireCandidate:true
is primary:true
factory bean name:null
factory bean method name:null
init method name:initBean
destory method name:destroyBean
role:0
destroy AutowireCandidateBean

ここまでの情報により、各属性に対応する値が明確にわかります。上記のテスト コードの目的は、Bean が Spring コンテナ内にどのような形式で存在するか、Bean がどのような特定の属性を持っているか、属性の値とデフォルト値を確認できるようにすることです。これは、春の容器に豆が入っていることを事前に明らかにするものと考えられますが、実際には、私たちが想像しているほど神秘的なものではありません。

以上がSpring ソース コードの BeanDefinition クラスの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。