spring之添加后置处理器的bean的生命周期

(1)bean的后置处理器允许在调用初始化方法前后对bean进行额外的处理。

(2)bean的后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一的实例。其典型应用是:检查Bean属性的正确性或根据特定的标准更改bean的属性。

(3)对Bean后置处理器而言,需要实现Interface BeanPostProcessor接口,在初始化方法被调用前后,spring将把每个bean的实例分别传递给上述接口的以下两个方法。

postProcessAfterInitialization、postProcessBeforeInitialization

添加bean后置处理器之后的bean的生命周期:

  • 通过构造器或工厂方法创建bean的实例;
  • 为bean的属性设置值并对其他bean的引用;
  • 将bean的实例传递给Bean的后置处理器的postProcessBeforeInitialization方法;
  • 调用Bean的初始化方法;
  • 将bean的实例传递给Bean的后置处理器的postProcessAfterInitialization方法;
  • bean可以被使用了;
  • 当容器关闭时,调用bean的销毁方法;

Car.java

package com.gong.spring.beans.cycle;

public class Car {
    private String name;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("setName...");
        this.name = name;
    }

    public Car() {
        System.out.println(    "car的构造器");
    }

    public void init() {
        System.out.println("init...");
    }
    public void destroy() {
        System.out.println("destroy...");
    }

    @Override
    public String toString() {
        return "Car [name=" + name + "]";
    }

}

myBeanPostProcessor.java

package com.gong.spring.beans.cycle;

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

public class MyBeanPostProcessor implements BeanPostProcessor {

    /*
     * bean:实例本身
     * beanName:IOC容器配置的bean的名字
     * 返回值是实际上是返回给用户的那个bean,注意:可以在以下两个方法中修改返回的Bean,
     * 甚至返回一个新的bean
     * */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("postProcessAfterInitialization"+", "+bean+", "+beanName);
        Car car = new Car();
        car.setName("benchi");
        return car;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("postProcessBeforeInitialization"+", "+bean+", "+beanName);
        //由于会对所有的bean都会执行,所以要判断,指定想要处理的Bean
        if("car".equals(beanName)) {
            //...
        }
        return bean;
    }

}

beans-cycle.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="car" class="com.gong.spring.beans.cycle.Car" init-method="init"
    destroy-method="destroy">
        <property name="name" value="baoma"></property>
    </bean>
    <!-- 配置Bean的后置处理器 -->
    <bean class="com.gong.spring.beans.cycle.MyBeanPostProcessor"></bean>
</beans>

Main.java

package com.gong.spring.beans.cycle;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //1.创建spring的IOC容器对象
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
        //2.从容器中获取Bean实例
        Car car = (Car) ctx.getBean("car");
        System.out.println(car.toString());
        ctx.close();
    }
}

输出:

我们要关注两个位置:

(1) 与不加后置处理器的bean的生命周期相比,加了之后的多出了两个过程。

(2)在postProcessBeforeInitialization中修改了Car对象的属性并返回给用户时,在Main.java中得到名为car的bean的name的属性值也发生了相应的变化。

原文地址:https://www.cnblogs.com/xiximayou/p/12153043.html

时间: 2024-10-08 17:31:25

spring之添加后置处理器的bean的生命周期的相关文章

Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解

BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中. package com.test.spring; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.B

Spring之BeanPostProcessor(后置处理器)介绍

??为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor ??该接口我们也叫后置处理器,作用是在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑.注意是Bean实例化完毕后及依赖注入完成后触发的.接口的源码如下 public interface BeanPostProcessor { /** * Apply this BeanPostProcessor to th

Spring中的后置处理器BeanPostProcessor讲解

BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中. package com.test.spring; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.B

spring利用后置处理器初始化bean属性

参考:http://blog.csdn.net/heyutao007/article/details/50326793 @Configurable @EnableScheduling 这两个注解和这个例子无关,是下面定时器的注解.

Spring核心学习(2)管理Bean的生命周期

前导:开始学习Spring核心思想,通过一个山寨精简版Spriing代码结合学习. 内容:1. 抽象BeanFactory-面向接口更易拓展BeanFactory-面向接口更易拓展. 2. 在AbstractBeanFactory内部初始化Bean. 这里的BeanDefinition相比上一个更加丰富,多了BeanDefinition包含的Bean的Class的信息,这里我们不在注册前就把Bean实例化给BeanDefinition,而是延迟到注册的时候才实例化Bean给BeanDefinit

BeanPostProcessor后置处理器原理以及ApplicationListener原理

BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 1.BeanFactoryPostProcessor:BeanFactory的后置处理器; 在BeanFactory标准初始化之后调用;所有的bean定义已经保存加载到BeanFactory,但是bean的实例还没创建; BeanFactoryPostProcessor原理: 1.1 ioc容器创建对象 1.2 invokeBeanFactoryPostProcessors(BeanFactory)

JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一)概述及简单实例

上文我们讲述了如何对 HTTP请求 的响应数据进行断言,以判断响应是否符合我们的预期,敬请参阅:JMeter学习-007-JMeter 断言实例之一 - 响应断言 那么我们如何获取 HTTP请求 响应结果中的数据呢?此文以获取类目 手机数码-手机通讯-苹果 结果列表中的第一个商品的系统编号为例演示(脚本基于上篇文章,请知悉). 如下为请求响应数据中的部分数据,我们最终要获取的数据为 "sysNo": "2142717" 中的 2142717. 1 2 3 4 5 6

【JEMTER】后置处理器JSON Path Extractor获取server端返回的json中某项值

需求1:点击所有报表模板时,server端返回所有报表模板的ID(templateId),测试时需要下载某个模板生成的报表 需求2:点击单个报表模板时,server端返回这个报表模板下的所有报表ID(fileId),获取到fileID以后便可以下载此报表 实现:添加后置处理器 配置后置处理器参数: 配置获取报表ID ---destination variable name:获取到对应的值以后,保存到的变量名 ---JSON PATH Expression 取对应值的json表达式 配置获取文件I

Jmeter后置处理器解析unicode 编码转换

使用Jmeter过程中发现,从查看结果树看到部分内容需要decode,此处参考曲线救国的方法. 步骤: 添加后置处理器-BeanShell PostProcessor 在scripts处添加相关代码,之后执行即可 1 //获取响应代码Unicode编码的 2 3 String s2=new String(prev.getResponseData(),"UTF-8"); 4 //---------------以下步骤为转码过程--------------- 5 char aChar; 6