春のコア技術(4)

論文を接続:春のコア技術を(3)

バージョン5.1.8.RELEASE

1.4.2依存関係と構成の詳細

最後の、あなたができるBeanプロパティおよび他の管理対象Bean(共同研究者)参考のために、またはインライン定義された値として定義コンストラクタパラメータ。春は、この目的のために子要素のXMLベースの構成メタデータをサポート<property/>して<constructor-arg/>

直接値(基本タイプ、文字列など)

<property/>要素のvalue属性は、プロパティやコンストラクタのパラメータ読み込み可能な文字列を指定します。Springの変換サービス値に対するString実際の型属性またはパラメータに変換します。次の例は、様々な値を設定する例を示します。

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <!-- results in a setDriverClassName(String) call -->
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="masterkaoli"/>
</bean>

次の例では、名前空間Pより簡潔なXMLコンフィギュレーションを使用しています。

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

    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close"
        p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://localhost:3306/mydb"
        p:username="root"
        p:password="masterkaoli"/>

</beans>

前のXMLより簡潔な。しかし、あなたは(のような性質のIDEの自動補完をサポートBean定義を作成しない限りのIntelliJ IDEA春のツールスイートを)、そうでなければ、ランタイムではなく、設計時にスペルミスがあります。それは強く、このようなIDEのヘルプを使用することをお勧めします。

また、設定することができjava.util.Properties、例えば次のように:

<bean id="mappings"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <!-- typed as a java.util.Properties -->
    <property name="properties">
        <value>
            jdbc.driver.className=com.mysql.jdbc.Driver
            jdbc.url=jdbc:mysql://localhost:3306/mydb
        </value>
    </property>
</bean>

JavaBeans用いてばね収容PropertyEditorする機構<value/>のテキスト要素に変換java.util.Properties例。これは素敵なショートカットですが、また、春のチームは、ネストされたことをお勧めします<value/>要素の代わりに、valueいくつかの場所のプロパティの一つ。

idref要素

idrefエラー保護素子の唯一の方法は、容器は、別の豆とすることができるidプロパティ(文字列値-なく参照)に<constructor-arg/>、または<property/>要素。次の例では、それを使用する方法を示しています。

<bean id="theTargetBean" class="..."/>

<bean id="theClientBean" class="...">
    <property name="targetName">
        <idref bean="theTargetBean"/>
    </property>
</bean>

コードセグメントに先行するビーン定義は、以下のコードセグメント(ランタイム)とまったく同じです。

<bean id="theTargetBean" class="..." />

<bean id="client" class="...">
    <property name="targetName" value="theTargetBean"/>
</bean>

使用するので最初の形式は、第二の形式よりも優れているidrefラベルは、コンテナは、展開時に名前の参照先Beanの存在を確認することができます。第二の変形例では、それが渡されていないclienttargetName属性検証の値が行われます。唯一のclientBeanがインスタンス化されるとき、あなたは本当のスペルミス(最も可能性が高い致命的な結果を)見つけるでしょう。場合clientBeanがあるプロトタイプ Beanは、展開後の容器内で発生したこのエラーや異常を見つけるのに長い時間がかかるかもしれません。

4.0豆XSD長くサポートしないidref要素localが、もはや他の従来提供されるため、プロパティをbean基準より値。あなたは、バージョン4.0にアップグレードすると、既存のに必要なidref local基準変化idref bean

一つの共通の場所は(少なくとも初期の春バージョン2.0)に、<idref/>要素の値は、ProxyFactoryBeanビーン定義AOPインターセプタ構成要素。インターセプタの名前を指定する場合に使用します<idref/>要素はスペルミスの迎撃IDを防ぐことができます。

その他の参考文献ビーン(協力者)

ref元素である<constructor-arg/>または<property/>要素の定義内の最終要素。ここでは、別のBeanのコンテナ管理(協力者)のを基準に指定したbeanプロパティの値を設定します。Beanプロパティへの参照されるBeanは、依存関係を設定し、必要なプロパティを設定する前に初期化します。(共同編集者が初期化コンテナであったかもしれシングルトン豆、あれば)全ての参考文献は、最終的に別のオブジェクトへの参照です。スコープと有効性はによるかどうかに依存しbeanlocalまたはparent属性がIDまたは名前その他のオブジェクトを指定します。

よる<ref />ラベリングbeanターゲットBeanのプロパティは、同じコンテナかにかかわらず、それが同じXMLファイルであるかどうかのいずれかの親Beanのコンテナへの参照を作成できるようにする最も一般的な方法です。beanプロパティの値は、Beanの標的となる可能性がid同じ属性でも豆ターゲットにすることができname、同じプロパティを1つ。次の例では、使用する方法を示しref要素:

<ref bean="someBean"/>

parentターゲットBeanビーン属性における現在のコンテナの親コンテナへの参照を作成します。parentプロパティの値は、ターゲットBeanであってもよいid同じ特性も豆標的とし得るname属性のいずれかと同じ。ターゲットBeanは、現在の親コンテナBean内でなければなりません。容器は、階層構造、及び所望に応じて、従来の豆親コンテナの親ビーンプロキシラッパーを含む場合、主にビーン参照変数を使用する必要があります。次のリストは、この使用方法を示してparentプロパティを:

<!-- in the parent context -->
<bean id="accountService" class="com.something.SimpleAccountService">
    <!-- insert dependencies as required as here -->
</bean>
<!-- in the child (descendant) context -->
<bean id="accountService" <!-- bean name is the same as the parent bean -->
    class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
        <ref parent="accountService"/> <!-- notice how we refer to the parent bean -->
    </property>
    <!-- insert other configuration and dependencies as required here -->
</bean>

4.0豆XSD長くサポートしないref要素localが、もはや他の従来提供されるため、プロパティをbean基準より値。あなたは4.0アーキテクチャにアップグレードすると、既存の必要なref local基準変化をref bean

豆内部

<property/>または<constructor-arg/>要素<bean/>要素は、次の例のように、内部Beanを定義しています。

<bean id="outer" class="...">
    <!-- instead of using a reference to a target bean, simply define the target bean inline -->
    <property name="target">
        <bean class="com.example.Person"> <!-- this is the inner bean -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
        </bean>
    </property>
</bean>

インナーBean定義は、名前またはIDを定義する必要があります。でも指定された場合、またコンテナ識別子として。コンテナの作成時に無視されるscopeロゴを豆内部は常に匿名であるため、といつも一緒や外部Beanを作成します。あなただけでは注入されたコラボレーションにおける内部BeanまたはBeanにアクセスすることはできません。

極端な場合として、コールバックの破壊は、単一の実施形態の例に含まれているカスタムスコープ、豆内部要求の豆の範囲から受信することができます。創造豆内部のそれに関連するBeanインスタンスを含むが、それはコールバック要求スコープのライフサイクルを破壊参加することができます。これは一般的な状況ではありません。その豆の範囲が含まれている豆内部通常はシェア。

セット

<list/><set/><map/>そして<props/>要素は、Javaに提供されているCollectionタイプのListSetMapおよびPropertiesプロパティとパラメータ。次の例では、それらを使用する方法を示します。

<bean id="moreComplexObject" class="example.ComplexObject">
    <!-- results in a setAdminEmails(java.util.Properties) call -->
    <property name="adminEmails">
        <props>
            <prop key="administrator">[email protected]</prop>
            <prop key="support">[email protected]</prop>
            <prop key="development">[email protected]</prop>
        </props>
    </property>
    <!-- results in a setSomeList(java.util.List) call -->
    <property name="someList">
        <list>
            <value>a list element followed by a reference</value>
            <ref bean="myDataSource" />
        </list>
    </property>
    <!-- results in a setSomeMap(java.util.Map) call -->
    <property name="someMap">
        <map>
            <entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
    </property>
    <!-- results in a setSomeSet(java.util.Set) call -->
    <property name="someSet">
        <set>
            <value>just some string</value>
            <ref bean="myDataSource" />
        </set>
    </property>
</bean>

マップのキーまたは値、または設定値、そしてそれは、以下の要素のいずれであってもよいです。

bean | ref | idref | list | set | map | props | value | null

組み合わせたコレクション

春の回収容器は、合併をサポートしています。アプリケーション開発者は、親定義することができ<list/><map/><set/>または<props/>要素、およびサブ要素の定義<list/><map/><set/>または<props/>継承をし、親コレクションを上書きします。つまり、指定された親でコレクションの値をカバーする要素のサブセットが、サブセットの値は要素の親セット及びサブセットをマージした結果です。

親子ビーンメカニズムの合併のこの部分には議論されています。親と子のBean定義に慣れていない読者はあなたが読んで続行する前に読む前に読むことをお勧めします関連するセクションを

次の例では、組み合わせたコレクションを示しています。

<beans>
    <bean id="parent" abstract="true" class="example.ComplexObject">
        <property name="adminEmails">
            <props>
                <prop key="administrator">[email protected]</prop>
                <prop key="support">[email protected]</prop>
            </props>
        </property>
    </bean>
    <bean id="child" parent="parent">
        <property name="adminEmails">
            <!-- the merge is specified on the child collection definition -->
            <props merge="true">
                <prop key="sales">[email protected]</prop>
                <prop key="support">[email protected]</prop>
            </props>
        </property>
    </bean>
<beans>

なお、childBean定義のadminEmails属性<props/>要素merge=trueこのプロパティを使用します。コンテナが解析され、インスタンス化されたときにchildBeanは、インスタンスを生成しなければならないときadminEmails Propertiesのサブセットを含むコレクションadminEmailsの親のadminEmails集合を組み合わせた結果です。以下のリストは、結果を示しています。

[email protected]
[email protected]
[email protected]

サブ要素のProperties親要素継承された値の集合<props/>の要素のすべての属性のを、サブ要素のsupport値は、親セット内の値を上書きします。

これはまた、合併に適用され<list/><map/>および<set/>コレクション型。<list/>特定のシーン要素、維持することが推奨されるListコレクション型(すなわち、概念のセット注文)に関連する意味を。親の子リストの値の前にあるすべての値。ではMapSetおよびPropertiesシーンタイプを設定し、順序は存在しません。したがって、内側容器MapSetおよびProperties実装クラスが乱れています。

制限の組み合わせセット

あなたは、さまざまなコレクション型を(のようなマージすることはできませんMapList)。あなたがそうしようとすると、対応するスローされますExceptionmergeプロパティは、サブ定義低いレベルで指定されなければなりません。親に指定された定義された一連のmerge属性が冗長である、それは所望の併用につながることはありません。

厳密に型指定されたコレクション

Java 5の中にジェネリック型を導入することで、あなたは強く型付けされたコレクションを使用することができます。換言すれば、一種類の宣言することができCollection、それは(例えば)を含むことができるように、種類のString要素。強く型付けされたスプリング場合CollectionBeanに依存性注入は、型変換スプリングサポートするために使用することができるので、強く型付けされたCollection要素は、インスタンスに追加Collection適切な型への変換の前に。次のJavaクラスやBean定義は、これを実行する方法を示しています。

public class SomeClass {

    private Map<String, Float> accounts;

    public void setAccounts(Map<String, Float> accounts) {
        this.accounts = accounts;
    }
}
<beans>
    <bean id="something" class="x.y.SomeClass">
        <property name="accounts">
            <map>
                <entry key="one" value="9.99"/>
                <entry key="two" value="2.75"/>
                <entry key="six" value="3.99"/>
            </map>
        </property>
    </bean>
</beans>

ときsomethingaccounts準備注入性は、強く型付けされた要素に反射して得られたMap<String, Float>一般的な情報。したがって、ばねは機構を鋳造として同定種々の値Float(タイプ文字列値9.992.75およびは3.99)実際に変換されるFloatタイプ。

ヌルと空の文字列

春には、空の文字列としてnullをパラメータとして属性。次のXMLベースの構成メタデータが断片化しemail、空の文字列(「」)にプロパティを。

<bean class="ExampleBean">
    <property name="email" value=""/>
</bean>

以下に、上記の例示的なJavaコード当量

exampleBean.setEmail("");

<null/>要素が処理されてもよいnull値を。以下に例を示します。

<bean class="ExampleBean">
    <property name="email">
        <null/>
    </property>
</bean>

以下に相当するJavaコードの上に配置されました:

exampleBean.setEmail(null);

ショートカットのp XML名前空間を持ちます

p個の名前空間には、使用することを可能にするbean要素(ないネストされたの属性<property/>プロパティ値やコラボレーションを記述するための要素を)bean

春はサポートして名前空間にスケーラブルな構成の形式、XMLスキーマ定義に基づいてこれらの名前空間。この章では説明しbeansた構成形式はXMLスキーマ文書に定義されています。ただし、XSDファイルで定義されていないPの名前空間は、コアのみの春に存在します。

次の例は、2つのXMLフラグメント(最初を使用して、標準的なXML形式、第2のp-名前空間)は、同じ結果に解決を示しています。

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

    <bean name="classic" class="com.example.ExampleBean">
        <property name="email" value="[email protected]"/>
    </bean>

    <bean name="p-namespace" class="com.example.ExampleBean"
        p:email="[email protected]"/>
</beans>

この例では、スペースの設定と呼ばれるp個の命名Beanの定義を示してemailプロパティを。これは、春には、プロパティの宣言が含まれて伝えます。前述した、無P名前空間スキーマ定義として、name属性は、属性名として設定されてもよいです。

次の例では、さらに別のBeanを引用している2つのビーン定義を含みます。

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

    <bean name="john-classic" class="com.example.Person">
        <property name="name" value="John Doe"/>
        <property name="spouse" ref="jane"/>
    </bean>

    <bean name="john-modern"
        class="com.example.Person"
        p:name="John Doe"
        p:spouse-ref="jane"/>

    <bean name="jane" class="com.example.Person">
        <property name="name" value="Jane Doe"/>
    </bean>
</beans>

このサンプルはまた、プロパティ参照を宣言するために特別なフォーマットを使用して、p個の名前空間を使用していない唯一のプロパティ値を含みます。最初のBeanは使用<property name="spouse" ref="jane"/>からBeanを作成するためjohnにビーンjane参照、及び第二のBeanが使用p:spouse-ref="jane"属性と同じ動作を行います。この場合には、spouseプロパティ名、および-ref部分が直接されていない値ではなく、別のBeanへの参照を表します。

標準のXMLフォーマットの柔軟性として良いのpの名前空間。たとえば、文の引用された属性の形式とRefプロパティの競合の末、および標準のXML形式にはありません。私たちは、あなたが慎重に方法を選択し、3つのメソッドを使用しながら、XML文書の生成を回避するために、他のチームメンバーにそれを通信することをお勧めします。

XML名前空間とCのショートカット

そしてXMLは、p名前空間とのショートカットが同様に、インラインプロパティに導入スプリング3.1 C名前空間は、ネストされたのではなく、コンストラクタパラメータを設定することを可能にするconstructor-arg要素。

次の例では、使用してc:名前空間が行う射出ベースのコンストラクタ依存性と同様の動作を:

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

    <bean id="beanTwo" class="x.y.ThingTwo"/>
    <bean id="beanThree" class="x.y.ThingThree"/>

    <!-- traditional declaration with optional argument names -->
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg name="thingTwo" ref="beanTwo"/>
        <constructor-arg name="thingThree" ref="beanThree"/>
        <constructor-arg name="email" value="[email protected]"/>
    </bean>

    <!-- c-namespace declaration with argument names -->
    <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
        c:thingThree-ref="beanThree" c:email="[email protected]"/>

</beans>

名前、によってコンストラクタのパラメータを設定しc:、名前空間、およびp:同じ規則(テール-ref Bean参照)を使用します。同様に、それは(コア内部スプリングに存在する)XSDスキーマで定義されていない場合であっても、XMLファイルに宣言する必要があります。

次のように(典型的にはデバッグ情報をせずにバイトコードをコンパイル)利用できないコンストラクタパラメータ名のまれなケースでは、代替パラメータインデックスを使用することができます。

<!-- c-namespace index declaration -->
<bean id="beanOne" class="x.y.ThingOne" c:_0-ref="beanTwo" c:_1-ref="beanThree"
    c:_2="[email protected]"/>

XML構文、およびXML属性なので、インデックスが要求されたメソッドの接頭辞が存在することを示しているので、名前は、(いくつかのIDEが許可されていても)数字で始めることはできません_<constructor-arg>宣言の順序が通常十分であろうため、要素は、対応するインデックス記号を使用するが、一般的に使用されなくてもよいです。

実際には、コンストラクタ解決メカニズムは、絶対に必要な場合を除き、パラメータに一致するのに非常に効果的である、そうでなければ、我々は全体の構成表現の名前を使用することをお勧めします。

複合属性名

最終パス名属性以外の全ての成分限り、化合物またはネストされた属性名を使用してBeanプロパティを設定する場合はヌルではありません。以下のBean定義を考えてみます。

<bean id="something" class="things.ThingOne">
    <property name="fred.bob.sammy" value="123" />
</bean>

something豆が持つfredプロパティfred属性が含まれているbob属性を、bob属性が含まれているsammy属性を、最終的なsammy属性の値は123に設定されています。それが正常に動作していることを確実にするために、建設豆の後、プロパティとの属性プロパティはnullであってはなりません。それ以外の場合は、スローされますsomethingfredfredbobNullPointerException

1.4.3アプリケーション depends-on

別のBeanの依存関係に豆場合、それは通常、別のBeanのプロパティに1つのBeanを意味します。通常ベースの構成は、XMLメタデータで使用することができる<ref/>。この操作を完了する要素。しかし、時には、豆少ない直接の関係に依存。静的初期化手順等は、データベースドライバの登録として、クラスでトリガされます。depends-onプロパティは、前に明示的に初期化一つ以上のBeanを初期化する強制この要素Beanに使用することができます。次の例では、使用するdepends-onプロパティは、個々のBeanの依存性を表します。

<bean id="beanOne" class="ExampleBean" depends-on="manager"/>
<bean id="manager" class="ManagerBean" />

、豆の複数の依存性を示す豆のような名前のリストを提供するために、depends-on(カンマ、セミコロンとスペースが有効な区切り文字です)属性の値:

<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
    <property name="manager" ref="manager" />
</bean>

<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />

depends-on属性は、初期化に依存して指定することができ、あなたも指定することができ、単一の実施形態 Bean破棄に依存します。depends-on指定された豆の前に破壊され、それ自体は、定義された依存関係を破壊します。このように、depends-onあなたは、シャットダウンシーケンスを制御することができます。

1.4.4遅延初期化ビーン

デフォルトでは、ApplicationContext実装は、すべての初期化と設定時に作成されますシングルトン初期化プロセスの一環として、豆。設定や環境エラーが数時間後に代わりに数日またはのため、一度に発見することができますので、通常、このような前のインスタンスは、合理的です。これが発生した場合、遅延シングルトンビーン事前インスタンス化を防止するように初期化ビーン定義によって、望ましくありません。豆の遅延初期化をするときではなく、起動時よりも最初の要求、Beanインスタンスを作成するために、IoCコンテナに語りました。

XMLでは、この動作<bean/>要素は、lazy-init次の例に示すように、制御属性:

<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>

表面には、現在の構成でApplicationContext使用して、lazyBeanはありませんApplicationContext、事前にインスタンス化するスタートアップnot.lazyBeanが事前にインスタンス化されます。

Beanがシングルトン豆の依存関係の遅延初期化の遅延初期化でない場合でも、ApplicationContextそれは遅延が起動時に初期化作成しbean、それが依存関係のシングルトンを満たさなければならないので、。遅延初期化は、bean他の遅延シングルトンBeanが初期化されていない内に注入されます。

また、使用することができる<beans/>要素をdefault-lazy-init次の例に示すように、コンテナレベル遅延初期化の特性を制御します。

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>

おすすめ

転載: www.cnblogs.com/aotian/p/11235013.html