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 实例化之前创建好

扫描二维码关注公众号,回复: 4557217 查看本文章

如果前置依赖于多个 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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41577923/article/details/85050155