1。スプリング構成の概要
1.1。概要
スプリングコンテナは、XML構成、Javaアノテーション、およびスプリングアノテーションからBean構成情報を読み取り、Bean定義レジストリを形成します。
レジストリを定義して、Beanに従ってBeanをインスタンス化します。
BeanインスタンスをBean Cache Poolに入れます。
アプリケーションは豆を使用します。
1.2。 XMLベースの構成
(1)XMLファイルの概要
xmlns---------------------------------------------------------------------------------------------------------------------------
XMLNS:XSI ------------標準名空間、カスタムネームスペースのスキーマファイルを指定するために使用されます
xmlns:xxx = "aaaaa" ------------カスタムネームスペース、xxxはエイリアスであり、次の値AAAAはフルネームです
XSI:Schemalocation -------各ネームスペースごとに特定のスキーマファイルを指定します。フォーマット:名前空間のフルネームファイルアドレス。 。 。スペースで分離します
2。基本的なBean構成
2.1。豆の命名
(1)IDと名前の両方が複数の名前を指定でき、名前はコンマ、セミコロン、またはスペースで区切られています。
<beanname = "#car、123、$ car" class = "xxxxxxxxx">
ユーザーは、getBean( "#car")、getbean( "123")、getbean( "$ car")を使用してgetbeanを使用できます。
(2)IDと名前の属性が指定されていない場合、Springはクラスの完全に適格な名前をBeanの名前として自動的に使用します
(3)複数の匿名の豆がある場合、つまり、クラスの完全な資格のある名前がxxxであると仮定して、指定された名前を持つ<bean/>はありません。
次に、getBean( "xxx")を使用して最初の豆を取得し、getbean( "xxx#1")を使用して2番目のビーンを取得し、getbean( "xxx#2")を使用して3番目のビーンを取得します。
3。依存関係注射
3.1。属性インジェクション
(1)属性インジェクションでは、Beanがデフォルトのコンストラクターを提供し、注入する必要がある属性のセッターメソッドを提供する必要があります。 Springはデフォルトのコンストラクターを呼び出してBeanオブジェクトをインスタンス化し、セッターメソッドを呼び出して反射を通じてプロパティ値を注入します。
(2)Springは、Beanに対応するセッターメソッドがあるかどうかのみを確認し、Beanに対応する属性変数があるかどうかについては要件はありません。
(3)属性命名に関するJavabeanの特別な仕様:変数の最初の2文字は、すべて大文字またはすべて小文字です。
3.2。コンストラクターインジェクション
(1)コンストラクターパラメーターの構成順序は、構成結果に影響しません。 Springの構成ファイルは、要素ラベルの順序とは無関係のポリシーを採用しています。この戦略は、構成情報の確実性をある程度保証することができます。
(2)インデックスごとにパラメーターを一致させます
コンストラクターのエントリパラメータータイプが同じ場合、パラメーターのシーケンシャルインデックスを指定する必要があります。そうしないと、対応する関係を決定できません。のように:
<constructor-argindex = "0" value = "xxxxxx"> <constructor-argindex = "1" value = "xxxxxx">
インデックスは0から始まります。
(3)円形の依存関係の問題
2つの豆のコンストラクター構成が相手に依存する場合、スレッドデッドロックの問題が発生します。
解決策は、コンストラクターの注入を変更して注入属性を変更することです。
3.3。工場メソッドインジェクション
(1)非静地工場法
工場の方法は静的ではないため、最初に工場クラスのインスタンスビーンを作成し、工場ビーンを使用してそれを参照する必要があります
<beanid = "carfactory" class = "Factory class"/> <beanid = "car5" Factory-bean = "CarFactory" Factory-Method = "CreateCar"/>
(2)静的工場法
<beanid = "car5" class = "Factory class" Factory-Method = "CreateCar"/>
3.4。注入パラメータの詳細な説明
(1)XMLの5つの特殊文字
| 特別なシンボル | エスケープシーケンス | 特別なシンボル | エスケープシーケンス |
| < | < | "" | |
| > | > | ' | ' |
| & | & |
(2)<![cdata []]>
<![cdata []]>の目的は、XMLパーサーにタグの文字列を通常のテキストとして扱わせることです。
(3)<null/>タグを使用してnull値を注入します
(4)カスケード属性
<beanid = "parent" class = "xxxxxxx"> <propertyname = "child.xxx" value = "依存関係オブジェクトのプロパティ値"/> </bean>
spring3.0の前に、依存関係オブジェクトの子を最初にインスタンス化する必要があります。そうしないと、例外がスローされます。 Spring3.0以降、インスタンス化を表示する必要はありません。スプリングコンテナは、依存関係オブジェクトを自動的にインスタンス化します。
(5)コレクションマージ
<setMerge = "true"/>
サブクラスで一般的に使用されて、親クラスの収集要素をマージする
(6)utilネームスペースからコレクションタイプの豆を構成します
コレクションタイプのプロパティではなく、コレクションタイプのBeanを構成する場合は、Util Namespaceを介して構成できます。
3.5。自動アセンブリ
(1)<bean/>要素は、Autowireタイプを指定する属性を提供します
3.6。メソッドインジェクション
プロトタイプをシングルトンモード豆に注入し、呼び出すたびに新しい豆を返すことを望んでいる場合、関連する豆を注入するシングルトンモード豆の作用は一度だけ発生するため、従来の注入方法を使用することはできません。
(1)オプションのソリューションは、ホストビーンがコンテナの参照にアクセスできるように、ホストBeanがBeanFactoryAwareインターフェイスを実装できるようにすることです。
Factory.getBean( "Dependated Bean")メソッドでは、毎回最新のBeanを入手できます。
(2)上記の方法は、コードとスプリングを結合します。これは最悪の方法であり、メソッドインジェクションを切り離すことができます。
インターフェイスを定義するだけで、インターフェイスで依存した豆を取得する抽象的な方法を定義する必要があります。スプリング構成は次のとおりです。
<beanid = "car" class = "依存bean"/> <beanid = "host" class = "interface bean"> <lookup-methodname = "getcar" bean = "car"/> </bean>
Lookup-Method Element Tagは、インターフェイスBeanのgetCar()の動的実装を提供します。メソッドインジェクションの実装は、主にCGLIBパッケージの動的操作バイトコードテクノロジーに依存しています。
3.7。メソッド交換
Bean2を使用して、Bean1のGetCarメソッドを置き換えます。Bean2はMethodReplacerインターフェイスを実装する必要があり、構成は次のとおりです。
<beanid = "bean1" class = "aaaaaaaaaa"> <交換methodname = "getcar" applater = "bean2"/> </bean> <beanid = "bean2" class = "bbbbbbbbbb"/>
4。<bean>の関係
4.1。継承
親豆の構成は、繰り返し定義を避けるためにサブクラスによって継承できます。構成は次のとおりです。
<beanid = "parent bean" class = "aaaaaa" abstract = "true"/> <beanid = "child bean" class = "bbbbbb">
サブクラスは、親クラスの構成をオーバーライドできます。親クラスの要約= "true"が指定されていない場合、親豆はインスタンス化されます。
4.2。依存
いくつかの豆は他の豆に依存しており、他の豆は宿主の豆を瞬時にする前にインスタンス化する必要があります。 Springは依存属性を提供し、次のような依存関係が最初にインスタンス化されることを指定します。
<beanid = "host" class = "aaaaaa" diseps-on = "b1"/> <beanid = "b1" class = "bbbbbbbb"/>
複数の前依存性豆がある場合は、コンマ、スペース、またはセミコロンで豆の名前を作成できます。
4.3。 Bean Scope
(1)スプリング容器は、開始時にすべての豆をインスタンス化します。事前にインスタンス化したくない場合、<bean/>の怠zyinit = "true"プロパティは遅延インスタンス化を制御できますが、豆が事前にインスタンス化する必要がある他の豆が参照する場合、春は遅延インスタンス化設定も無視します。
(2)Webアプリケーション関連の範囲
ユーザーがリクエスト、セッション、グローバルセッションスコープを使用する場合、最初に追加の構成をWebコンテナで実行する必要があります。
Webコンテナの低いバージョン(サーブレット2.3の前)では、HTTPリクエストフィルター構成を使用できます。
<filter> <filter-name> requestcontextfilter </filter-name> <filter-class> org.springframework.filter.requestcontextfilter </filter-class> </filter> <filter-name> requestcontextfilter </filter-name> <url-perthern>
Webコンテナのより高いバージョンでは、HTTPリクエストリスナーを使用して構成を使用できます。
<リスナー> <リスナークラス> org.springframework.web.context.request.RequestContextListener </ristener-class> </ristener>
(3)スコープ依存関係の問題
Webスコープ豆をシングルトンまたはプロトタイプ豆に注入する場合、たとえばAOPを使用してください。
<bean id = "web1" scope = "request"> <aop:scoped-proxy/> </bean> <bean id = "singleton1"> <プロパティ名= "z1" ref = "web1"/> </bean>
4.4。ファクトリビーン
一般的に言えば、Springは<bean/>のクラス属性を使用して、反射メカニズムを介して実装クラスインスタンス化Beanを指定します。しかし、場合によっては、豆をインスタンス化するプロセスがより複雑になります。従来の方法では、<bean>で大量の構成情報が必要です。構成方法の柔軟性は制限されており、エンコード方法を使用して簡単なソリューションを取得できます。
Springはorg.springframework.beans.factory.factorybean Factoryクラスインターフェイスを提供し、このインターフェイスを実装してインスタンス化する豆のロジックをカスタマイズできます。
<bean/>>のクラス属性によって構成された実装クラスがFactorybeanとそのサブクラスである場合、Factorybean()メソッドのreturnはFactorybeanとそのサブクラス自体を返さず、ObjectはFactorybean getObject()メソッドによって返されます。
FactoryBeanとそのサブクラス自体のオブジェクトを取得したい場合は、GetBean(beanName)メソッドの場合、getBean( "&car5")などの「&」プレフィックスをbeanNameに明示的に接頭します。
5。注釈ベースの構成
5.1。注釈タイプ
@Component -----ネイティブアノテーション
派生アノテーション:
@Repository:ANNotate Dao
@Service:ラベルサービス
@Controller:注釈コントローラー
5.2。注釈設定情報を使用して、スプリングコンテナを起動します
(1)スプリング2.5の後、コンテキスト名空間が導入されました。これにより、クラスパッケージをスキャンして豆を定義するための注釈の適用が提供されます。
<コンテキスト:component-scanベースパッケージ= "xxxxxxxxxx" resource-pattern = "xxxx/*。class">
Resource-Pattern属性は、ベースパッケージでスキャンする必要がある特定のパッケージの下のクラスを指定するために使用されます
(2)より強力なフィルターサブラベルがあります
<context:component-scan base-package="xxxxxxxxxx" > <context:include-filter type="xxxx" expression="xxxxxxxxxxxxxxxx"/> <context:exclude-filter type="xxxx" expression="xxxxxxxxxxxxxxx"/></context:component-scan>
あらゆるタイプのうち、AspectJのフィルタリング能力が最も強力です。
5.3。豆の自動アセンブリ
(1)@Autowired
@Autowiredは、デフォルトでタイプごとに一致します。コンテナに一致する豆がない場合、スプリングコンテナが起動すると例外がスローされます。注釈には@Autowired(必須= False)を使用できますが、例外はスローされません。
@autowiredを使用して、メソッドパラメーターに直接注釈を付けます。メソッドに複数のパラメーターがある場合、デフォルトでは、Springはインジェクションのパラメータータイプに一致する豆を自動的に選択します。
コレクション変数の@Autowiredアノテーションを使用して、コレクションの要素タイプに一致するすべての豆を注入できます。これは非常に強力です。
@Autowiredアセンブラープロパティを使用すると、セッターメソッドはありません。
(2)@qualifiler
容器に複数の一致する豆がある場合、豆の名前は @qualifilerアノテーションによって資格を得ることができます。
(3)マーキングと注釈のサポート
Springは、JSR-250で定義された@ResourceとJSR-330で定義された@Injectアノテーションもサポートしています
@Resourceは、Beanの名前属性Beanが提供されることを要求しています。属性が空の場合、変数名またはメソッド名はBeanの名前として自動的に使用されます。
(4)キーポイント:
@Autowiredのみを使用する場合でも、XMLの<Bean/>ノードを明示的に定義する必要があります。スプリングコンテナは、デフォルトで注釈アセンブリを無効にします。それを有効にする方法は、XMLの<コンテキスト:annotation-config/>要素を構成することです。
しかし、Springは別のトリックも提供します。 <コンテキスト:Component-Scan/>要素を使用すると、スプリングコンテナは、<Bean/>ノードを明示的に定義せずにBeanを自動的に検出します。
Springは、@Component、@Repository、@Service、および@Controllerを介して注釈クラスをアノテーションします。
サードパーティのJARパッケージを使用し、サードパーティのJARパッケージにアノテーションを注釈していなくても、サードパーティのJARパッケージにクラスを自動的に挿入する場合、フィルター要素<コンテキスト:インクルードフィルター>は注釈ベースのコンポーネントスキャンポリシーを置き換えることができます。
5.4。 Beanのアクションおよびライフプロセスの範囲
(1)@scope( "xxxx")
注釈によって構成された豆のデフォルトの範囲はSingletonです。
春は@scopeアノテーションを提供します。クラスに関しては、注釈パラメーターはXMLのスコープ属性の値と同じです。
(2)ライフプロセス方法の比較
| <bean> | 注釈 |
| init-method | @PostConstruct |
| DESTORY-METHOD | @predestroy |
違い:注釈はクラス内の複数のメソッドを定義でき、メソッドは順番に実行されます
6。Javaベースの構成
6.1。 Javaクラスを使用して、Bean定義情報を提供します
(1)通常のPojoは、@Configurationアノテーションがマークされている限り、スプリングコンテナのBean定義情報を提供できます。 @Beanでマークされた各方法は、Bean定義情報の提供と同等です。
(2)@Bean
豆のタイプは、@beanによって注釈されたメソッドのリターン値タイプによって決定されます
Beanのデフォルト名はメソッド名と同じであり、@bean(name = "xxx")で明示的に指定することもできます。
@Beanの@Scopeを使用して、Beanの使用範囲を示すことができます
(3)@configuration
@Configuration Annotationクラス自体には@Component Annotationがマークされているため、@Configurstionでマークされたクラスは、@Autowiredを使用して他のクラスに自動的に組み立てることができます。
6.2。 Javaクラスに基づいて構成情報を使用してスプリングコンテナを起動します
(1)Springは、AnnotationConfigApplicationContectクラスを提供します。クラスは、@Configurationアノテーションのクラスを通じてスプリングコンテナを直接起動できます。
(2)複数の構成クラスがある場合
AnnotationConfigApplicationContectのレジスタメソッドを介して1つずつ登録してから、更新メソッドを呼び出してコンテナを更新して、これらの登録された構成クラスを適用します。
@Import(xxx.class)Annotationを使用して、他のすべての構成クラスを1つの構成クラスに導入することもできます。これにより、1つの構成クラスのみを登録する必要があります。
(3)XML構成クラスを介した@Configurationの構成を参照してください
<コンテキスト:component-scanbase-package = "..." resource-pattern = "Configuration class name">
(4)構成クラスのXML構成情報を参照します
@configurationで@importresource( "classpath:............")を使用してxml構成ファイルをインポートします
6.3。 3つの構成方法の比較
| XML | 注釈 | Javaクラス |
| Beanの実装クラスは現在のプロジェクト開発です | 豆のインスタンス化がより複雑であるシナリオに適したコードを介して、豆の初期化の全体的な論理を制御する |
要約します
上記は、IOC容器内の春の組み立て豆のすべての詳細な説明です。私はそれが誰にでも役立つことを願っています。興味のある友達は引き続きこのサイトを参照できます:
春3.xの3つのBean構成方法の詳細な説明
春のシングルトンビーンとシングルトンパターンの違いに関する簡単な議論
スプリング構成の使用量のライフサイクルの詳細な説明
欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!