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="student2" class="com.lql.spring03.Student" init-method="init" destroy-method="destory ">
        <property name="name" value="#{‘lql‘}"></property>
        <property name="age" value="#{17}"></property>
   </bean>  

当然,除了上述五个过程之外,Bean的生命周期可以更“丰富”点,于是就有了“Bean后置处理器”

Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理;Bean后置处理器对IOC容器里所有的Bean实例逐一处理,而非单一实例。对Bean后置处理器而言,需要实现org.springframework.beans.factory.config.BeanPostProcessor接口,在初始化方法被调用前后,Spring将每个Bean实例分别传递给上述接口的以下两个方法:

package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;

public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;

    Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}

Spring IOC容器对Bean的生命周期进行管理的过程:

  -通过构造器或者工厂方法创建Bean实例

  -为Bean的属性设置值和对其他Bean的引用

  -将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法

  -调用Bean的初始化方法

  -将Bean实例传递给Bean后置处理器的postProcessAfterInitialization方法

  -Bean可以使用了

  -当容器关闭了,调用Bean的销毁方法

案例:建立Bean后置处理器类

package com.lql.spring03;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * @author: lql
 * @date: 2019.10.26
 * Description:
 * Created with IntelliJ IDEA
 */
public class MyBeanPostProcessor implements BeanPostProcessor{
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        System.out.println("postProcessBeforeInitialization :" + beanName +", " + bean);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        System.out.println("postProcessAfterInitialization:" + beanName +", " + bean);
        return bean;
    }
}

在xml配置文件中配置Bean后置处理器:

  <!--配置bean的后置处理器-->
    <bean class="com.lql.spring03.MyBeanPostProcessor"></bean>

Student.java

package com.lql.spring03;

/**
 * @author: lql
 * @date: 2019.10.12
 * Description:
 * Created with IntelliJ IDEA
 */
public class Student {

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ‘}‘;
    }
}

测试类:

package com.lql.spring03;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author: lql
 * @date: 2019.10.12
 * Description:
 * Created with IntelliJ IDEA
 */
public class Test {

    public static void main(String[] args) {

        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("scope.xml");
        Student student = app.getBean("student", Student.class);
        System.out.println(student);

    }
}

输出则显示:

postProcessBeforeInitialization :student, Student{name=‘lql‘, age=17}
postProcessAfterInitialization:student, Student{name=‘lql‘, age=17}
Student{name=‘lql‘, age=17}

但是这样有注入危险,比如更改Bean后置处理器的after方法:更改如下:

 @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        System.out.println("postProcessAfterInitialization:" + beanName +", " + bean);

        Student student = new Student();
        student.setName("张三");
        return student;
    }

这样测试的结果是:

postProcessBeforeInitialization :student, Student{name=‘lql‘, age=17}
postProcessAfterInitialization:student, Student{name=‘lql‘, age=17}
Student{name=‘张三‘, age=0}

还有个需要注意的是:因为Bean后置处理器是处理所以Bean的,所以可以这么修改:

 @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        if ("student".equals(beanName)) {
            //处理步骤
        }

        System.out.println("postProcessBeforeInitialization :" + beanName +", " + bean);
        return bean;
    }

关于BeanPostProcessor的一些说明:

  -接口,实现用来作用于Bean后置处理器

  -两个方法:Object postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用

        Object postProcessAfterInitialization(Object bean, String beanName):init-method之后被调用

  参数 bean: bean 实例本身

  参数beanName:IOC容器配置bean的名字

  返回值:是实际上返回给用户的那个Bean,但是可以在上面两个方法中修改返回的bean,甚至返回一个新的bean.

原文地址:https://www.cnblogs.com/-qilin/p/11745288.html

时间: 2024-10-16 12:02:32

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

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

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

IOC容器中bean的生命周期

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

[原创]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的生命周期

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

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

spring可以管理单例bean的生命周期,知道何时被创建,核实初始化,何时销毁,也可以进行某些通用资源申请,销毁前资源回收.对于prototype,容器只负责创建,之后就撒手不管自生自灭.容器不知道一共创建了多少prototype,也不知道他们什么时候会被销毁,所以容器没法管理prototype. 管理bean的生命周期有如下两个时机: 注入依赖关系后 即将销毁bean前 依赖关系注入后的行为 通过设定init-method属性指定某个方法或者实现InitializingBean接口指定需要实

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

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

Spring4学习回顾之路03—配置Bean (上)

配置Bean的篇幅有点长,中间涉及的东西有点多,分上中下讲述,配置Bean的形式可以基于XML文件的方式,也可以基于注解的方式,而Bean的配置方式可以通过全类名(反射),通过工厂方式和FactoryBean. XML形式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns: