详解Spring中Bean后置处理器(BeanPostProcessor)的使用

目录
  • 一、BeanPostProcessor接口
  • 二、案例
  • 三、总结

一、BeanPostProcessor接口

Bean后置处理:对Spring 工厂创建的对象进行二次加工处理,即预初始化和后初始化。

PostProcessor中文意思就是后置处理器。

BeanPostProcessor 接口也被称为Bean后置处理器,通过该接口可以自定义调用初始化前后执行的操作方法。

该接口中包含了两个方法:before方法(预初始化)和after方法(后厨是化)

postProcessBeforeInitialization() 方法:在 Bean 实例化、属性注入后,初始化前调用。

postProcessAfterInitialization() 方法:在 Bean 实例化、属性注入、初始化都完成后调用。

二、案例

创建User类,为了更好的观察bean周期执行流程,在类中添加无参构造器方法setter注入方法init()初始化方法destory()销毁方法,并在方法中都输出一句话。代码如下

/**
 * 观察bean周期执行流程
 */
public class User {
    String name;
    int age;

    //无参构造方法
    public User() {
        System.out.println("这是无参构造方法");
    }

    //setter方法
    public void setName(String name) {
        System.out.println("这是setter注入name");
        this.name = name;
    }

    public void setAge(int age) {
        System.out.println("这是setter注入age");
        this.age = age;
    }

    //初始化回调方法
    public void init() throws Exception {
        System.out.println("这是初始化回调方法");
    }

    //销毁回调方法
    public void destroy() throws Exception {
        System.out.println("这是销毁回调方法");
    }

    //toString方法
    @Override
    public String toString() {
        return "User{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
}

创建PostProcessor类,实现BeanPostProcessor接口,并重写预初始化方法postProcessBeforeInitialization()和后初始化方法postProcessAfterInitialization()

/**
 * Spring Bean后置处理器
 */
public class PostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"正在执行预初始化方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"正在执行后初始化方法");
        return bean;
    }
}

编写spring配置文件,添加bean

<!--添加user bean-->
<bean id="user" class="com.bighorn.pojo.User" init-method="init" destroy-method="destroy">
    <property name="name" value="bighorn"/>
    <property name="age" value="18"/>
</bean>
<!-- 注册后置处理器 -->
<bean id="postProcessor" class="com.bighorn.config.PostProcessor"/>

编写运行程序

    public static void main(String[] args) {
        //获取 ClassPathXmlApplicationContext 容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从容器中获取对象
        User user = context.getBean("user", User.class);
        //使用bean
        System.out.println("使用bean:"+user);
        //调用close方法关闭容器
        context.close();
    }

运行结果如下,通过结果我们可以清晰地看到bean生命周期执行流程。

三、总结

实际开发中,spring bean初始化操作比较少,一般采用后置处理器加工bean。

后置处理器有两个方法:before和after方法。推荐使用after方法,即后初始化方法。

到此这篇关于详解Spring中Bean后置处理器(BeanPostProcessor)的使用的文章就介绍到这了,更多相关SpringBean后置处理器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解析Java的Spring框架的BeanPostProcessor发布处理器

    BeanPostProcessor 的接口定义,可以实现提供自己的实例化逻辑,依赖解析逻辑等,也可以以后在Spring容器实例化完毕,配置和初始化一个bean通过插入一个或多个的BeanPostProcessor实现一些自定义逻辑回调方法实现. 可以配置多个的BeanPostProcessor接口,控制这些的BeanPostProcessor接口,通过设置属性顺序执行顺序提供的BeanPostProcessor实现了Ordered接口. BeanPostProcessor可以对bean(或对象)

  • Spring BeanPostProcessor(后置处理器)的用法

    目录 BeanPostProcessor 一.自定义后置处理器演示 二.多个后置处理器 三.显示指定顺序 对BeanPostProcessor接口的理解 为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor 该接口我们也叫后置处理器,作用是在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑.注意是Bean实例化完毕后及依赖注入完成后触发的.接口的源码如下 publ

  • Spring实战之Bean的后处理器操作示例

    本文实例讲述了Spring实战之Bean的后处理器操作.分享给大家供大家参考,具体如下: 一 配置文件 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmln

  • 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后置处理器(BeanPostProcessor)的使用

    目录 一.BeanPostProcessor接口 二.案例 三.总结 一.BeanPostProcessor接口 Bean后置处理:对Spring 工厂创建的对象进行二次加工处理,即预初始化和后初始化. PostProcessor中文意思就是后置处理器. BeanPostProcessor 接口也被称为Bean后置处理器,通过该接口可以自定义调用初始化前后执行的操作方法. 该接口中包含了两个方法:before方法(预初始化)和after方法(后厨是化) postProcessBeforeInit

  • 详解Spring中Bean的作用域与生命周期

    目录 一.Bean的作用域 二.Bean的生命周期 使用代码演示Bean的生命周期 一.Bean的作用域 通过Spring容器创建一个Bean的实例时,不仅可以完成Bean的实例化,还可以使用Bean的scope属性为bean设置作用域. 语法格式:<bean id="别名" scope="作用域" class="对应实现类"> 作用域的种类:(sing) singleton和prototype区别:(该两种比较常用) ① singl

  • 详解Spring 中 Bean 的生命周期

    前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上有对Bean声明周期的大致解释,但是没有代码分析,所以就自己上网寻找资料,一定要把这个Bean生命周期弄明白! ​ 网上大部分都是验证的Bean 在面试问的生命周期,其实查阅JDK还有一个完整的Bean生命周期,这同时也验证了书是具有片面性的,最fresh 的资料还是查阅原始JDK!!! 一.Bean 的完整

  • 详解Spring中bean的几种注入方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入.依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Spring容器中支持的依赖注入方式主要有属性注入.构造函数注入.工厂方法注入.接下来将为大家详细介绍这三种依赖注入的方式以及它们的具体配置方法. 1.属性注入 属性注入即通过setXXX( )方法注入bean的属性值或依赖对象.由于属性注入方式具有可选择性和灵活性高的特点,因此它也是实际开发中最常用的注入方式

  • 详解Spring中Bean的加载的方法

    之前写过bean的解析,这篇来讲讲bean的加载,加载要比bean的解析复杂些,从之前的例子开始. Spring中加载一个bean的方式: TestBean bean = factory.getBean("testBean"); 来看看getBean(String name)方法源码, @Override public Object getBean(String name) throws BeansException { return doGetBean(name, null, nul

  • 详解Spring中bean生命周期回调方法

    生命周期回调方法 对于spring bean来讲,我们默认可以指定两个生命周期回调方法.一个是在ApplicationContext将bean初始化,包括注入对应的依赖后的回调方法:另一个是在ApplicationContext准备销毁之前的回调方法.要实现这种回调主要有三种方式:实现特定的接口.在XML配置文件中指定回调方法和使用JSR-250标准的注解. 1 实现特定接口 针对bean初始化后的回调和ApplicationContext销毁前的回调,Spring分别为我们了提供了Initia

  • 详解Spring中Bean的生命周期和作用域及实现方式

    前言 在applicationContext.xml中配置完bean之后,Bean的声明周期状态有哪些.生命周期的各个阶段可以做什么.在applicationContext.xml配置bean的作用域有哪些.其中各个作用域代表的是什么.适用于什么情况.这篇文章做一个记录. 生命周期 初始化 可以直接查看图片,图片来自Spring Bean Life Cycle 从上图看出,Bean初始化完成包括9个步骤.其中一些步骤包括接口的实现,其中包括BeanNameAware接口,BeanFactoryA

  • 详解Spring中bean实例化的三种方式

    今天我想来说说如何通过xml配置来实例化bean,其实也很简单. 使用xml配置来实例化bean共分为三种方式,分别是普通构造方法创建.静态工厂创建.实例工厂创建,OK,那么接下来我们来分别看看这几种方式. 普通构造方法创建 这种创建方式使我们使用最多的一种创建方式,直接配置bean节点即可,比如我有一个User类,如下: public class User { public void add() { System.out.println("add()---------"); } }

  • 详解Spring中接口的bean是如何注入的

    Question: 这个问题困扰了我好久,一直疑问这个接口的bean是怎么注入进去的?因为只看到使用@Service注入了实现类serviceImpl,使用时怎么能获取的接口,而且还能调用到实现类的方法,难道这个接口是在什么时候自动注入了进去,且和实现类关联上了? 接口 public interface TestService { public String test(); } 实现类impl @Service public class TestServiceImpl implements Te

随机推荐