1. XML構成でのBean自動アセンブリ
Spring IOCコンテナはBeanを自動配線できます。必要なのは、<bean>のautowire属性で自動配線モードを指定することだけです。自動組み立て方法は次のとおりです。
- byType(タイプに応じた自動配線):ターゲットBeanタイプと一致するIOCコンテナーに複数のBeanがある場合、この場合、Springはこの属性に最適なBeanを判別できないため、自動配線を実行できません。
- byName(名前に基づいて自動的にアセンブルされる):ターゲットBeanの名前とプロパティ名は、まったく同じに設定する必要があります。
サンプルコード:
Person.javaとPersonには、名前、住所、車の3つの属性があります。
package com.java.spring.autowire;
public class Person {
private String name;
private Address address;
private Car car;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", address=" + address + ", car=" + car + "]";
}
}
Address.java
package com.java.spring.autowire;
public class Address {
private String city;
private String street;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
@Override
public String toString() {
return "Address [city=" + city + ", street=" + street + "]";
}
}
Car.java
package com.java.spring.autowire;
public class Car {
private String brand;
private double price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}
}
1.1自動アセンブリにbyNameを使用する
byNameを使用して、現在のBeanのBean名とセッタースタイルのプロパティ名に従って自動ワイヤリングします。一致する自動転送がある場合、一致する割り当ては空ではありません。
<bean id="address" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" autowire="byName"></bean>
実行後の出力:
Person [name=Tom, address=Address [city=上海, street=南京路], car=Car [brand=Audi, price=500000.0]]
構成が次のとおりである場合:
<bean id="address1212" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" autowire="byName"></bean>
address1212は、セッタースタイルのプロパティ名のアドレスと一致していないため、アドレスを割り当てることができません。
Person [name=Tom, address=null, car=Car [brand=Audi, price=500000.0]]
1.2自動アセンブリにbyTypeを使用する
byTypeは、Beanのタイプと現在のBean属性のタイプに従って自動的にアセンブルします。IOCコンテナにタイプが一致するBeanが複数ある場合、例外がスローされます。
<bean id="address" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" autowire="byType"></bean>
実行後の出力:
Person [name=Tom, address=Address [city=上海, street=南京路], car=Car [brand=Audi, price=500000.0]]
構成が次のとおりである場合:
<bean id="address" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="car1231" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" autowire="byType"></bean>
例外スロー表示:(理由は2つのCarタイプBeanがあるためです)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.java.spring.autowire.Car] is defined: expected single matching bean but found 2: car,car1231
自動アセンブリ用のBean構成ファイルでautowire属性を設定すると、Beanのすべての属性がアセンブルされます。ただし、個々の属性のみをアセンブルしたい場合、autowire属性は十分に柔軟ではありません。autowire属性は、タイプまたは名前に従って自動的にアセンブルされます。一般に、自動アセンブリ機能は、実際のプロジェクトではめったに使用されません。これは、明確な構成ドキュメントが、自動アセンブリ機能によってもたらされる利点よりも説得力があるためです。
2. Bean間の関係:継承と依存関係
2.1 Springでは、Beanの構成を継承できます。継承されたBeanは親Beanと呼ばれ、この親Beanを継承するBeanは子Beanと呼ばれます。子Beanは、Beanの属性構成を含め、親Beanから構成を継承できます。また、子Beanは、親Beanから継承した構成をオーバーライドすることもできます。
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="car2" class="com.java.spring.autowire.Car" p:price="300000.0000" parent="car"></bean>
メインメソッドでBeanインスタンスを取得します。
Car car=(Car) ctx.getBean("car2");
実行後の出力:
Car [brand=Audi, price=300000.0]
2.2親Beanは、構成テンプレートまたはBeanインスタンスとして使用できます。親Beanをテンプレートとしてのみ使用する場合は、<bean>のabstractプロパティをtrueに設定して、SpringがBeanをインスタンス化しないようにすることができます。
抽象Beanとして設定されている場合は、インスタンス化できません。
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000" abstract="true"></bean>
mainメソッドでインスタンスを取得します。
Car car=(Car) ctx.getBean("car");
異常報告:
Exception in thread "main" org.springframework.beans.factory.BeanIsAbstractException: Error creating bean with name 'car': Bean definition is abstract
<bean>要素のすべての属性が継承されるわけではありません。例:autowire、abstractなど。親Beanのクラス属性を無視して、子Beanに独自のクラスを指定させ、同じ属性構成を共有させることもできます。ただし、現時点では抽象trueに設定します。
2.2 Springでは、ユーザーがdepends-on属性を使用して事前依存Beanを設定できます。事前依存Beanは、このBeanがインスタンス化される前に作成されます。プレフィックスが複数のBeanに依存している場合は、Bean名をコンマ、スペース、またはで構成できます。
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" p:address-ref="address" depends-on="car"></bean>
Car Beanが構成されていない場合、エラーが報告されます。
3. Beanのスコープ
3.1シングルトン
Springでは、<bean>要素のscope属性でBeanのスコープを設定できます。デフォルトでは、SpringはIOCコンテナーで宣言された各Beanに対して一意のインスタンスのみを作成し、IOCコンテナー全体で共有できます。インスタンス:後続のすべてのgetBean()呼び出しとBean参照は、この一意のBeanインスタンスを返します。スコープはシングルトンと呼ばれ、すべてのBeanのデフォルトスコープです。
<bean id="address" class="com.java.spring.autowire.Address" p:city="上海" p:street="南京路"></bean>
<bean id="car" class="com.java.spring.autowire.Car" p:brand="Audi" p:price="500000.0000"></bean>
<bean id="person" class="com.java.spring.autowire.Person" p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
mainメソッドでインスタンスを取得します。
public class Main {
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-relation.xml");
Person person1=(Person) ctx.getBean("person");
Person person2=(Person) ctx.getBean("person");
System.out.println(person1==person2);
}
System.out.println(person1 == person2);印刷結果はtrue、person1とperson2は同じオブジェクトです。
3.2プロトタイプ
プロトタイプ。コンテナは初期化時にBeanインスタンスを作成しませんが、新しいBeanインスタンスを作成して、要求されるたびに戻ります。
wxで「プログラマーコアラ」を検索し、Javaの分野に焦点を合わせてください。