基於Spring depends-on的使用詳解

Spring depends-on的使用

通過在XML中的<bean>裡配置depends-on屬性或者在一個類上使用註解@DependsOn,可以使一個Bean的產生依賴於其他幾個Bean。

請看如下代碼:

<?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="son" class="com.tyyd.lifecallbacks.domain.Son" depends-on="mother"></bean>
    <bean id="mother" class="com.tyyd.lifecallbacks.domain.Mother"></bean>
</beans>

son這個Bean的產生依賴於mother這個Bean。

Spring Depends-On 不起作用

beans-realation.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"
    xmlns:util="http://www.springframework.org/schema/util"
    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-4.0.xsd">
<!--     abstract="true" 則不能獲得這個bean 說明它隻是一個模板,隻能被繼承 -->
    <bean id = "address" class="com.yuxishua.autowire.Address" p:city="Beijing" p:street="ChangAnLu" abstract="true">
        
    </bean>
<!--     繼承bean的配置使用parent 屬性,但是沒有java 繼承的意思 -->
    <bean id = "address2" parent="address" p:street="HanSenLU">
        
    </bean>
<!--     要求person bean 必須有一個關聯的car ,意思就是說這個bean依賴car這個bean -->
    <bean id = "person"  depends-on="car" class="com.yuxishua.autowire.Person" p:name="Tom" p:address-ref="address2" >
        
    </bean>
    <bean id = "car" class="com.yuxishua.autowire.Car" p:brand="AuDi" p:price="30000">
        
    </bean>
</beans>
package com.yuxishua.beansrelation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yuxishua.autowire.Address;
import com.yuxishua.autowire.Car;
import com.yuxishua.autowire.Person;
public class Main
{
    public static void main(String[] args)
    {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-realation.xml");
        Person person = (Person) ctx.getBean("person");
        Address address2 = (Address) ctx.getBean("address2");
        Car car = (Car) ctx.getBean("car");
        System.out.println(address2 );
        System.out.println(person);
        System.out.println(car);
        
    }
}
package com.yuxishua.autowire;
public class Person
{
    private String name;
    private Address address;
    private Car car;
    @Override
    public String toString()
    {
        return "Person [name=" + name + ", address=" + address + ", 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;
    }
}
package com.yuxishua.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 + "]";
    }
}
package com.yuxishua.autowire;
public class Address
{
    private String city;
    private String street;
    @Override
    public String toString()
    {
        return "Address [city=" + city + ", street=" + 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;
    }
}

就上面的代碼,結果輸出

Person [name=Tom, address=Address [city=Beijing, street=HanSenLU], car=null]

car 為什麼沒有註入呢,是spring版本的問題嗎?還是什麼原因?

spring為4.0.8

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: