我是靠谱客的博主 冷艳嚓茶,最近开发中收集的这篇文章主要介绍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 先执行

最后

以上就是冷艳嚓茶为你收集整理的BeanPostProcessor(Spring后置处理器)如何使用呢?的全部内容,希望文章能够帮你解决BeanPostProcessor(Spring后置处理器)如何使用呢?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部