1. 程式人生 > >Spring 學習(六)——Bean 之間的關係

Spring 學習(六)——Bean 之間的關係

bean 之間的關係:繼承;依賴

繼承 Bean 配置

Spring 允許繼承 bean 的配置, 被繼承的 bean 稱為父 bean. 繼承這個父 Bean Bean 稱為子 Bean

Bean 從父 Bean 中繼承配置, 包括 Bean 屬性配置

Bean 也可以覆蓋從父 Bean 繼承過來的配置

Bean 可以作為配置模板, 也可以作為 Bean 例項. 若只想把父 Bean 作為模板, 可以設定 <bean> abstract 屬性為 true, 這樣 Spring 將不會例項化這個 Bean

並不是 <bean>

元素裡的所有屬性都會被繼承. 比如: autowire, abstract .

可以忽略父 Bean class 屬性, 讓子 Bean 指定自己的類, 而共享相同的屬性配置. 但此時 abstract 必須設為 true

 

依賴 Bean 配置

Spring 允許使用者通過 depends-on 屬性設定 Bean 前置依賴的Bean,前置依賴的 Bean 會在本 Bean 例項化之前建立好

如果前置依賴於多個 Bean,則可以通過逗號,空格或的方式配置 Bean 的名稱

 

程式碼示例如下:

1、程式碼結構:

2、

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 +
                '}';
    }
}

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 +
                '}';
    }
}

3、bean-relation.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 : bean 的 abstract 屬性為 true ,這樣的 bean 不能被 IOC 容器例項化,只能被繼承
        若某一個 bean 的 class 屬性沒有指定,則該 bean 必須是一個抽象 bean
    -->
    <bean id="address" p:city="北京^" p:street="五道口" abstract="true"/>

    <!--bean 配置的繼承 : 使用 bean 的 parent 屬性指定繼承哪個 bean 的配置-->
    <bean id="address2" class="com.hzyc.spring.bean.autowire.Address"
          parent="address"/>

    <bean id="address3" class="com.hzyc.spring.bean.autowire.Address"
          parent="address2" p:street="中關村"/>

    <bean id="car" class="com.hzyc.spring.bean.autowire.Car"
          p:brand="奧迪" p:price="300000"/>

    <!--要求在配置 Person 時,必須有一個關聯的 car ,換句話說,這個 bean 依賴於 car 這個 bean-->
    <bean id="person" class="com.hzyc.spring.bean.autowire.Person"
          p:name="薛恆傑" p:address-ref="address2" depends-on="car"/>
</beans>

4、Main.java

package com.hzyc.spring.bean.relation;

import com.hzyc.spring.bean.autowire.Address;
import com.hzyc.spring.bean.autowire.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author xuehj2016
 * @Title: Main
 * @ProjectName spring01
 * @Description: TODO
 * @date 2018/12/1618:01
 */
public class Main {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean-relation.xml");

        Address address = (Address) applicationContext.getBean("address2");
        System.out.println(address);

        address = (Address) applicationContext.getBean("address3");
        System.out.println(address);

        Person person = (Person) applicationContext.getBean("person");
        System.out.println(person);
    }
}