1 Bean之间的关系
1.1 继承 Bean 配置
Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean
- 子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置
- 子 Bean 也可以覆盖从父 Bean 继承过来的配置
- 父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean
- 并不是 元素里的所有属性都会被继承. 比如: autowire, abstract 等.
- 也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true
1.2
有时候我们的代码相似,但是要重复写 ,显得很麻烦
除了id和stree的值不同,其余是一样的。
解决办法: 1.3、继承
我们把相同的部分去掉,然后写上parent
输出一下结果显示:(可行)
1.4、抽象Bean
有时候我们希望,我们创建的bean不想是实例,我们可以把它弄成一个模板。
解决办法:抽象类(只能被继承,不能被实例)
(1)输出抽象bean address
结果显示(报错):
(2)不输出抽象bean address
结果显示:(单独输出Address2)
总结: 抽象Bean的abstract属性为true的bean. 这样的bean不能被IOC容器实例化
1.5 依赖 Bean 配置
- Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
- 如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称
1.6 依赖关系
我们获取一个Person的Bean 获取结果
输出Person:(结果正常)
但是如果我们的项目要求,我们配置一个Person的时候 必须要有一个car呢?(指创建Person的时候,如果没有Car 就不能实例化)
换句话说person这个bean依赖于Car这个Bean
(1)没写Car
输出Person:
(2)写上Car
输出结果:
2 Bean的作用域
我们先来测试一下Bean的作用域
结果显示:
证明两者是同一个对象。
2.1 加上 scope=“prototype”
结果显示:
证明两者不是同一个对象;
2.2 加上scope=“singleton”
我们在Car类里面加一个无参构造器:
Main里面:
结果显示:()
总结:在我创建容器的时候,这个Bean已经被初始化好了,每次只要从容器里面获取这个Bean的话,会返回已经创建好的那个Bean
在Main里面的注释解除掉:
结果显示:
如果又改成prototype:
Main里面都注释掉 只创建容器:
结果显示:
在我创建容器的时候,这个Bean没有创建
我们把Main里面的注释接触掉:
结果显示:
总结:
使用bean的scope属性来配置bean的作用域
singleton:默认值,容器初始时创建bean实例,在整个容器的生命周期内只创建者一个bean. 单例的
prototype:原型的,容器初始化时不创建bean的实例,而在每次请求时都创建一个新的Bean实例,并返回