1.单例和多例
- 单例:
初始化spring容器后对象直接创建存入Map中,无论调用多少次的getbean(key)方法。其实都是在Map中查询到key值,返回已经创建保存好的对象。直到spring容器退出时销毁对象。 - 多例:
初始化容器后不创建对象,当调用了getbean(key)后,根据key确定要创建的对象,直接创建返回,不存入Map中。 - 实现代码:
//scope属性用来控制是否单例或多例,prototype是多例,singleton则表示单例
<bean id="cart" class="cn.tedu.beans.Cart" scope="prototype"></bean>
2.懒加载机制
1.问题的提出:
- 之前提到的对象创建是在初始化容器的时候,通过解析xml配置文件通过反射直接创建对象并存入map中,这样做有一个坏处,就是当bean过多的时候会花费大量时间和空间来处理bean。
2.问题的解决:
-
为了解决上述问题,spring提出了懒加载机制,简单来说,当初始化spring容器的时候,不直接创建对象,而是把创建对象延迟到调用getbean()的时候。(注意:懒加载机制只对单例有用,多例的话不存在这个问题,因为多例本身就是调用getbean()的时候才会创建对象。
3.代码的实现: -
实现1:为指定的bean配置懒加载,lazy-init=“true”
java <bean id="cart" class="cn.tedu.beans.Cart" lazy-init="true"></bean>
-
实现2:为全局配置,配置文件里的bean全部默认懒加载,default-lazy-init=“true”
3.初始化和销毁的方法
- 当spring容器初始化和使用close方法的时候,可以调用一些事先在类里写好的初始化方法和销毁方法。
比如在一个工具类里,有一个获取数据库连接的初始化方(initConnection)需要在创建对象的时候初始化,使用完成后需要释放连接(closeConnection)
实现代码:
//init-method中配置初始化方法,destroy-method中配置销毁方法
<bean id="prodDao" class="cn.tedu.beans.ProdDao"
init-method="initConnection" destroy-method="closeConnection"></bean>