iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Spring怎么为singleton bean注入prototype bean
  • 522
分享到

Spring怎么为singleton bean注入prototype bean

2023-07-02 16:07:05 522人浏览 八月长安
摘要

本篇内容介绍了“spring怎么为singleton bean注入prototype bean”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细

本篇内容介绍了“spring怎么为singleton bean注入prototype bean”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

环境

准备

创建Maven项目 test0707

修改 pom.xml 文件,添加依赖:

        ......        <!-- https://mvnrepository.com/artifact/junit/junit -->        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.13.2</version>            <scope>test</scope>        </dependency>        <!-- Https://mvnrepository.com/artifact/org.springframework/spring-WEBmvc -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>5.3.21</version>        </dependency>        ......

创建如下POJO:

  • Book :Book接口;

  • PlayBook :Book实现类;

  • StudyBook :Book实现类;

  • Student1 :Student1持有Book;

package pojo;public interface Book {    public void show();}
package pojo;public class PlayBook implements Book{    public PlayBook() {        System.out.println("PlayBook constructor");    }    @Override    public void show() {        System.out.println("Play book!");    }}
package pojo;public class StudyBook implements Book{    public StudyBook() {        System.out.println("StudyBook constructor");    }    @Override    public void show() {        System.out.println("Study book!");    }}
package pojo;public class Student1 {    private String name;    private Book book;    public void setName(String name) {        this.name = name;    }    public void setBook(Book book) {        this.book = book;    }    public Book getBook() {        return book;    }    public Student1() {        System.out.println("Student1 constructor");    }    public void readBook() {        System.out.println("I am " + name);        book.show();    }}

src/main/resources 目录下创建 applicationContext.xml 文件:

<?xml version="1.0" encoding="utf-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean id="playBook" class="pojo.PlayBook" scope="prototype"/>    <bean id="studyBook" class="pojo.StudyBook" scope="prototype"/>    <bean id="student1" class="pojo.Student1">        <property name="name" value="Jerry"/>        <property name="book" ref="playBook"/>    </bean></beans>

src/test/java 目录下创建测试:

public class Test0707 {}

测试0

创建测试用例:

    @Test    public void test0() {        var ctx = new ClassPathXmlApplicationContext("applicationContext.xml");    }

运行测试,如下:

Student1 constructor
PlayBook constructor

总结:

  • singleton的bean会在Spring初始化时创建实例(如本例中的 student1

  • ;prototype的bean不会在Spring初始化时创建实例(如本例中的 studyBook );若把A注入B(B是singleton),

  • 则A在Spring初始化时随着B一起创建实例(如本例中的 playBook )。

  • 接上条,若把A注入B(B是singleton),如果A是singleton,则A在B之前创建实例。如果A是prototype,则A在B之后创建实例;

测试1

创建测试用例:

    @Test    public void test1() {        var ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        System.out.println("before getBean student1 playBook");        var student1 = ctx.getBean("student1", Student1.class);        var student2 = ctx.getBean("student1", Student1.class);        System.out.println(student1 == student2);        var book1 = ctx.getBean("playBook", PlayBook.class);        var book2 = ctx.getBean("playBook", PlayBook.class);        System.out.println(book1 == book2);    }

运行测试,如下:

Student1 constructor
PlayBook constructor
before getBean student1 playBook
true
PlayBook constructor
PlayBook constructor
false

总结:

singleton的bean,只在Spring初始化时创建实例, getBean() 不会创建实例;prototype的bean,不在Spring初始化时创建实例(注入例外),每次 getBean() 都会创建实例;

测试2

创建测试用例:

    @Test    public void test2() {        var ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        System.out.println("before getBean student1");        var student1 = ctx.getBean("student1", Student1.class);        var student2 = ctx.getBean("student1", Student1.class);        System.out.println(student1 == student2);        System.out.println(student1.getBook() == student2.getBook());    }

运行测试,如下:

Student1 constructor
PlayBook constructor
before getBean student1
true
true

总结:

把prototype的bean注入到singleton,多次调用 getBean() 获取后者时,得到的是同一实例,同理,其持有的前者,也是同一实例。

测试3

多次调用 getBean() 方法获取singleton bean时,对于所注入的prototype的bean,如果希望每次都获取一个新的bean实例,可以使用 lookup-method 来配置。

例如:

        <lookup-method name="getBook" bean="playBook"/>

完整例子如下:

创建POJO Student2

package pojo;public abstract class Student2 {    private String name;//    private Book book;    public void setName(String name) {        this.name = name;    }//    public void setBook(Book book) {//        this.book = book;//    }////    public Book getBook() {//        return book;//    }    public abstract Book getBook();    public Student2() {        System.out.println("Student2 constructor");    }    public void readBook() {        System.out.println("I am " + name);//        book.show();        getBook().show();    }}

applicationContext.xml 文件中注册bean:

    <bean id="student2" class="pojo.Student2">        <property name="name" value="Jerry"/><!--        <property name="book" ref="playBook"/>-->        <lookup-method name="getBook" bean="playBook"/>    </bean>

创建测试用例:

    @Test    public void test3() {        var ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        System.out.println("before getBean student2");        var student1 = ctx.getBean("student2", Student2.class);        var student2 = ctx.getBean("student2", Student2.class);        System.out.println(student1 == student2);        System.out.println(student1.getBook() == student2.getBook());    }

运行测试,如下:

......
Student2 constructor
before getBean student2
true
PlayBook constructor
PlayBook constructor
false

总结:

  • Student2 是抽象类, getBook() 是抽象方法;

  • Student2 并不持有Book,只需使用 getBook() 方法来得到Book;

  • 在Spring配置中使用 lookup-method 来指定方法名字( name 属性)和所获取的bean( bean 属性);getBook() 是Spring实现的,相当于调用了

  • getBean() 方法来得到实例,所以每次都能获取一个新的实例(当然前提是bean必须是prototype的);

  • singleton bean在Spring初始化时创建实例,lookup的bean不会随着一起创建实例,只有在显式调用lookup方法时才会 getBean() (类似懒加载);

“Spring怎么为singleton bean注入prototype bean”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Spring怎么为singleton bean注入prototype bean

本文链接: https://www.lsjlt.com/news/343012.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring为singleton bean注入prototype bean
    目录环境准备测试0测试1测试2测试3注:不想看具体代码的话,可以直接看每个测试的总结。 环境 Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17.0.3...
    99+
    2022-11-13
  • Spring怎么为singleton bean注入prototype bean
    本篇内容介绍了“Spring怎么为singleton bean注入prototype bean”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细...
    99+
    2023-07-02
  • Spring 注入Bean时为null
    Spring.xml <util:properties id="db" location="classpath:jdbc.properties"/&g...
    99+
    2022-10-18
  • Spring bean为什么需要依赖注入
    目录具体步骤:样例1:样例2:Spring单例模式和原型模式一、单例模式二、原型模式思考 为什么需要依赖注入总结具体步骤: 1.创建一个maven项目 spring-day1-con...
    99+
    2022-11-12
  • spring怎么自定义bean注入
    在Spring中,我们可以使用两种方式来自定义Bean的注入: 使用注解方式:通过在Bean定义类上添加注解来告诉Spring容...
    99+
    2023-10-26
    spring
  • spring中怎么向一个单例bean中注入非单例bean
    这篇文章主要介绍“spring中怎么向一个单例bean中注入非单例bean”,在日常操作中,相信很多人在spring中怎么向一个单例bean中注入非单例bean问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”s...
    99+
    2023-06-20
  • Spring怎么控制Bean注入的顺序
    今天小编给大家分享一下Spring怎么控制Bean注入的顺序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。简介说明首先需要说...
    99+
    2023-07-02
  • spring注解怎么为bean指定InitMethod和DestroyMethod
    这篇文章主要为大家展示了“spring注解怎么为bean指定InitMethod和DestroyMethod”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“spring注解怎么为bean指定Ini...
    99+
    2023-06-25
  • 利用Spring 怎么将bean注入多线程
    本篇文章给大家分享的是有关利用Spring 怎么将bean注入多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。问题Spring中多线程注入userThreadService...
    99+
    2023-05-31
    spring 多线程 bean
  • 怎么动态注册Bean到Spring
    这篇文章主要介绍了怎么动态注册Bean到Spring的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么动态注册Bean到Spring文章都会有所收获,下面我们一起来看看吧。1、理论一般如果想将类注册到sprin...
    99+
    2023-06-29
  • Spring的@Bean注解怎么使用
    今天小编给大家分享一下Spring的@Bean注解怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Spring @Be...
    99+
    2023-07-02
  • mybatis拦截器无法注入spring bean怎么解决
    这篇文章主要介绍“mybatis拦截器无法注入spring bean怎么解决”,在日常操作中,相信很多人在mybatis拦截器无法注入spring bean怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-29
  • Spring中bean集合注入的方法是什么
    这篇文章主要讲解了“Spring中bean集合注入的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中bean集合注入的方法是什么”吧!Spring作为项目中不可缺少的底...
    99+
    2023-07-02
  • Spring bean需要依赖注入的原因是什么
    这篇文章主要介绍“Spring bean需要依赖注入的原因是什么”,在日常操作中,相信很多人在Spring bean需要依赖注入的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring bean...
    99+
    2023-06-20
  • springboot怎么排除某些bean的注入
    在Spring Boot中,你可以使用`@Conditional`注解来排除某些bean的注入。以下是一种常见的方法:1. 创建一个...
    99+
    2023-09-27
    springboot bean
  • spring bean的自动注入及循环依赖问题怎么解决
    这篇文章主要介绍了spring bean的自动注入及循环依赖问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇spring bean的自动注入及循环依赖问题怎么解决文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • Spring单元测试控制Bean注入的方法是什么
    本篇内容介绍了“Spring单元测试控制Bean注入的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过xml文件进行注入在配置文...
    99+
    2023-07-05
  • 怎么深入了解Spring的Bean生命周期
    本篇文章为大家展示了怎么深入了解Spring的Bean生命周期,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是 Spring Bean 的生命周期对于普通的 Java 对象,当 new 的时候创...
    99+
    2023-06-26
  • java中dubbo注入找不到bean怎么解决
    在Java中使用Dubbo注入找不到Bean的问题可能是由以下几个原因引起的: 未正确配置Dubbo的扫描路径。在Dubbo的配...
    99+
    2023-10-26
    java
  • springboot启动怎么排除某些bean的注入
    本篇内容主要讲解“springboot启动怎么排除某些bean的注入”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot启动怎么排除某些bean的注入”吧!springboot 启...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作