欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > javascript >内容正文

javascript

Spring中Singleton作用域和Prototype作用域

发布时间:2025/3/15 javascript 29 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Spring中Singleton作用域和Prototype作用域 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录

 

 

基本概念

演示


 

基本概念

singleton作用域就是单例模式;用spring容器实现单例模式

而prototype作用域可以理解为多例模式!

 

Singleton作用域例子:

左侧的ref就是右侧bean的id,这里就是把右边的bean通过spring注入到左侧的bean中;

而Singleton是如下的情况:

而Prototype是这样的

 

 

演示

如下的文件结构:

Bean1.java

package singleandprodemo.demo;public class Bean1 {private Bean2 bean2;public Bean2 getBean2() {return bean2;}public void setBean2(Bean2 bean2) {this.bean2 = bean2;}@Overridepublic String toString() {return "Bean1{" +"bean2=" + bean2 +'}';} }

Bean2.java

package singleandprodemo.demo;public class Bean2 { }

spring.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 class="singleandprodemo.demo.Bean2" id="bean2" scope="singleton"/><bean class="singleandprodemo.demo.Bean1" id="bean1"><property name="bean2" ref="bean2"/></bean> </beans>

这里要注意bean1没有填写scope,这里没填的默认是scope为singleton

这里编写如下的运行代码:

public void contextLoads() {ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");Bean2 bean2_1 = context.getBean("bean2", Bean2.class);System.out.println("bean2_1 = " + bean2_1);Bean2 bean2_2 = context.getBean("bean2", Bean2.class);System.out.println("bean2_2 = " + bean2_2);Bean1 bean1 = context.getBean("bean1", Bean1.class);System.out.println("bean1 = " + bean1);}

运行截图如下:

从这里可以知道,单例模式在一个spring上下文环境中,被单例化;

修改如下运行代码:

public void contextLoads() {ApplicationContext context1 = new ClassPathXmlApplicationContext("spring.xml");Bean2 bean2_1 = context1.getBean("bean2", Bean2.class);System.out.println("bean2_1 = " + bean2_1);Bean2 bean2_2 = context1.getBean("bean2", Bean2.class);System.out.println("bean2_2 = " + bean2_2);Bean1 bean1 = context1.getBean("bean1", Bean1.class);System.out.println("bean1 = " + bean1);System.out.println("---------------华丽的分割线---------------");ApplicationContext context2 = new ClassPathXmlApplicationContext("spring.xml");Bean2 bean2_3 = context2.getBean("bean2", Bean2.class);System.out.println("bean2_1 = " + bean2_3);Bean2 bean2_4 = context2.getBean("bean2", Bean2.class);System.out.println("bean2_2 = " + bean2_4);Bean1 bean2 = context2.getBean("bean1", Bean1.class);System.out.println("bean1 = " + bean2);}

运行截图如下:

可见不同的spring上下文环境中实例的Bean是不一样的;

 

修改spring.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 class="singleandprodemo.demo.Bean2" id="bean2" scope="singleton"/><bean class="singleandprodemo.demo.Bean1" id="bean1" scope="prototype"><property name="bean2" ref="bean2"/></bean> </beans>

运行代码如下:

public void contextLoads() {ApplicationContext context1 = new ClassPathXmlApplicationContext("spring.xml");Bean2 bean2_1 = context1.getBean("bean2", Bean2.class);System.out.println("bean2_1 = " + bean2_1);Bean2 bean2_2 = context1.getBean("bean2", Bean2.class);System.out.println("bean2_2 = " + bean2_2);Bean1 bean1 = context1.getBean("bean1", Bean1.class);Bean1 bean11 = context1.getBean("bean1", Bean1.class);System.out.println("bean1 = " + bean1);System.out.println("bean11 = " + bean11);System.out.println(bean1 == bean11);}

运行截图如下:

从这里可以知道,但bean1为prototye的时候,实例化的bean1是不同的,(因为上面的false)

下面给出一张表:

 

这里如果有这样的一个应用场景:

Bean1是singleton,Bean2是prototype,Bean1依赖Bean2,希望每次调用Bean1的某个方法时,该方法拿到的Bean2都是一个新的实例;

这里使用到了方法注入!!!!!!!!!!!!!!

修改Bean1.java

package singleandprodemo.demo;public abstract class Bean1 {protected abstract Bean2 createBean2();public void printBean2(){System.out.println("bean2 = " + createBean2());} }

spring.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 class="singleandprodemo.demo.Bean2" id="bean2" scope="prototype"/><bean class="singleandprodemo.demo.Bean1" id="bean1" scope="prototype"><!-- <property name="bean2" ref="bean2"/> --><lookup-method name="createBean2" bean="bean2"></lookup-method></bean> </beans>

测试代码如下:

public void contextLoads() {ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");Bean1 bean1 = context.getBean("bean1", Bean1.class);bean1.printBean2();bean1.printBean2();bean1.printBean2();bean1.printBean2();}

运行截图如下:

总结

以上是生活随笔为你收集整理的Spring中Singleton作用域和Prototype作用域的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。