😀前言
本章是spring基于XML 配置bean系类中第5篇讲解spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
🍑spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解
🍊bean 配置信息重用(继承)
🍓应用实例
● 说明
在spring 的ioc 容器, 提供了一种继承的方式来实现bean 配置信息的重用
● 应用实例演示
- 配置beans.xml
- 配置Monster对象
- 但是这个对象的属性值和 id="monster10"对象属性一样
- parent=“monster10” 指定当前这个配置的对象的属性值从 id=monster10的对象来
<!--配置Monster对象--> <bean id="monster10" class="com.spring.bean.Monster"> <property name="monsterId" value="10"/> <property name="name" value="蜈蚣精"/> <property name="skill" value="蜇人"/> </bean> <!-- 解读 1. 配置Monster对象 2.但是这个对象的属性值和 id="monster10"对象属性一样 3.parent="monster10" 指定当前这个配置的对象的属性值从 id=monster10的对象来 --> <bean id="monster11" class="com.spring.bean.Monster" parent="monster10"/> <!-- 当我们把某个bean设置为abstract="true" 这个bean只能被继承,而不能实例化了--> <bean id="monster12" class="com.wyxedu.spring.beans.Monster" abstract="true"> <property name="monsterId" value="12"/> <property name="name" value="美女蛇"/> <property name="skill" value="吃人"/> </bean> <!-- parent="monster12" 就是继承使用了monster12 的配置信息--> <bean id="monster13" class="com.wyxedu.spring.beans.Monster" parent="monster12"/>
完成测试
在 spring 的 ioc 容器, 提供了一种继承的方式来实现 bean 配置信息的重用
//配置Bean通过继承 @Test public void getBeanByExtends() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Monster monster11 = ioc.getBean("monster11", Monster.class); System.out.println("monster11=" + monster11); Monster monster13 = ioc.getBean("monster13", Monster.class); System.out.println("monster13=" + monster13); }
🍎bean 创建顺序
🍓实例演示
● 说明
- 在spring 的ioc 容器, 默认是按照配置的顺序创建bean 对象
<bean id="student01" class="com.hspedu.bean.Student" /> <bean id="department01" class="com.hspedu.bean.Department" />
会先创建student01 这个bean 对象,然后创建department01 这个bean 对象
2. 如果这样配置
<bean id="student01" class="com.hspedu.bean.Student" depends-on="department01"/> <bean id="department01" class="com.hspedu.bean.Department" />
会先创建department01 对象,再创建student01 对象
🍀 一个问题?
● 问题说明
先看下面的配置, 请问两个bean 创建的顺序是什么? 并分析执行流程
- 先创建id=memberDAOImpl
- 再创建id = memberServiceImpl
- 调用memberServiceImpl.setMemberDAO() 完成引用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfWzFcf1-1690616200538)(…/…/…/Typora/%E5%9B%BE%E7%89%87/image-20230729153006233.png)]
先看下面的配置, 请问两个bean 创建的顺序是什么, 并分析执行流程
- 先创建id = memberServiceImpl
- 再创建id=memberDAOImpl
- 用memberServiceImpl.setMemberDAO() 完成引用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29sXXZ4W-1690616200539)(…/…/…/Typora/%E5%9B%BE%E7%89%87/image-20230729153318048.png)]
🍉bean 对象的单例和多例
● 说明
在 spring 的 ioc 容器, 在默认是按照单例创建的,即配置一个 bean 对象后,ioc 容器只会
创建一个 bean 实例。
如果,我们希望 ioc 容器配置的某个 bean 对象,是以多个实例形式创建的则可以通过配置
scope=“prototype” 来指定
🍓应用实例演示
创建car.java
public class Car { private Integer id; private String name; private Integer price; public Car(Integer id, String name, Integer price) { this.id = id; this.name = name; this.price = price; } public Car() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } @Override public String toString() { return "Car{" + "id=" + id + ", name='" + name + '\'' + ", price=" + price + '}'; } }
配置beans.xml
- 在默认情况下 scope属性是 singleton
- 在ioc容器中, 只要有一个这个bean对象
- 当程序员执行getBean时, 返回的的是同一个对象
- 如果我们希望每次getBean返回一个新的Bean对象,则可以scope=“prototype”
- 如果bean的配置是 scope=“singleton” lazy-init=“true” 这时,ioc容器就不会提前创建该对象, 而是当执行getBean方法的时候,才会创建对象
<!--配置Cat对象 1. 在默认情况下 scope属性是 singleton 2. 在ioc容器中, 只要有一个这个bean对象 3. 当程序员执行getBean时, 返回的的是同一个对象 4. 如果我们希望每次getBean返回一个新的Bean对象,则可以scope="prototype" 5. 如果bean的配置是 scope="singleton" lazy-init="true" 这时,ioc容器就不会提前创建该对象 , 而是当执行getBean方法的时候,才会创建对象 --> <bean id="cat" class="com.spring.bean.Cat" scope="prototype" lazy-init="false"> <property name="id" value="100"/> <property name="name" value="小花猫"/> </bean>
完成测试修改Spring5BeanTest.java, 增加测试方法.
@Test public void testBeanScope() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Cat cat = ioc.getBean("cat", Cat.class); Cat cat2 = ioc.getBean("cat", Cat.class); Cat cat3 = ioc.getBean("cat", Cat.class); System.out.println("cat=" + cat); System.out.println("cat2=" + cat2); System.out.println("cat3=" + cat3); }
使用细节
- 默认是单例 scope=singleton,
在启动容器时, 默认就会创建 , 并放入到 singletonObjects 集合
- 当 < bean scope=“prototype” >
设置为多实例机制后, 该 bean 是在 getBean()时才创建
- 如果是单例 scope=singleton,
同时希望在 getBean 时才创建 , 可以指定懒加载lazy init=“true” (注意默认是 false)
- 通常情况下,
lazy-init 就使用默认值 false , 在开发看来, 用空间换时间是值得的, 除非有特殊的要求.
- 如果 scope=“prototype”
这时你的 lazy-init 属性的值不管是 ture, 还是 false 都是在getBean 时候,才创建对象
😄总结
本篇详细的讲解了spring-bean配置信息重用(继承)的由来
和bean创建顺序是什么及问题思考
以及bean 对象的单例和多例讲解
spring基于XML 配置bean系类
第一篇–>怎么通过类型来获取 bean以及为什么可以通过构造器配置 bean
第二篇–> 怎么通过通过 p 名称空间配置 bean以及怎么去引用/注入其它 bean 对象–ref和怎么去引用/注入内部 bean 对象
第三篇–> spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
第四篇–>spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞