zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码
    windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况
    javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
    ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
    HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码
    Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制
    linq查询语句转mongodb
    winddows rabbitmq安装与配置
    Redis For Windows安装及密码
    出现,视图必须派生自 WebViewPage 或 WebViewPage错误解决方法
  • 原文地址:https://www.cnblogs.com/yefengyu/p/5118204.html
Copyright © 2011-2022 走看看