spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解

简介: spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解

😀前言

本章是spring基于XML 配置bean系类中第5篇讲解spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉



🍑spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解

🍊bean 配置信息重用(继承)

🍓应用实例

● 说明

在spring 的ioc 容器, 提供了一种继承的方式来实现bean 配置信息的重用

● 应用实例演示

  1. 配置beans.xml
  1. 配置Monster对象
  2. 但是这个对象的属性值和 id="monster10"对象属性一样
  3. 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 创建顺序

🍓实例演示

● 说明

  1. 在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 创建的顺序是什么? 并分析执行流程

  1. 先创建id=memberDAOImpl
  2. 再创建id = memberServiceImpl
  3. 调用memberServiceImpl.setMemberDAO() 完成引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfWzFcf1-1690616200538)(…/…/…/Typora/%E5%9B%BE%E7%89%87/image-20230729153006233.png)]

先看下面的配置, 请问两个bean 创建的顺序是什么, 并分析执行流程

  1. 先创建id = memberServiceImpl
  2. 再创建id=memberDAOImpl
  3. 用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
  1. 在默认情况下 scope属性是 singleton
  2. 在ioc容器中, 只要有一个这个bean对象
  3. 当程序员执行getBean时, 返回的的是同一个对象
  4. 如果我们希望每次getBean返回一个新的Bean对象,则可以scope=“prototype”
  5. 如果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);
    }

使用细节

  1. 默认是单例 scope=singleton,

在启动容器时, 默认就会创建 , 并放入到 singletonObjects 集合

  1. 当 < bean scope=“prototype” >

设置为多实例机制后, 该 bean 是在 getBean()时才创建

  1. 如果是单例 scope=singleton,

同时希望在 getBean 时才创建 , 可以指定懒加载lazy init=“true” (注意默认是 false)

  1. 通常情况下,

lazy-init 就使用默认值 false , 在开发看来, 用空间换时间是值得的, 除非有特殊的要求.

  1. 如果 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连支持一下,创造不易您们的支持是我的动力🤞


目录
相关文章
|
26天前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
255 1
|
6天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
23 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
36 0
|
24天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
16天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
27 1
|
1月前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
124 1
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
46 0
|
5月前
|
Java 开发者 Spring
解析Spring中Bean的生命周期
解析Spring中Bean的生命周期
55 2
|
1月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
77 1