Spring05-Bean作用域以及生命周期

1:Bean作用域

默认情况下,我们从Spring容器中获取的对象均是单例,对于bean的作用域类型如下。

1:singleton作用域

单例作用域:

在这里插入图片描述

注意: lazy-init是懒加载,当为true时,表示在Spring的容器启动时,不会实例化此对象,而是在程序调用时才会去实例化该对象,默认为false即在Spring容器启动时实例化。

1:为什么不进行懒加载?

  1. 可以提前发现潜在的配置问题
  2. 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();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值