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


目录
相关文章
|
2月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
2月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
2月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
1月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
517 5
|
2月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
170 0
探索Spring Boot的@Conditional注解的上下文配置
|
3月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
958 10
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1630 0
|
XML Java 数据库连接
【Spring学习笔记 五】Spring注解及Java类配置开发
【Spring学习笔记 五】Spring注解及Java类配置开发
189 0
|
XML Java 数据格式
Spring学习笔记:02 spring配置
Spring学习笔记:02 spring配置

热门文章

最新文章