spring有单例模式和多例模式,首先单例模式是什么呢?
单例模式:不管获取对象几次,每次getBean都是同一个实例。
单例模式又分为懒汉模式和饿汉模式。
饿汉模式:在加载对象时候,对象就会创建实例,为所有spring配置文件中定义的bean都是生成的一个实例,天生线程安全的,多线程的情况下也不会出现问题。
懒汉模式:在获取对象第一次请求的时候,才会创建实例。本身是线程不安全的,但有几种实现线程安全的写法。
这篇文章主要介绍spring单例模式和多例模式实例,话不多说,直接上代码:
1、spring单例模式
-
public static void main(String[] args) {
-
log.info(
"加载xml START.....");
-
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(
"application.xml");
-
log.info(
"加载xml END.....");
-
HelloWord helloWord1 = (HelloWord)applicationContext.getBean(
"helloWord");
-
HelloWord helloWord2 = (HelloWord)applicationContext.getBean(
"helloWord");
-
log.info(
"两次取的对象是否一致:{}",helloWord1 == helloWord2);
-
-
}
application.xml文件如下,重点,default-lazy-init="true"参数有的时候,代表是懒汉模式,吧此参数去掉,是spring饿汉模式 :
-
<?xml version="1.0" encoding="UTF-8"?>
-
<beans default-lazy-init="true" 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="com.first.bean.HelloWord" id="helloWord" scope="singleton" />
-
</beans>
(1)饿汉模式控制台打印如下,可以看到,饿汉模式情况下,在加载bean的时候,就会create实例,并且是同一个实例,返回true。(xml文件加去掉参数default-lazy-init="true")
(2)懒汉模式控制台打印如下,可以看到,懒汉模式情况下,是在获取对象的时候create实例。(xml文件加参数default-lazy-init="true")
2、spring多例模式
有单例模式就有多例,多例模式是什么呢?
多例模式:每次获取对象getBean都会创建一个新的实例,不会在容器初始化的时候创建,所以不会在加载bean的时候创建,所以多例模式只有懒汉模式,没有饿汉模式。多例模式配置文件改为scope=“prototype”
话不多说,代码如下:
-
<?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="com.first.bean.HelloWord" id="helloWord" scope="prototype" />
-
</beans>
控制台打印如下,可以看到是false,所以每次getBean的对象都是新的对象,还可以看到,并没有创建bean容器,因为多例的模式下,bean对象不归IOC容器管理。
单例,多例模式就说到这里,下篇文章着重详解懒汉模式,饿汉模式。
最后,看到这里的读者,如果喜欢的话安排一波(点赞,收藏,关注),原创不易,每周定期分享小知识。
转载:https://blog.csdn.net/ke1ying/article/details/117530907