Spring后置处理器

开课吧开课吧锤锤2021-08-09 11:54

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

Spring后置处理器

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方法指定后置处理器的执行顺序。该方法返回值为整数,默认值为0,值越大优先级越低。  

示例  

下面使用EclipseIDE演示BeanPostProcessor接口的用法,步骤如下:  

1、创建SpringDemo项目,并在src目录下创建net.kaikeba包。  

2、添加相应的jar包。  

3、在net.kaikeba包下创建HelloWorld、InitHelloWorld、InitHelloWorld2和MainApp类。  

4、在src目录下创建Spring配置文件Beans.xml。  

5、运行SpringDemo项目。  

HelloWorld类代码如下。

package net.kaikeba;
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 net.kaikeba;
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 5;
    }
}

需要注意的是,postProcessBeforeInitialization和postProcessAfterInitialization方法返回值不能为null,否则会报空指针异常或者通过getBean()方法获取不到Bean实例对象,因为后置处理器从SpringIoC容器中取出Bean实例对象后没有再次放回到IoC容器中。  

InitHelloWorld2的代码如下。  

package net.kaikeba;
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 id="helloWorld" class="net.kaikeba.HelloWorld"
        init-method="init" destroy-method="destroy">
        <property name="message" value="Hello World!" />
    </bean>
    <!-- 注册处理器 -->
    <bean class="net.kaikeba.InitHelloWorld" />
    <bean class="net.kaikeba.InitHelloWorld2" />
</beans>

MainApp类代码如下。  

package net.kaikeba;
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先执行。  

以上就是开课吧广场小编为大家整理发布的“Spring后置处理器”一文,更多Java教程相关内容尽在开课吧广场Java教程频道!  

Spring后置处理器

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用2
分享