Spring框架-Bean作用域中單例模式和多例模式的區別
一、單例模式的特點(當沒有指定是單例模式還是多例模式的時候,默認是單例模式):
1、Spring容器創建的時候,對應的類的實體化物件一起被創建,
2、不管獲取多少次某個類創建的物件,該實體化物件都只會被創建一次,
二、多例模式的特點:
1、Spring容器創建的時候,對應的類的實體化物件不會被創建,只有在被獲取的時候才會被創建,
2、每次獲取的時候都會創建一個新的實體化物件,
三、下面通過一個案例來演示這兩種模式的區別
1、新建一個普通類,包含無參構造方法和有參構造方法,還有一個展示物件資訊的方法,
package com.qst.service;
public class EmpServiceImp {
private int id=1;
private String name="張倩";
private String address="浙江杭州";
public EmpServiceImp() {
System.out.println("EmpServiceImp實體化,,,");
}
public EmpServiceImp(int id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
public void showEmp() {
System.out.println(id+"--"+name+"--"+address);
}
}
2、在applicationContext.xml檔案中寫一個沒有指定單例還是多例模式的bean,可以給該bean取一個別名
<bean id="service" class="com.qst.service.EmpServiceImp"/>
<!-- 取別名 -->
<alias name="service" alias="ser"/>
3、寫一個測驗方法
package com.qst.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.qst.service.EmpServiceImp;
public class AppContextTest {
public static void main(String[] args) {
//創建Spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//組態檔的路徑
}
}
輸出了陳述句“EmpServiceImp實體化,,,”說明當沒有指定是單例模式還是多例模式的時候,默認是單例模式
4、指定單例模式:scope=“singleton”
<bean id="service" class="com.qst.service.EmpServiceImp" scope="singleton"/>
<!-- 取別名 -->
<alias name="service" alias="ser"/>
package com.qst.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.qst.service.EmpServiceImp;
public class AppContextTest {
public static void main(String[] args) {
//創建Spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//組態檔的路徑
}
}
結果說明Spring容器創建的時候,對應的類的實體化物件一起被創建,
package com.qst.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.qst.service.EmpServiceImp;
public class AppContextTest {
public static void main(String[] args) {
//創建Spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//組態檔的路徑
//獲取類創建的物件
EmpServiceImp service=(EmpServiceImp)ac.getBean("ser");
service .showEmp();
EmpServiceImp service2=(EmpServiceImp)ac.getBean("ser");
service2 .showEmp();
}
}
結果實體化了一次,show方法了兩次,說明不管獲取多少次某個類創建的物件,該實體化物件都只會被創建一次,
5、指定多例模式:scope=“prototype”
<bean id="service" class="com.qst.service.EmpServiceImp" scope="prototype"/>
<!-- 取別名 -->
<alias name="service" alias="ser"/>
package com.qst.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.qst.service.EmpServiceImp;
public class AppContextTest {
public static void main(String[] args) {
//創建Spring容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//組態檔的路徑
//獲取類創建的物件
EmpServiceImp service=(EmpServiceImp)ac.getBean("ser");
service .showEmp();
EmpServiceImp service2=(EmpServiceImp)ac.getBean("ser");
service2 .showEmp();
}
}
結果實體化了兩次,show方法了兩次,說明每次獲取的時候都會創建一個新的實體化物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/179420.html
標籤:其他
上一篇:Mybatis-Plus的使用!
