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);
} }

运行结果

现在来看一下配置文件

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

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

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

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

修改之后:

此时的结果正常:

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

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

下面再看一个:

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

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

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

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

如果代码不修改会出错:

•父 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。

主方法中加入:

结果:

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

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

结果却是:

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

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

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

Spring学习笔记 6. 尚硅谷_佟刚_Spring_Bean 之间的关系的更多相关文章

  1. Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域

    1,理论 •在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. •默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创 ...

  2. Spring学习笔记 1. 尚硅谷_佟刚_Spring_HelloWorld

    1,准备工作 (1)安装spring插件 搜索https://spring.io/tools/sts/all就可以下载最新的版本 下载之后不用解压,使用Eclipse进行安装.在菜单栏最右面的Help ...

  3. Spring 学习笔记 8. 尚硅谷_佟刚_Spring_使用外部属性文件

    1,配置数据源 (1)添加驱动 (2)编写spring配置文件 <bean id="dataSource" class="org.springframework.j ...

  4. Spring学习笔记 5. 尚硅谷_佟刚_Spring_自动装配

    1,回顾以前的做法 一个人有姓名,有住址,有一辆车.其中住址和车也是一个类,这种情况下不用自动装配是十分容易实现的 (1)Person类 package com.zsq; public class P ...

  5. Spring 学习笔记 4. 尚硅谷_佟刚_Spring_属性配置细节

    1,字面值 •字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入. •基本数据类型及其封装类.String 等类型都可以采取字面值注入的方式 •若字 ...

  6. Spring 学习笔记 3. 尚硅谷_佟刚_Spring_配置 Bean

    1,bean 的配置 <bean id="helloWorld" class="com.yfy.HelloWorld"> <property ...

  7. Spring 学习笔记 2. 尚硅谷_佟刚_Spring_IOC&DI概述

    1,远古时代 这里讲述的IOC的演变历史,举一个例子,假如需要生成HTML和PDF格式的报表,以前的开发方式就是有个报表服务类需要使用报表生成器 它需要和其他三个都关联,它既需要知道接口类型,也需要知 ...

  8. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  9. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

随机推荐

  1. IOS系列swift语言之课时三

    今天需要掌握的内容就是:闭包.类.结构体.属性(计算属性和延迟属性) 同样里面有一些题目,有兴趣的可以做一下. 首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量 ...

  2. java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind

    1. 启动注册表编辑器. HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters 2. 新建 值名称:MaxUser ...

  3. [原创.数据可视化系列之五]韩国"萨德"系统防御图

    自从7月8日美国和韩国共同宣布将在韩国部署萨德反导系统后,韩国国内对此事的巨大争议以及本地区一些国家的强烈不满情绪在持续发酵.“萨德”(THAAD)全称“末段高空区域防御系统”,是美国导弹防御局和美国 ...

  4. PPTP-VPN第三章——用户流量与并发数限制

    在前面两篇文章中详细介绍了pptp vpn的安装与使用,以及如何配置用户认证存入mysql数据库.本文将在前面两篇文章的基础上介绍如何对用户的流量做限制,同时限制相同账号的用户,同一时刻的在线数为1. ...

  5. webservice 接口通过 HTTP 获取数据

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Ne ...

  6. JQM---列车时刻查询

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  7. MVC后台数据赋值给前端JS对象

    Controller中的数据,不管是使用的是ViewModel 还是ViewBag.Data,要将他传递到View中,这个很容易,但是如果要将它传递给JS中的某个对象,这个改如何处理呢? 后台的数据格 ...

  8. Splinter学习--初探1,模拟百度搜索

    Splinter是以Selenium, PhantomJS 和 zope.testbrowser为基础构建的web自动化测试工具,基本原理同selenium 支持的浏览器包括:Chrome, Fire ...

  9. pil

    http://effbot.org/imagingbook/ 一.安装 pip install PIL --allow-external PIL --allow-unverified PIL   出现 ...

  10. 1、Linux驱动重要的数据结构

    1.struct file 这个结构体定义在  linuxsource/include/linux/fs.h 中第960行左右 具体成员如下: struct file { /* * fu_list b ...