bean对象作用域
singleton 单例作用域
默认情况下,Spring容器中加载Bean对象都是单例作用域。
Spring容器在启动时会实例化bean对象,并将对象设置到单例缓存池中,下次获取时直接从缓存池中得到。
<bean id="typeDao" class="com.zh.dao.TypeDao" scope="singleton" lazy-init="false"/>
- 懒加载
lazy-init属性,表示懒加载,默认为false,即Spring容器启动时实例化
如果为true,表示容器在启动时不会自动实例化这个Bean对象,而是在程序调用时才会去实例化
- 验证懒加载
<!--
添加init-method属性,当该bean对象被实例化时调用的方法
lazy-init=“true” 开启懒加载
-->
<bean id="typeDao" class="com.zh.dao.TypeDao" scope="singleton" init-method="test1" lazy-init="true"/>
- 当bean对象typeDao被初始化时,init-method后面定义的方法就会被调用
- lazy-init属性默认为false的好处?
可以提前发现配置的潜在问题
Bean对象存在于缓存中,使用时不用再去实例化bean,加快程序运行效率
- 什么对象适合做单例?
一般来说对于无状态或状态不可改变的对象适合做单例模式。(不存在会改变对象状态的成员变量)比如controller层、service层、dao层
- 什么是无状态或状态不可改变的对象?
对象中不存在改变当前对象的状态的成员变量。
实际上对象状态的变化往往均是由于属性值的变化而引起的,比如User类 姓名属性会有变化,属性姓名的变化一般会引起user对象状态的变化。
对于我们程序而言,无状态对象没有实例对象的存在,证明了线程的安全性,service层业务对象即是无状态对象,线程是安全的。
prototype 原型作用域
Spring容器启动时会实例化bean对象,不会将对象设置到单例缓存池中,每次请求都会重新创建一个新的Bean对象。
<!--原型作用域-->
<bean id="typeDao" class="com.zh.dao.TypeDao" scope="prototype" lazy-init="false"/>
-
原型作用域,实例化两次bean对象,获得两个bean对象