論文を接続:春のコア技術を(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の存在を確認することができます。第二の変形例では、それが渡されていないclient
豆targetName
属性検証の値が行われます。唯一のclient
Beanがインスタンス化されるとき、あなたは本当のスペルミス(最も可能性が高い致命的な結果を)見つけるでしょう。場合client
Beanがあるプロトタイプ 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は、依存関係を設定し、必要なプロパティを設定する前に初期化します。(共同編集者が初期化コンテナであったかもしれシングルトン豆、あれば)全ての参考文献は、最終的に別のオブジェクトへの参照です。スコープと有効性はによるかどうかに依存しbean
、local
または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
タイプのList
、Set
、Map
および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>
なお、child
Bean定義のadminEmails
属性<props/>
要素merge=true
このプロパティを使用します。コンテナが解析され、インスタンス化されたときにchild
Beanは、インスタンスを生成しなければならないときadminEmails
Properties
のサブセットを含むコレクションadminEmails
の親のadminEmails
集合を組み合わせた結果です。以下のリストは、結果を示しています。
[email protected]
[email protected]
[email protected]
サブ要素のProperties
親要素継承された値の集合<props/>
の要素のすべての属性のを、サブ要素のsupport
値は、親セット内の値を上書きします。
これはまた、合併に適用され<list/>
、<map/>
および<set/>
コレクション型。で<list/>
特定のシーン要素、維持することが推奨されるList
コレクション型(すなわち、概念のセット注文)に関連する意味を。親の子リストの値の前にあるすべての値。ではMap
、Set
およびProperties
シーンタイプを設定し、順序は存在しません。したがって、内側容器Map
、Set
およびProperties
実装クラスが乱れています。
制限の組み合わせセット
あなたは、さまざまなコレクション型を(のようなマージすることはできませんMap
とList
)。あなたがそうしようとすると、対応するスローされますException
。merge
プロパティは、サブ定義低いレベルで指定されなければなりません。親に指定された定義された一連のmerge
属性が冗長である、それは所望の併用につながることはありません。
厳密に型指定されたコレクション
Java 5の中にジェネリック型を導入することで、あなたは強く型付けされたコレクションを使用することができます。換言すれば、一種類の宣言することができCollection
、それは(例えば)を含むことができるように、種類のString
要素。強く型付けされたスプリング場合Collection
Beanに依存性注入は、型変換スプリングサポートするために使用することができるので、強く型付けされた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>
ときsomething
豆accounts
準備注入性は、強く型付けされた要素に反射して得られたMap<String, Float>
一般的な情報。したがって、ばねは機構を鋳造として同定種々の値Float
(タイプ文字列値9.99
、2.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であってはなりません。それ以外の場合は、スローされます。something
fred
fred
bob
NullPointerException
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
使用して、lazy
BeanはありませんApplicationContext
、事前にインスタンス化するスタートアップnot.lazy
Beanが事前にインスタンス化されます。
Beanがシングルトン豆の依存関係の遅延初期化の遅延初期化でない場合でも、ApplicationContext
それは遅延が起動時に初期化作成しbean
、それが依存関係のシングルトンを満たさなければならないので、。遅延初期化は、bean
他の遅延シングルトンBeanが初期化されていない内に注入されます。
また、使用することができる<beans/>
要素をdefault-lazy-init
次の例に示すように、コンテナレベル遅延初期化の特性を制御します。
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>
- マイCSDN:https://blog.csdn.net/liweitao7610
- 私のブログの庭:https://www.cnblogs.com/aotian/
- 私のジェーン・ブック:https://www.jianshu.com/u/6b6e162f1fdc