Spring IOC(修正待ち)
14374 ワード
Beanメタデータ情報Springコンテナ内の対応物は、個々のBeanDefinitionによって形成されたBeanレジストリであり、
Bean構成情報は、Beanの実装および依存関係を定義します.
Beanの名前:
idはBeanの名称として、IOC容器の中で唯一でなければならない.アルファベットで始まる.後はa-zA-Z 0-9-などである.
Beanはnameで命名することもできますが、nameには文字上の制限はなく、ほとんど任意の文字を使用することができますが、中国語の文字は使用しないほうがいいです.nameは繰り返してもいいです.getBean(beanName)のときに最後のbeanを返します.
nameは複数のカンマを書くことができて、隔てて、例えばname=“p,q”、idはできません
idとnameが指定されていない場合、nameはクラスのフルネームをBean名としてデフォルトで使用し、 はgetBean("com.baobaotao.simple.Boss")を使用します.に表示されます.
同じコンテナ:
最初はgetBean(「com.baobaotao.simple.Boss」)を通過します.またはgetBean("com.baobaotao.simple.Boss#0");2つ目はgetBean(「com.baobaotao.simple.Boss#1」)を介して取得されます.得られ、3番目はgetBean(「com.baobaotao.simple.Boss 2」)を通過する.取得
依存注入:
属性注入:
bean:同じコンテナまたは親コンテナのBean(一般)
local:同じプロファイルで定義されたbean
parent:親コンテナのbean
親子コンテナは同じidのbeanを許可し、子コンテナは親コンテナのbeanにアクセスできますが、親コンテナは子コンテナのbeanにアクセスできません.私たち自身は親子コンテナを書くことはめったにありません.次は親子コンテナの簡単なコードです.
上は内部bean、idが提供されていますが、他のbeanは使用できません.name、id、scope属性は無視されます.ここでscopeはデフォルトでprototypeです.sportsCarがprototypeタイプであれば、「新しい」sportsCarが得られるたびにbrand対応するbeanの構造方法が呼び出されます.外で定義されたbeanであれば、scopeのデフォルト値はsingletonで、上で定義したsportsCarはsingletonタイプです.
操作を簡略化するためにpネーミングスペースを使用できます.p:属性名=「xxx」 p:属性名_ref=「xxx」、例えば:
コレクションタイプのbeanを構成する場合はutilネーミングスペースを使用します.
もちろんutilクラスには、次のような他の用途があります.
構築方法注入:
タイプ別:
両方を組み合わせて使用することもできます.
コンストラクションメソッドを使用して注入すると、Bean 1にBean 2プロパティがあり、Bean 2にもBean 1プロパティがあり、どちらもコンストラクション注入を使用するとサイクル依存の問題が発生する可能性があります.
工場メソッド注入:(参考:http://550516671-qq-com.iteye.com/blog/803999)
非静的メソッド:
静的メソッド:
Beanの役割ドメインはscopeプロパティで指定されます.値は次のとおりです(参照:http://blog.csdn.net/mastermind/article/details/1932787)
singleton
1つのbean定義をsingleton役割ドメインに設定すると、Spring IOCコンテナはそのbean定義の唯一のインスタンスのみを作成します.この単一インスタンスは、singleton cache(singleton cache)に格納され、beanに対する後続の要求および参照はすべてキャッシュされたオブジェクトインスタンスを返します.ここで、singleton役割ドメインとGOF設計モードの単一インスタンスは完全に異なり、単一設計モードは、ClassLoaderに1つのclassしか存在しないことを示します.ここのsingletonは、1つの容器が1つのbeanに対応していることを示しています.つまり、1つのbeanがsingletonと表示されると、springのIOC容器には1つのbeanしか存在しません.
prototype
prototype役割ドメインに配備されたbeanは、リクエストごとに(別のbeanに注入するか、プログラム的にコンテナを呼び出す)
request
requestは、HTTPリクエストごとに新しいbeanが生成されることを示し、現在のHTTP request内でのみ有効である
session
セッション役割ドメインは、HTTPリクエストごとに新しいbeanが生成されることを示し、現在のHTTPセッション内でのみ有効である
global session
global session役割ドメインは標準的なHTTP Session役割ドメインに似ていますが、portletベースのwebアプリケーションでのみ意味があります.Portlet仕様は、あるportletウェブアプリケーションを構成する様々な異なるportletによって共有されるグローバルSessionの概念を定義する.グローバルセッションの役割ドメインで定義されたbeanは、グローバルportletセッションのライフサイクルの範囲内に限定されます.Webでglobal session役割ドメインを使用してbeanを識別すると、Webは自動的にsessionタイプとして使用されます.
カスタムbeanアセンブリドメイン
Spring 2.0では、役割ドメインは任意に拡張できます.役割ドメインをカスタマイズすることもできます.既存の役割ドメインを再定義することもできます(singletonとprototypeを上書きすることはできません).springの役割ドメインは、インタフェースorg.springframework.beans.factory.config.Scopeによって定義されます.自分の役割ドメインをカスタマイズするには、インタフェースを実現すればいいです.
bean間の依存関係は自動的に組み立てることができ、beansでは属性default-autowire(グローバルにすべてのbeanに有効)を構成し、beanでautowireを設定して実現することができます.値は次のとおりです.
No:ref要素で依存を指定する
byName:コンテナ内で自動アセンブリが必要な属性名と同じBean(またはID)を探し、一致するBeanが見つからない場合、その属性はアセンブリされません.
byType:コンテナ内で自動アセンブリが必要な属性タイプと同じBeanを探します.一致するBeanが見つからない場合、このプロパティはアセンブリされません.
Constructor:自動組立が必要なBeanの構造方法パラメータと一致する1つまたは複数のBeanをコンテナ内で検索し、不確定なBeanまたは構造方法が存在する場合、コンテナは異常org.springframework.beans.factory.UnsatisfiedDependencyExceptionを放出する.
Autodetect:constructorまたはbyTypeを使用して自動的にアセンブリされます.デフォルトの無パラメトリック構造が指定されている場合はbyTypeを使用します.
メソッド注入:
BeanFactoryAwareをbeanに実装させ、メソッドにreturn(Car)factory.getBean(「car」)と書く.単一例のbeanで属性を取得するたびにprototypeタイプのオブジェクトが必要になる
lookup注入:beanのメソッドの戻り値は、メソッドを実行して得られた結果ではなく、コンテナ内のbeanです.ここでは、beanのサブクラスを動的に作成したり、クラスを実装したりすることによって実現されます.たとえば、
ここでuserManagerのgetUserDaoを呼び出すと、UserManagerのgetUserDaoが実装されているかどうかにかかわらず、userDaoが返されます.
メソッドの置換:
1つのbeanのメソッドは、別のbeanの同じ署名のメソッドで置き換えられます.たとえば、次のようになります.
bean間の関係:
継承:
親beanは一般的にabstract=「true」を設定し、コードが多重化されるためだけ、サブbean書き込み属性parent=「parentbeanid」を表し、beanは親beanの構成情報をコピーすることができる.
依存関係:
beanにdepends-on=「beana」と書くと、現在のbeanをインスタンス化する際に依存するbeanがあることが保証されます.依存関係springを書かなくても自動的に処理され、この属性は主にコードに依存することが明らかでない場合に使用されます.
参照:
以前のrefタグをidrefタグに変更し、id値を書き間違えた場合は、実行時に再報告するのではなく、コンテナの起動時に報告を間違えます.
別のプロファイルを含むプロファイルが必要な場合は、を使用します.
beanラベルのプロパティinit-method=「init」 インスタンス化beanの後に呼び出されるメソッドを定義します. destroy-method=「destory」は、beanを破棄する前に呼び出すメソッドを定義します.この2つのメソッドは、bean内部で定義されたメソッドです.prototypeのbeanの場合、コンテナは作成のみを担当し、破棄は担当しません.
以上xmlで使用していますが、注釈を使うならもう1編:spring IOC annotation
Bean構成情報は、Beanの実装および依存関係を定義します.
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="car" name="#car1" class="com.baobaotao.simple.Car"></bean>
<bean id="boss" class="com.baobaotao.simple.Boss"></bean>
</beans>
Beanの名前:
idはBeanの名称として、IOC容器の中で唯一でなければならない.アルファベットで始まる.後はa-zA-Z 0-9-などである.
Beanはnameで命名することもできますが、nameには文字上の制限はなく、ほとんど任意の文字を使用することができますが、中国語の文字は使用しないほうがいいです.nameは繰り返してもいいです.getBean(beanName)のときに最後のbeanを返します.
nameは複数のカンマを書くことができて、隔てて、例えばname=“p,q”、idはできません
idとnameが指定されていない場合、nameはクラスのフルネームをBean名としてデフォルトで使用し、
同じコンテナ:
最初はgetBean(「com.baobaotao.simple.Boss」)を通過します.またはgetBean("com.baobaotao.simple.Boss#0");2つ目はgetBean(「com.baobaotao.simple.Boss#1」)を介して取得されます.得られ、3番目はgetBean(「com.baobaotao.simple.Boss 2」)を通過する.取得
依存注入:
属性注入:
<bean id="car" class="com.baobaotao.attr.Car" lazy-init="default">
<property name="brand">
<value>
<![CDATA[ &CA72]]>
</value>
</property>
<property name="maxSpeed">
<value>200</value>
</property>
<property name="price" value="2000.00" />
</bean>
プロパティ名は小文字で始まり、javaネーミング仕様に合致する必要があります.特別な場合は、プロパティの最初の2文字を保持するか、すべて大文字または小文字にします. <property name="favorites">
<set>
<value> </value>
<value> </value>
<value> </value>
</set>
</property>
<list>
<value> </value>
<value> </value>
<value> </value>
</list>
<list>
<ref bean="usera"/>
<ref bean="userb"/>
<ref bean="userc"/>
</list>
<array>
<value> </value>
<value> </value>
</array>
<map>
<entry >
<key>
<value>AM</value>
</key>
<value> </value>
</entry>
<entry>
<key>
<value>PM</value>
</key>
<value> </value>
</entry>
</map>
<props>
<prop key="jobMail">[email protected]</prop>
<prop key="lifeMail">[email protected]</prop>
</props>
<property name="car">
<ref local="car" /> bean id
</property>
要素は、他のコンテナのBeanを3つの属性で参照できます.bean:同じコンテナまたは親コンテナのBean(一般)
local:同じプロファイルで定義されたbean
parent:親コンテナのbean
親子コンテナは同じidのbeanを許可し、子コンテナは親コンテナのbeanにアクセスできますが、親コンテナは子コンテナのbeanにアクセスできません.私たち自身は親子コンテナを書くことはめったにありません.次は親子コンテナの簡単なコードです.
ClassPathXmlApplicationContext parentFactory=new ClassPathXmlApplicationContext(new String[]{"parent.xml"});
ClassPathXmlApplicationContext childFactory=new ClassPathXmlApplicationContext(new String[]{"parent.xml"},parentFactory);
childFactory.getBean("bean");
<bean id="sportsCar" class="com.baobaotao.attr.SportsCar">
<property name="brand">
<bean id="car.brand"
class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
</bean>
</property>
</bean>
上は内部bean、idが提供されていますが、他のbeanは使用できません.name、id、scope属性は無視されます.ここでscopeはデフォルトでprototypeです.sportsCarがprototypeタイプであれば、「新しい」sportsCarが得られるたびにbrand対応するbeanの構造方法が呼び出されます.外で定義されたbeanであれば、scopeのデフォルト値はsingletonで、上で定義したsportsCarはsingletonタイプです.
<property name="IDCode"><value></value></property>
<property name="IDCode"><null/></property> null
<property name="car.name"><null/></property> .getCar().setName(null); car null,
子beanが親beanの同名の集合要素を継承した場合、親子をマージできます.<bean id="parentBoss" abstract="true"
class="com.baobaotao.attr.Boss">
<property name="favorites">
<set>
<value> </value>
<value> </value>
<value> </value>
</set>
</property>
</bean>
<bean id="childBoss" parent="parentBoss">
<property name="favorites">
<set merge="true">
<value> </value>
<value> </value>
</set>
</property>
</bean>
操作を簡略化するためにpネーミングスペースを使用できます.p:属性名=「xxx」 p:属性名_ref=「xxx」、例えば:
<bean id="car" class="com.baobaotao.ditype.Car"
p:brand=" &CA72"
p:maxSpeed="200"
p:price="20000.00"/>
<bean id="boss" class="com.baobaotao.ditype.Boss"
p:car-ref="car"/>
コレクションタイプのbeanを構成する場合はutilネーミングスペースを使用します.
<util:list id="favoriteList1" list-class="java.util.LinkedList">
<value> </value>
<value> </value>
<value> </value>
</util:list>
<util:set id="favoriteSet1" >
<value> </value>
<value> </value>
<value> </value>
</util:set>
<util:map id="emails1" >
<entry key="AM" value=" " />
<entry key="PM" value=" " />
</util:map>
<util:properties id="emailProps1"
location="classpath:com/baobaotao/fb/mails.properties" />
もちろんutilクラスには、次のような他の用途があります.
<property name="brand">
<util:constant
static-field="com.baobaotao.fb.CarBrandType.HONG_QI" />
</property>
<property name="brand">
<util:property-path path="boss.car.brand"/> id boss bean car brand
</property>
構築方法注入:
タイプ別:
<bean name="constructorBean" class="bean.ConstructorBean">
<constructor-arg type="java.lang.String" value="1"/>
<constructor-arg type="java.lang.Integer" value="2"/>
</bean>
同じタイプのコンストラクションメソッドが2つある場合に問題が発生します.インデックス値:<bean name="constructorBean" class="bean.ConstructorBean">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="2"/>
</bean>
両方を組み合わせて使用することもできます.
<bean name="constructorBean" class="bean.ConstructorBean">
<constructor-arg index="0" type="java.lang.String" value="1"/>
<constructor-arg index="1" type="int" value="2"/>
</bean>
コンストラクションメソッドを使用して注入すると、Bean 1にBean 2プロパティがあり、Bean 2にもBean 1プロパティがあり、どちらもコンストラクション注入を使用するとサイクル依存の問題が発生する可能性があります.
工場メソッド注入:(参考:http://550516671-qq-com.iteye.com/blog/803999)
非静的メソッド:
public class CarFactory {
public Car createHongQiCar(){
Car car = new Car();
car.setName(" ");
car.setSpeed("200");
return car;
}
}
<bean id="carFactory" class="com.lbx.factory.CarFactory"></bean>
<bean id="car" factory-bean="carFactory" factory-method="createHongQiCar"></bean>
静的メソッド:
public class CarFactory2 {
public static Car createHongQiCar(){
Car car = new Car();
car.setName(" ");
car.setSpeed("200");
return car;
}
}
<bean id="car" class="com.lbx.factory.CarFactory2" factory-method="createHongQiCar"></bean>
Beanの役割ドメインはscopeプロパティで指定されます.値は次のとおりです(参照:http://blog.csdn.net/mastermind/article/details/1932787)
singleton
1つのbean定義をsingleton役割ドメインに設定すると、Spring IOCコンテナはそのbean定義の唯一のインスタンスのみを作成します.この単一インスタンスは、singleton cache(singleton cache)に格納され、beanに対する後続の要求および参照はすべてキャッシュされたオブジェクトインスタンスを返します.ここで、singleton役割ドメインとGOF設計モードの単一インスタンスは完全に異なり、単一設計モードは、ClassLoaderに1つのclassしか存在しないことを示します.ここのsingletonは、1つの容器が1つのbeanに対応していることを示しています.つまり、1つのbeanがsingletonと表示されると、springのIOC容器には1つのbeanしか存在しません.
prototype
prototype役割ドメインに配備されたbeanは、リクエストごとに(別のbeanに注入するか、プログラム的にコンテナを呼び出す)
getBean()
メソッド)は、新しいbeanインスタンスを生成します.newの操作に相当します.prototypeドメインのbeanにとって、Springはprototype beanのライフサイクル全体に責任を負うことができません.コンテナは、初期化、構成、装飾、またはprototypeインスタンスをアセンブリした後、クライアントに渡します.その後、prototypeのインスタンスについては聞かない.どの役割ドメインでも、コンテナはすべてのオブジェクトの初期化ライフサイクルコールバックメソッドを呼び出しますが、prototypeでは構成されたプロファイルライフサイクルコールバックメソッドは呼び出されません.prototype役割ドメインのオブジェクトを消去し、prototype beanが持つ高価なリソースを解放することは、クライアントコードの役割です.(Springコンテナにsingleton役割ドメインbeanによって占有されるリソースを解放させる1つの実行可能な方法は、beanのバックグラウンドプロセッサを使用することによって、プロセッサが消去されるbeanの参照を持つことである.)request
requestは、HTTPリクエストごとに新しいbeanが生成されることを示し、現在のHTTP request内でのみ有効である
session
セッション役割ドメインは、HTTPリクエストごとに新しいbeanが生成されることを示し、現在のHTTPセッション内でのみ有効である
global session
global session役割ドメインは標準的なHTTP Session役割ドメインに似ていますが、portletベースのwebアプリケーションでのみ意味があります.Portlet仕様は、あるportletウェブアプリケーションを構成する様々な異なるportletによって共有されるグローバルSessionの概念を定義する.グローバルセッションの役割ドメインで定義されたbeanは、グローバルportletセッションのライフサイクルの範囲内に限定されます.Webでglobal session役割ドメインを使用してbeanを識別すると、Webは自動的にsessionタイプとして使用されます.
カスタムbeanアセンブリドメイン
Spring 2.0では、役割ドメインは任意に拡張できます.役割ドメインをカスタマイズすることもできます.既存の役割ドメインを再定義することもできます(singletonとprototypeを上書きすることはできません).springの役割ドメインは、インタフェースorg.springframework.beans.factory.config.Scopeによって定義されます.自分の役割ドメインをカスタマイズするには、インタフェースを実現すればいいです.
bean間の依存関係は自動的に組み立てることができ、beansでは属性default-autowire(グローバルにすべてのbeanに有効)を構成し、beanでautowireを設定して実現することができます.値は次のとおりです.
No:ref要素で依存を指定する
byName:コンテナ内で自動アセンブリが必要な属性名と同じBean(またはID)を探し、一致するBeanが見つからない場合、その属性はアセンブリされません.
byType:コンテナ内で自動アセンブリが必要な属性タイプと同じBeanを探します.一致するBeanが見つからない場合、このプロパティはアセンブリされません.
Constructor:自動組立が必要なBeanの構造方法パラメータと一致する1つまたは複数のBeanをコンテナ内で検索し、不確定なBeanまたは構造方法が存在する場合、コンテナは異常org.springframework.beans.factory.UnsatisfiedDependencyExceptionを放出する.
Autodetect:constructorまたはbyTypeを使用して自動的にアセンブリされます.デフォルトの無パラメトリック構造が指定されている場合はbyTypeを使用します.
メソッド注入:
BeanFactoryAwareをbeanに実装させ、メソッドにreturn(Car)factory.getBean(「car」)と書く.単一例のbeanで属性を取得するたびにprototypeタイプのオブジェクトが必要になる
lookup注入:beanのメソッドの戻り値は、メソッドを実行して得られた結果ではなく、コンテナ内のbeanです.ここでは、beanのサブクラスを動的に作成したり、クラスを実装したりすることによって実現されます.たとえば、
<bean name="userManager" class="research.spring.beanfactory.ch2.UserManager">
<lookup-method name="getUserDao" bean="userDao" />
</bean>
ここでuserManagerのgetUserDaoを呼び出すと、UserManagerのgetUserDaoが実装されているかどうかにかかわらず、userDaoが返されます.
メソッドの置換:
1つのbeanのメソッドは、別のbeanの同じ署名のメソッドで置き換えられます.たとえば、次のようになります.
<bean id="boss2" class="com.baobaotao.injectfun.Boss2"/>
<bean id="boss1" class="com.baobaotao.injectfun.Boss1">
<replaced-method name="getCar" replacer="boss2"></replaced-method>
</bean>
bean間の関係:
継承:
親beanは一般的にabstract=「true」を設定し、コードが多重化されるためだけ、サブbean書き込み属性parent=「parentbeanid」を表し、beanは親beanの構成情報をコピーすることができる.
依存関係:
beanにdepends-on=「beana」と書くと、現在のbeanをインスタンス化する際に依存するbeanがあることが保証されます.依存関係springを書かなくても自動的に処理され、この属性は主にコードに依存することが明らかでない場合に使用されます.
参照:
以前のrefタグをidrefタグに変更し、id値を書き間違えた場合は、実行時に再報告するのではなく、コンテナの起動時に報告を間違えます.
別のプロファイルを含むプロファイルが必要な場合は、
beanラベルのプロパティinit-method=「init」 インスタンス化beanの後に呼び出されるメソッドを定義します. destroy-method=「destory」は、beanを破棄する前に呼び出すメソッドを定義します.この2つのメソッドは、bean内部で定義されたメソッドです.prototypeのbeanの場合、コンテナは作成のみを担当し、破棄は担当しません.
以上xmlで使用していますが、注釈を使うならもう1編:spring IOC annotation