1:Bean作用域
默认情况下,我们从Spring容器中获取的对象均是单例,对于bean的作用域类型如下。
1:singleton作用域
单例作用域:
注意: lazy-init是懒加载,当为true时,表示在Spring的容器启动时,不会实例化此对象,而是在程序调用时才会去实例化该对象,默认为false即在Spring容器启动时实例化。
1:为什么不进行懒加载?
- 可以提前发现潜在的配置问题
- Bean对象存入缓存中,使用时不会再去实例化Bean,而是直接从缓存取,加快程序速度
默认情况下:被管理的bean对象只会在IOC容器中存放一个实例,对于所有获取该Bean的操作将只返回用一个Bean。
容器在启动的情况下就实例化所有singleton的bean对象,并缓存于容器中。
2:什么对象适合作为单例?
对于无状态或者状态不可改变的对象适合使用单例模式(不存在会改变对象状态的成员变量)。
比如Dao,Service,Coltroller各层。
3:什么是无状态或不可改变对象?
实际上对象状态的变化往往是属性值变化引起的,比如User类,姓名属性会发生变化,姓名属性的变化往往会引起user对象状态的变化。对程序来说,无状态对象就是没实例变量的存在,保证线程的安全性,service层业务对象即是无状态对象,线程安全。
2:prototype作用域
原型作用域:
通过scope="prototype"设置bean的作用域类型为原型作用域,每次Spring容器请求获取Bean时,都会返回一个全新的Bean,相对于单例作用域来说,原型作用域不缓存Bean,每次根据Bean定义一个全新的Bean。
3:Web应用中的作用域
1:request作用域: 表示每个请求都创建一个全新的Bean。比如提交表单数据时,必须对每次请求新建一个Bean来保存这些表单数据,请求结束释放数据。
2:session作用域: 表示每个会话需要容器创建一个全新的Bean。比如对于每一个用户一般都会有一个会话,该用户的信息需要保存在会话中,此时将Bean的作用域设为session。
3:globalSession作用域: 类似于Session,其用于portlet环境(Portlet是基于Java的Web组件,由Portlet容器管理,并由容器处理请求,生成动态内容)的web应用,如果在非portlet环境将它视为session。配置环境和基本作用域相同,必须有Web环境支持,并配置相应的容器监听器,拦截器从而能应用这些作用域。
2:Bean生命周期
Bean的生命周期包括,Bean的定义,初始化,使用,销毁四个阶段。
1:Bean的定义
在Spring中,通常是通过配置文档的方式来定义Bean的,在同一个配置文件中,可以定义多个Bean。
2:Bean的初始化
默认在IOC容器加载时,实例化对象。
SpringBean初始化有两种方式:初始化的顺序取决与配置文件写的上下顺序。
方式一: 在配置文档中通过指定init-method属性完成。
public class RoleService {
public void inIt(){
System.out.println("Service初始化");
}
}
<!--初始化Bean方式一:init-method-->
<bean id="roleService" class="factory.RoleService" init-method="inIt"></bean>
方式二:实现InitializingBean接口重写afterPropertiesSet()方法
public class RoleDao implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Dao初始化");
}
}
<!--初始化Bean方式二:InitializingBean接口-->
<bean id="roleDao" class="factory.RoleDao"></bean>
Bean对象的实例化过程是在Spring容器初始化时被实例化的,且不可改变,可通过lazy-init="true"属性延迟Bean对象的初始化,此时在调用Bean时才会进行初始化。
3:Bean的使用
方式一:使用BeanFactory
//Bean的使用
BeanFactory beanFactory=new ClassPathXmlApplicationContext("spring.xml");
方式二:使用ApplicationContext
//Bean的使用
ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
4:Bean的销毁
实现销毁方法:Spring容器会维护Bean对象的管理,可以指定Bean对象的销毁所要执行的方法
步骤一: 实现销毁方式(Spring容器会维护Bean对象的管理,指定Bean对象的销毁执行方法)
public void destroy(){
System.out.println("Dao销毁");
}
<bean id="roleDao" class="factory.RoleDao" destroy-method="destroy"></bean>
步骤二: 通过AbstractApplicationContext对象,调用close()方法实现Bean的销毁过程
AbstractApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
applicationContext.close();