Spring的BeanPostProcessor

一、BeanPostProcessor接口的作用

如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中去。

二、如何实现BeanPostProcessor接口

BeanPostProcessor有两个方法需要实现:postProcessorAfterInitialization、postProcessorBeforeInitialization。

Java代码:

import org.springframework.beans.factory.config.BeanPostProcessor;
public class TestBeanPostProcessor implements BeanPostProcessor {

    /**
     * 实例化之后进行处理
     */
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    /**
     * 实例化之前进行处理
     */
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

前者在初始化代码调用之后调用。

后者在实例化及依赖注入完成后,在任何初始化代码(比如配置文件中的init-method)调用之前调用。

三、BeanFactory和ApplicationContext对待bean后置处理器稍有不同

1. ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有bean。并把他们注册为后置处理器,然后在容器创建bean的适当时候调用它。因此部署一个后置处理器同部署其他bean并没有什么区别。

<bean class="TestBeanPostProcessor" />

2. 而使用BeanFactory实现的时候,bean后置处理器必须通过代码显式的去注册,在IOC容器集成体系中ConfingurableBeanFactory接口中定义了注册方法。

例如:

TestBeanPostPrcessor beanPostProcessor = new TestBeanPostPrcessor();
Resource resource = new FileSystemResource("applicationContext.xml");
ConfigurableBeanFactory factory = new XmlBeanFactory(resource);
factory.addBeanPostProcessor(beanPostProcessor);
factory.getBean("logic");

注意:

1. 接口中的两个方法都要将传入的bean返回、而不能返回Null。否则getBean将无法取得目标。

2. 如将BeanPostProcessor标记为延迟初始化,则无法注册,自定义逻辑也就无法得到应用。假如你在<beans/>元素的定义中使用了‘default-lazy-init‘属性,则各个BeanPostProcessor需标记为‘lazy-init="false"‘。

时间: 2025-01-22 16:01:57

Spring的BeanPostProcessor的相关文章

Spring中BeanPostProcessor

Spring中BeanPostProcessor 前言: 本文旨在介绍Spring动态配置数据源的方式,即对一个DataSource的配置诸如jdbcUrl,user,password,driverClass都通过运行时指定,而非由xml静态配置定死. Spring构造Context的参数一般只包含配置文件路径和类加载器,如果需要达到动态传入配置参数的目的,需要Spring在初始化数据源相关bean的时候能够对原有配置执行修改或替换,为方便处理,本文将定义一个名为DynamicDataSourc

Spring 的 BeanPostProcessor接口实现

今天学习了一下Spring的BeanPostProcessor接口,该接口作用是:如果我们需要在Spring容器完成Bean的实例化,配置和其他的初始化后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现. 下面我们来看一个简单的例子 package com.spring.test.di; import org.springframework.beans.BeansException; import org.springframework.beans.

spring中BeanPostProcessor之一:InstantiationAwareBeanPostProcessor(01)

在spring中beanPostProcessor绝对是开天辟地的产物,给了程序员很多自主权,beanPostProcessor即常说的bean后置处理器. 一.概览 先来说下InstantiationAwareBeanPostProcessor,这个后置处理器是BeanPostProcessor的子接口,继承自BeanPostProcessor,先看下BeanPostProcessor中的方法, 再看下InstantiationAwareBeanPostProcessor中的方法, 可见Ins

关于Spring的BeanPostProcessor

BeanPostProcessor接口作用是:如果我们需要在Spring容器完成Bean的实例化.配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中.. 比如如果我们使用spring整合hibernate,我们可以在容器实例化前先加载hibernate的配置文件: public class MappingFactoryBean implements FactoryBean {    private static

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

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

Spring的BeanPostProcessor和BeanFactoryPostProcessor区别

Spring提供了两种后处理bean的扩展接口,分别为BeanPostProcessor和BeanFactoryPostProcessor,这两者在使用上是有所区别的. BeanPostProcessor:bean级别的处理,针对某个具体的bean进行处理 接口提供了两个方法,分别是初始化前和初始化后执行方法,具体这个初始化方法指的是什么方法,类似我们在定义bean时,定义了init-method所指定的方法<bean id = "xxx" class = "xxx&q

spring中BeanPostProcessor之一:InstantiationAwareBeanPostProcessor(03)

前面介绍了InstantiationAwareBeanPostProcessor后置处理器的postProcessBeforeInstantiation和postProcessAfterInstantiation两个方法的用法和使用场景等.在InstantiationAwareBeanPostProcessor中还有两个方法,分别是postProcessProperties和postProcessPropertyValues,从这两个方法的名称上来看,它们完成的功能似乎很相近,下面来看具体的方法

全面分析 Spring 的编程式事务管理及声明式事务管理

转自:http://www.open-open.com/lib/view/open1414310646012.html 关于本教程 本教程将深切讲授 Spring 庞杂而丁壮夜的事务治理功用,包括编程式事务和声明式事务.经由进程对本教程的进修,您将可以理解 Spring 事务治理的实质,并无邪运用之. 先决前提 本教程假定您已掌控了 Java 根蒂根抵常识,并对 Spring 有一定意见.您还需求具有根抵的事务治理的常识,好比:事务的界说,隔离级其他概念,等等.本文将直接行使这些概念而不做具体正

Spring学习笔记(四)-- Spring事务全面分析

通过本系列的文章对Spring的介绍,我们对Spring的使用和两个核心功能IOC.AOP已经有了初步的了解,结合我个人工作的情况,由于项目是金融系 统,那对事务的控制是必不可少的,并且是非常严格的控制.根据我对项目的研究,它在管理模块用的是JTA的事务,而在交易模块用的是JDBC的事 务,但是,所有的这些事务的使用,都是用Spring封装后的编程式事务.我在看完<Spring In Action>后,在网上看了下大家对Spring事务的理解,貌 似都没有真正的文章是去全面剖析Spring对这