springIOC容器可以自動裝配Bean,需要做的僅僅是在<bean>中的autowire屬性里指定自動裝配的方式。
ByType:根據類型自動裝配。若IOC容器中有多個目標Bean類型一致的bean,在這種情況下,spring將無法判定那個bean最適合該屬性,所以不能執行自動裝配。
ByName:根據名稱自動裝配,必須將目標Bean的名稱和屬性名設置完全相同。
contructor:通過構造器自動裝配,當Bean中存在多個構造器時,此種自動裝配方式將會很復雜,不推薦使用,
Car.java
package com.gong.spring.beans.autowire; public class Car { public Car() { } public Car(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Car [name=" + name + "]"; } }
Address.java
package com.gong.spring.beans.autowire; public class Address { private String street; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @Override public String toString() { return "Address [street=" + street + "]"; } }
Student.java
package com.gong.spring.beans.autowire; import java.util.List; import java.util.Map; public class Student { private String name; private int age; private double score; private Car car; private Address address; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", score=" + score + ", car=" + car + ", address=" + address + "]"; } }
beans-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="car" class="com.gong.spring.beans.autowire.Car" p:name="baoma"></bean> <bean id="address" class="com.gong.spring.beans.autowire.Address" p:street="絡南街道"></bean> <bean id="address2" class="com.gong.spring.beans.autowire.Address" p:street="珞獅街道"></bean> <!-- <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom" p:age="12" p:score="99.00" p:address-ref="address" p:car-ref="car"></bean> --> <!-- 使用byName時,要裝配的bean的名字要和類文件中的setter方法中的名字保持一致,若沒有匹配的,則不裝配 <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom" p:age="12" p:score="99.00" autowire="byName"></bean> --> <!-- byType根據bean的類型和當前Bean的屬性自動裝配,若IOC容器中有一個以上的bean可以匹配,則會拋出異常 --> <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom" p:age="12" p:score="99.00" autowire="byName"></bean> </beans>
Main.java
package com.gong.spring.beans.autowire; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { //1.創建spring的IOC容器對象 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml"); //2.從容器中獲取Bean實例 Student student = (Student) ctx.getBean("student"); System.out.println(student.toString()); } }
XML配置里自動裝配的缺點:
(1)自動裝配將會裝配Bean的所有屬性,然而只需要裝配個別屬性時,自動裝配就不夠靈活;
(2)要么根據類型,要么根據名稱自動裝配,不能兩者兼顧;
(3)一般而言,在實際項目中很少使用自動裝配,因為與自動裝配功能帶來的好處相比,明確清晰的配置方式更有說服力;