注:不想看具体代码的话,可以直接看每个测试的总结。
环境 Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17.0.3Spring 5.3.21 准备创建Maven项目 test0707 。
修改 pom.xml 文件,添加依赖:
创建如下POJO:
Book :Book接口;PlayBook :Book实现类;StudyBook :Book实现类;Student1 :Student1持有Book;在 src/main/resources 目录下创建 applicationContext.xml 文件:
在 src/test/java 目录下创建测试:
public class Test0707 {}
测试0创建测试用例:
运行测试,如下:
Student1 constructorPlayBook 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创建测试用例:
运行测试,如下:
Student1 constructorPlayBook constructorbefore getBean student1 playBooktruePlayBook constructorPlayBook constructorfalse
总结:
singleton的bean,只在Spring初始化时创建实例, getBean() 不会创建实例;prototype的bean,不在Spring初始化时创建实例(注入例外),每次 getBean() 都会创建实例;
测试2创建测试用例:
运行测试,如下:
Student1 constructorPlayBook constructorbefore getBean student1truetrue
总结:
把prototype的bean注入到singleton,多次调用 getBean() 获取后者时,得到的是同一实例,同理,其持有的前者,也是同一实例。
测试3多次调用 getBean() 方法获取singleton bean时,对于所注入的prototype的bean,如果希望每次都获取一个新的bean实例,可以使用 lookup-method 来配置。
例如:
完整例子如下:
创建POJO Student2 :
在 applicationContext.xml 文件中注册bean:
创建测试用例:
运行测试,如下:
......Student2 constructorbefore getBean student2truePlayBook constructorPlayBook constructorfalse
总结:
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的文章就介绍到这了,更多相关Spring 注入prototype bean内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!