控制Spring工厂创建对象的次数
1、如何控制简单对象的创建次数
1. <bean id="user" scope="singleton | prototype" class="cf.duanzifan.entity.User"/>
singleton:只会创建一次简单对象【默认值】
prototype:每一次都会创建新的对象
2、如何控制复杂对象的创建次数
FactoryBean{
isSingleton(){
return true;//只会创建一次
return false;//每次都会创建
}
}
//如果没有 isSingleton 方法,还是通过 scope 属性 来进行对象创建次数的控制
3、为什么要控制对象的创建次数
1. 好处:可以节省内存,防止不必要的内存浪费
-
什么样的对象只创建一次?
1. SqlSessionFactory 2. DAO 3. Service
-
什么样的对象每次都要创建新的(存在线程安全)
1. Connection 2. SqlSession
对象的生命周期
-
什么是对象的生命周期
1. 指的是一个对象创建、存活、消亡的一个完整过程
-
为什么要学习对象的生命周期
1. 由 Spring 负责对象的创建、存活、销毁,了解生命周期,有利于我们使用好 Spring 为我们创建的对象
生命周期的3个阶段
创建阶段
Spring工厂何时创建对象
-
scope=“singleton”
//Spring 工厂创建的同时进行对象的创建 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml");
在 scope=“singleton” 这种情况下我们也可以在 getBean(); 的时候再创建对象
<bean id="user" scope="singleton" class="cf.duanzifan.entity.User" lazy-init="true">
-
scope=“prototype”
//Spring 工厂会在获取对象的同时,创建对象 Person person = (Person) applicationContext.getBean("person");
初始化阶段
Spring 工厂在创建完对象后,调用对象的初始化方法,完成对应的初始化操作
1. 初始化方法提供:程序员根据需求,提供初始化方法,最终完成初始化操作
2. 初始化方法调用:Spring 工厂进行调用
-
InitiallizingBean接口
public class User implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("实现接口的初始化方法"); } }
-
对象中的一个普通方法
public void myInit(){ System.out.println("普通的初始化方法,需要在Spring配置文件中声明"); }
<bean id="user" class="cf.duanzifan.entity.User" init-method="myInit"/>
-
一些细节分析
1. 如果一个对象即实现了 InitializingBean 接口,同时由提供了普通初始化方法,则执行顺序是什么 InitializingBean---->普通初始化方法 2. 注入一定发生在初始化操作的前面 3. 初始化操作:资源初始化---> 数据库 IO 网络...
销毁阶段
Spring 销毁对象前,会调用对象的销毁方法,完成销毁作用
1. Spring 什么时候销毁所创建的对象?
applicationContext.close();
2. 销毁的方法:程序员定义
销毁的调用:Spring工厂
-
DisposableBean 接口
public class User implements DisposableBean { @Override public void destroy() throws Exception { } }
-
普通销毁方法
public void myDestroy() throws Exception{ }
<bean id="user" class="cf.duanzifan.entity.User" destroy-method="myDestroy"/>
-
一些细节
1. 销毁方法只适用于 scope="singleton" 2. 销毁操作:资源释放操作---> io.close(); connection.close(); ...