BeanPostProcessor(Spring后置处理器)如何使用呢?

转自:

BeanPostProcessor(Spring后置处理器)如何使用呢?

BeanPostProcessor接口

  我们通常称其为后置处理器,通过重写接口中的方法可实现初始化前后的操作

BeanPostProcessor 接口源码

public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}


postProcessBeforeInitialization:当Bean实例化、依赖注入后、初始化前调用
postProcessAfterInitialization :当Bean实例化、依赖注入、初始化都完成后调用

注意事项: 当我们需添加多个后置处理器实现类时,
   默认情况下 Spring 容器会根据后置处理器的定义顺序来依次调用,
   当然我们可实现Ordered接口中的getOrder方法设置后置处理器的执行属性,
     也可以通过实现 Ordered 接口的 getOrder 方法指定后置处理器的执行顺序 
       该方法返回值为整数,默认值为 0,值越大优先级越低。


   例 下面使用 Eclipse IDE 演示 BeanPostProcessor 接口的用法,
   步骤 : 创建 SpringDemo 项目,
              并在 src 目录下创建com.java265包 添加相应的 jar 包,可参阅第一个Spring程序
          在com.java265包下创建
      HelloWorld、InitHelloWorld、InitHelloWorld2 和 MainApp 类。
                  在 src 目录下创建 Spring 配置文件 Beans.xml。
      运行SpringDemo项目 HelloWorld 类代码

package com.java265;
public class HelloWorld {
    private String message;
    public void setMessage(String message) {
        this.message = message;
    }
    public void getMessage() {
        System.out.println("Message : " + message);
    }
    public void init() {
        System.out.println("Bean正在初始化");
    }
    public void destroy() {
        System.out.println("Bean将要被销毁");
    }
}

InitHelloWorld 类代码

package com.java265;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
public class InitHelloWorld implements BeanPostProcessor, Ordered {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("A Before : " + beanName);
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("A After : " + beanName);
        return bean;
    }
    @Override
    public int getOrder() {
        return 8;
    }
}

注意事项: postProcessBeforeInitialization 和 postProcessAfterInitialization 方法返回值不能为 null,
               否则会报空指针异常或者通过 getBean() 方法 获取不到 Bean 实例对象,
     因为后置处理器从Spring IoC 容器中取出 Bean 实例对象后没有再次放回到 IoC 容器中
InitHelloWorld2 类代码

package com.java265;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
public class InitHelloWorld2 implements BeanPostProcessor, Ordered {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("B Before : " + beanName);
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("B After : " + beanName);
        return bean;
    }
    @Override
    public int getOrder() {
        return 0;
    }
}

Beans.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-3.0.xsd">
    <bean class="com.java265.HelloWorld" destroy-method="destroy" id="helloWorld" init-method="init">
        <property name="message" value="Hello World!">
    </property></bean>
    <!-- 注册处理器 -->
    <bean class="com.java265.InitHelloWorld"></bean>
    <bean class="com.java265.InitHelloWorld2"></bean>
 </beans>

MainApp 类

package com.java265;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
        obj.getMessage();
        context.registerShutdownHook();
    }
}

-----运行输出结果-----
B Before : helloWorld
A Before : helloWorld
Bean正在初始化
B After : helloWorld
A After : helloWorld
Message : Hello World!
Bean将要被销毁

从以上的运行代码中,我们可以得到
   postProcessBeforeInitialization 方法是在 Bean 实例化和依赖注入后,自定义初始化方法前执行的
   postProcessAfterInitialization 方法是在自定义初始化方法后执行的
    由于 getOrder 方法返回值越大,优先级越低,所以 InitHelloWorld2 先执行
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值