Spring笔记——6.容器中bean的生命周期

spring可以管理单例bean的生命周期,知道何时被创建,核实初始化,何时销毁,也可以进行某些通用资源申请,销毁前资源回收。对于prototype,容器只负责创建,之后就撒手不管自生自灭。容器不知道一共创建了多少prototype,也不知道他们什么时候会被销毁,所以容器没法管理prototype。

管理bean的生命周期有如下两个时机:

  • 注入依赖关系后
  • 即将销毁bean前


依赖关系注入后的行为

通过设定init-method属性指定某个方法或者实现InitializingBean接口指定需要实现的方法,我们就可以在全部属性设定之后通过那些方法执行特定行为。

bean销毁之前的行为

同样两个方法实现,一个是destroy-method,另一个是DisposableBean接口。

singleton的bean会随容器的关闭而销毁,但容器什么时候关闭呢?web中能够自动地在关闭web应用时关闭容器,而在非web下,为了完美地关闭容器,并在singleton销毁前回调方法,我们需要在jvm里注册一个关闭钩子(shutdown hook)。只需使用AbstractApplicationContext中提供的registerShutdownHook方法即可。

AbstractApplicationContext act = new ClassPathXmlApplicationContext("beans.xml");

act.registerShutdownHook();

为了简介,也可以为beans配置default-destroy-method属性和default-init-method属性统一配置两个方法名。

当属性与接口都有时,优先执行接口的方法。

协调作用域不同的bean

如果一个单例依赖一个prototype,那么prototype会先被创建然后注入到单例,之后再创建单例,而由于单例已经有了一个prototype,就再也不会有其他的prototype了,所以每次访问prototype都是同一个,相当于它也变成了单例。这就带来了不同步的问题。有连个解决思路

  • 重新请求一个singleton,这样就得到新的prototype了。
  • 使用lookup方法可以让容器重写bean的抽象或者具体方法,返回查找容器中其他bean的结果。

第一种没人用,因为太垃圾了,会造成耦合。下面来理解一下第二种什么意思。

比如说单例的Chinese中的hunt方法想要每次都使用不同的Dog实例,显然Dod需要是prototype的,此时就不能使用简单的依赖注入,而要使用lookup。

首先将调用者bean的实现类定义为抽象类,并定义一个抽象方法来获取bean。

public abstract class Chinese implements Person
{
    private Dog dog;
    public abstract Dog getDog();
    public void hunt()
    {
    System.out.println(getDog());
    System.out.println(getDog().run());
    }
}

在它的bean中添加lookup-method子元素,告诉容器需要实现哪个抽象方法。容器会按照配置的参数自动创建一个Bean实例。

<bean id="chinese" class="com.cm.Chinese">
    <lookup-method name="getDog" bean="gunDog"/>
</bean>
<bean id="gunDog" class="com.cm.GunDOg" scope="prototype">
    <property name="name" value="旺财"
</bean>

这段代码意义如下:lookup表明了getDog这个方法由Spring负责实现,怎么实现呢?通过gunDog这个bean。gunDog是一个实现了Dog接口的类,getDog的返回值也是接口类型Dog。Spring是怎么实现这个方法的呢?通过一个getDog方法,得到容器中的gunDog实例,然后返回这个实例。

这么折腾了一圈(由之前简单的注入变为,先写一个抽象方法,Spring去完成这个抽象方法,再利用方法的返回值实现依赖),就是为了每次都得到一个不同的prototype(因为依赖关系不是写死的,而是每次得到那同一个Chinese,都会跑一边getDog方法,自然也就得到一个新的prototype。注意目标bean,也就是Dog,必须是prototype的!

时间: 2024-10-25 04:49:54

Spring笔记——6.容器中bean的生命周期的相关文章

spring IOC 容器中 Bean 的生命周期

IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例2.为 Bean 的属性设置值和对其他 Bean 的引用3.调用 Bean 后置处理器接口(BeanPostProcessor),进行初始化前处理4.调用 Bean 的初始化方法5.调用 Bean 后置处理器接口(BeanPostProcessor),进行初始化后处理6.Bean 可以使用了7.当容器关闭时, 调用 Bean 的销毁方法8.在 Bean 的声明里设置 init-method 和 destroy-m

Spring容器中Bean的生命周期

日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此,闲言少叙,书归正传,上图先: 步骤很多,切莫惊慌,我们可以把上面的步骤归纳如下: 1-2:创建实例: 现在假设spring就是个容器,而配置文件中配置的bean属性才是我们真正需要的东西.创建实例就是说,我把配置文件中的bean信息取出来化作一个真正的bean并放到容器中. 3-4:注入依赖关系:

IOC容器中bean的生命周期

一.Bean生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: 通过构造器或工厂方法创建Bean实例 为Bean的属性设置值和对其它Bean的引用 调用Bean的初始化方法 Bean可以使用了 当容器关闭时,调用Bean的销毁方法 在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法. 下面通过示例

Spring4学习回顾之路06- IOC容器中Bean的生命周期方法

SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行特定的任务! Spring IOC容器对Bean的生命周期进行管理的过程: -通过构造器或者工厂方法创建Bean实例 -为Bean的属性设置值和对其他Bean的引用 -调用Bean的初始化方法 -Bean可以使用了 -当容器关闭了,调用Bean的销毁方法 在Bean的声明中设置init-method和destory-method属性,为Bean指定初始化和销毁方法:如图: <bean id="s

IOC容器中Bean的生命周期方法

一Spring IOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务. 二.Spring IOC容器对Bean的生命周期进行管理的过程: -通过构造器或工厂方法创建Bean的实例 -为Bean的属性设置值和对其他的Bean的引用 -调用Bean的初始化方法 -Bean可以用了 -当容器关闭是吗,调用Bean的销毁方法 三.在bean的声明里设置init-method和destroy-method属性.为Bean指定初始化和销毁方法.

Spring注解驱动第八讲--容器中bean的生命周期

bean的生命周期指的就是bean在容器中的: 创建-->初始化-->销毁; 以上的过程都是由容器来进行管理. 我们可以自定义初始化和销毁方法,的那个进行到当前bean的生命周期的时候,调用我们自己定义的初始化方法和销毁方法.那么自定义初始化和销毁方法有以下四种方式: 1,指定初始化和销毁方法: 在以往使用xml配置文件的时候可以在<bean>标签中加上"init-method"和"destory-method"属性来指定自定义的初始化和销毁

[原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

《Spring揭秘》(八)---- IoC容器及Bean的生命周期

Spring的IoC容器会以某种方式加载配置信息,然后根据这些信息绑定整个系统的对象,最终组装成一个可用的基于轻量级容器的应用系统.实现以上功能,分为两个阶段:容器启动阶段和Bean实例化阶段.而且Spring的IoC容器在每个阶段都加入了相应的扩展点,以便根据具体场景的需要加入自定义的扩展逻辑. 1 容器启动阶段 首先会通过某种途径加载配置信息,大部分情况下,容器需要依赖某些工具类(BeanDefinitionReader)对加载的配置信息进行解析和分析,并将分析后的信息编组为相应的BeanD

Spring中Bean的生命周期

Spring中Bean的生命周期过程: 1.Spring对Bean进行实例化(相当于程序中的new Xx()) 2.Spring将值和Bean的引用注入进Bean对应的属性中 3如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法 (实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有在Bean的ID的) 4.如果Bean实现了BeanFactoryAware接口,Spring将调用se