Spring学习笔记 6. 尚硅谷_佟刚_Spring_Bean 之间的关系

1,继承关系

首先从简单的代码来看,有一个Address类,配置文件有两个bean

(1)Address类

package com.zsq;

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

(2)配置文件

<?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 id="address1" class="com.zsq.Address" 
        p:city="贵阳" p:street="喷水池"></bean>
        
    <bean id="address2" class="com.zsq.Address" 
        p:city="贵阳" p:street="文昌北路"></bean>        
</beans>

(3)Main方法

package com.zsq;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml");
        Address address = (Address) ctx.getBean("address1");
        System.out.println(address);
        
        address = (Address) ctx.getBean("address2");
        System.out.println(address);
    }

}

运行结果

image

现在来看一下配置文件

image

发现对于同一个类型的bean,其中好多地方是相同的,那么就可以使用继承。怎么实现呢?

假设address1我们不修改,使用address2继承address1

(1)我们需要把address2中和address1中相同的去掉:

image

(2)在address2中声明继承address1,其实就是添加一个属性

image

修改之后:

image

此时的结果正常:

image

•Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean

•子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置

下面再看一个:

•子 Bean 也可以覆盖从父 Bean 继承过来的配置

image

其实在一个bean中有了parent="address1" 那么除了bean的ID,其他的都是继承父bean的,如果在子bean中添加部分属性,那么就是覆盖了父bean的配置,上面的street就是覆盖了从父bean继承过来的配置。

image

有的时候不希望某个bean可以实例化,我们把它配置成模版,其他bean从它继承,比如上面的address1,那么怎么设置呢?

image

只要在想配置的模板bean里面加入abstract="true",那么这个bean就不可以被实例化,但是其他bean可以继承。

如果代码不修改会出错:

image

image

•父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean

•并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等.

•也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true。这句的意思就是如果某个bean没有class,一定要有abstract="true"。

2,依赖关系

•Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好

•如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称

这个说的是什么意思呢?举个以前的例子吧,一个人,有名字(String),有地址(Address类型),有车(Car类型),现在实例化的时候如果这个人必须有个车的时候,我们可以使用depends-on 属性设定 Person Bean 前置依赖的Car Bean。

image

主方法中加入:

image

结果:

image

上面的配置使用了p:car-ref="car"

但是从配置文件本身表达不出实例化的人必须要有车的这个意图。但是如果像下面的配置,那么就会知道实例化的人必须要有车。

image

结果却是:

image

p:car-ref="car"depends-on="car"的区别比较大。

p:car-ref="car" 说明我不仅想在实例化一个bean的时候先初始化 car 这个bean,而且此bean还是我的一部分

image

depends-on="car" 仅说明我在实例化一个bean的时候只是想先初始化 car 这个bean,但是我并不是想要这个car bean成为我的一部分。

image

原文地址:https://www.cnblogs.com/yefengyu/p/5118204.html