😀前言
本章是spring基于XML 配置bean系类中第5篇讲解spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解
🏠个人主页:尘觉主页
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
在csdn获奖荣誉: 🏆csdn城市之星2名
💓Java全栈群星计划top前5
🤗 端午大礼包获得者
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊
文章目录
- 🍑spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解
- 🍊bean 配置信息重用(继承)
- 🍓应用实例
- 完成测试
- 🍎bean 创建顺序
- 🍓实例演示
- 🍀 一个问题?
- ● 问题说明
- 🍉bean 对象的单例和多例
- ● 说明
- 🍓应用实例演示
- 创建car.java
- 配置beans.xml
- 使用细节
- 😄总结
🍑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 获取对象
😁热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞