Spring 學習(五)——XML 配置裡的 Bean 自動裝配
阿新 • • 發佈:2018-12-18
XML 配置裡的 Bean 自動裝配
•Spring IOC 容器可以自動裝配 Bean. 需要做的僅僅是在 <bean> 的 autowire 屬性裡指定自動裝配的模式
•byType(根據型別自動裝配): 若 IOC 容器中有多個與目標 Bean 型別一致的 Bean. 在這種情況下, Spring 將無法判定哪個 Bean 最合適該屬性, 所以不能執行自動裝配.
<bean id="person" class="com.hzyc.spring.bean.autowire.Person" p:name="薛恆傑" autowire="byType"/>
•byName(根據名稱自動裝配): 必須將目標 Bean 的名稱和屬性名設定的完全相同.
<bean id="person" class="com.hzyc.spring.bean.autowire.Person"
p:name="薛恆傑" autowire="byName"/>
•constructor(通過構造器自動裝配): 當 Bean 中存在多個構造器時, 此種自動裝配方式將會很複雜. 不推薦使用
程式碼示例如下
1、檔案結構示意:
2、Person.java
package com.hzyc.spring.bean.autowire; /** * @author xuehj2016 * @Title: Person * @ProjectName spring01 * @Description: TODO * @date 2018/12/1710:30 */ 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.hzyc.spring.bean.autowire; /** * @author xuehj2016 * @Title: Address * @ProjectName spring01 * @Description: TODO * @date 2018/12/1710:30 */ 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.hzyc.spring.bean.autowire;
/**
* @author xuehj2016
* @Title: Car
* @ProjectName spring01
* @Description: TODO
* @date 2018/12/1710:30
*/
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 +
'}';
}
}
3、bean-autowire.xml
<?xml version="1.0" encoding="UTF-8"?>
<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="address" class="com.hzyc.spring.bean.autowire.Address"
p:city="北京" p:street="中關村"/>
<bean id="address2" class="com.hzyc.spring.bean.autowire.Address"
p:city="大連" p:street="星海廣場"/>
<bean id="car" class="com.hzyc.spring.bean.autowire.Car"
p:brand="奧迪" p:price="400000"/>
<!--
<bean id="person" class="com.hzyc.spring.bean.autowire.Person"
p:name="薛恆傑" p:address-ref="address" p:car-ref="car5"/>
-->
<!--
可以使用 autowire 屬性指定自動裝配的方式
byName: 根據 bean 的名字和當前 bean 的 setter 風格的屬性名進行自動匹配,
若有匹配的,則自動裝配,若沒有匹配的,則不裝配
byType: 根據 bean 的型別和當前 bean 屬性的型別進行自動裝配,
若 IOC 容器中有 1 個以上型別匹配的 bean ,則丟擲異常
-->
<bean id="person" class="com.hzyc.spring.bean.autowire.Person"
p:name="薛恆傑" autowire="byName"/>
</beans>
4、Main.java
package com.hzyc.spring.bean.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author xuehj2016
* @Title: Main
* @ProjectName spring01
* @Description: TODO
* @date 2018/12/1710:44
*/
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean-autowire.xml");
Person person = (Person) applicationContext.getBean("person");
System.out.println(person);
}
}
XML 配置裡的 Bean 自動裝配的缺點
•在 Bean 配置檔案裡設定 autowire 屬性進行自動裝配將會裝配 Bean 的所有屬性. 然而, 若只希望裝配個別屬性時, autowire 屬性就不夠靈活了.
•autowire 屬性要麼根據型別自動裝配, 要麼根據名稱自動裝配, 不能兩者兼而有之.
•一般情況下,在實際的專案中很少使用自動裝配功能,因為和自動裝配功能所帶來的好處比起來,明確清晰的配置文件更有說服力一些