問題描述
如果一個Bean需要注入很多屬性,每個屬性都要顯示注入,就會顯得很麻煩。 解決方案
讓Ioc容器自動為Bean指定引用。 方法之一---在XML設定檔實現自動裝配
Car.java
package com.zzj.bean;public class Car {public void start(){System.out.println("starting car...");}}
User.java
package com.zzj.bean;public class User {private Car car;public void setCar(Car car) {this.car = car;}public void startCar(){car.start();}}設定檔
<?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.xsd"> <bean id="car" class="com.zzj.bean.Car"></bean> <bean id="user" class="com.zzj.bean.User" autowire="byName"></bean></beans>
測試
public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");User user = (User) context.getBean("user");user.startCar();}
註:要讓spring容器自動裝配Bean,需要提供一個參考,這個參考就是bean的autowire屬性。
自動裝配有3中方式:
1.根據名稱自動裝配(byName)。因為spring 容器中Bean的名稱是唯一的,所以不會產生歧義,推薦使用這種方式。
2.根據類型自動裝配(byType)。在Spring容器中可能會找到多個跟需要注入的bean的類型相同的Bean,所以會產生歧義,Spring容器不知道注入哪個Bean,這時會拋出異常。
3.根據構造器自動裝配(constructor)。這種方式比較複雜,不做分析。 方法之二---使用註解實現自動裝配
修改User.java檔案和XML設定檔就行了。
User.java
package com.zzj.bean;import org.springframework.beans.factory.annotation.Autowired;public class User {@Autowiredprivate Car car;public void startCar(){car.start();}}註:此時setter方法可以省掉。
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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="car" class="com.zzj.bean.Car"></bean> <bean id="user" class="com.zzj.bean.User"></bean> <context:annotation-config/></beans>
要使用Spring Ioc的註解注入功能,需要引入新的命名空間。
註:@Autowired是spring內建的註解,也可以使用Java原生的註解:@Resource。推薦使用@Resource,更具移植性。