• 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

  • 相关阅读:
    RocketMQ源码分析:(二)消息发送的三种方式
    LTS本地搭建详述
    Mac端解决(含修改8.0.13版的密码):Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
    flink入门:01 构建简单运行程序
    rocketmq控制台搭建(rocketmq-console)
    在consul上注册web服务
    将filenames里的每个字符串输出到out文件对象中注意行首的缩进
    spidermark sensepostdata ntp_monlist.py
    HTTP Error 403没有了,但是中文全都是乱码。又是怎么回事?
    original.txt和提交的页面输出的文字的混合文件
  • 原文地址:https://www.cnblogs.com/yefengyu/p/5118204.html
Copyright © 2020-2023  润新知