天天看點

Spring bean的自動裝配

配置bean

配置形式:基于xml檔案的方式:基于注解的方式

bean的配置方式:通過全類名(反射),通過工廠方法(靜态工廠方法和執行個體工廠方法),FactoryBean

Car類

package com.beans.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 + "]";
    }
        
}      

Address類

package com.beans.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 + "]";
    }
        
}      

Person類

package com.beans.autowire;

import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;

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 + "]";
    }   
}      

這是配置檔案

<?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:util="http://www.springframework.org/schema/util"
  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
   http://www.springframework.org/schema/util
     http://www.springframework.org/schema/util/spring-util.xsd
  "
  >
  <bean id="address" class="com.beans.autowire.Address"
  p:city="BeiJing" p:street="huiLongGuan"></bean>
  
  <bean id="car" class="com.beans.autowire.Car"
  p:brand="Audi" p:price="200000"></bean>
  
  <bean id="person" class="com.beans.autowire.Person"
  p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
</beans>      

下面改動為自動裝配bean,byName和byType都是可以的。但是要注意的地方是比如Address這個類實作的bean有兩個及以上時,就會出現問題,byType會不知道找到那個bean自動裝配。

<bean id="address" class="com.beans.autowire.Address"
  p:city="BeiJing" p:street="huiLongGuan"></bean>
  <bean id="address2" class="com.beans.autowire.Address"
  p:city="ChangSha" p:street="wo"></bean>      

像上面這樣,byType就會出現問題。IOC容器中有多個與目标bean類型一緻的bean,spring無法判定那個bean最适合這個屬性

而byName必須将bean的名稱和屬性名設定的完全相同

<!-- 可以使用autowire屬性指定自動裝配的方式 
  byName根據bean的名字和目前bean的setter風格的屬性名進行自動裝配 
  若有比對的,則進行自動裝配,若沒有比對的,則不裝配
  byType 根據bean的類型和目前bean的屬性的類型進行自動裝配
  若IOC容器中有一個以上的類型比對的bean,則抛異常
  -->
  <bean id="person" class="com.beans.autowire.Person"
  p:name="Tom" autowire="byType"></bean>