Spring 后置处理器

一、后置处理器:BeanPostProcessor 接口

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 实例化、属性注入、初始化都完成后调用。

二、一个简单的例子

1.HelloWorld.java

package com.forcoldplay.spring.test03;

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 要被销毁");
    }
}

2.InitHelloWorld.java

这是实现 BeanPostProcessor 的非常简单的例子,它在任何 bean 的初始化的之前和之后输入该 bean 的名称。你可以在初始化 bean 的之前和之后实现更复杂的逻辑,因为你有两个访问内置 bean 对象的后置处理程序的方法。

package com.forcoldplay.spring.test03;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class InitHelloWorld implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("初始化之前 : " + beanName);
        return bean;  // you can return any other object as well
    }
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("初始化之后 : " + beanName);
        return bean;  // you can return any other object as well
    }
}

3.MainApp.java

AbstractApplicationContext 类中声明的关闭 hook 的 registerShutdownHook() 方法,它将确保正常关闭,并且调用相关的 destroy 方法。

package com.forcoldplay.spring.test03;

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("helloWorld03");
        obj.getMessage();
        context.registerShutdownHook();
    }
}

4.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="com.forcoldplay.spring.test.HelloWorld">
        <property name="message" value="Hello World!"/>
    </bean>
    <bean id="helloWorld02" class="com.forcoldplay.spring.test02.HelloWorld" scope="singleton">

    </bean>
    <bean id="helloWorld03" class="com.forcoldplay.spring.test03.HelloWorld"
          init-method="init" destroy-method="destroy">
        <property name="message" value="Hello World!"/>
    </bean>
    <bean class="com.forcoldplay.spring.test03.InitHelloWorld" />
</beans>

5.运行结果

初始化之前 : helloWorld03
Bean 正在被初始化
初始化之后 : helloWorld03
Message : Hello World!
Bean 要被销毁
Last modification:March 27th, 2022 at 09:46 am
如果觉得我的文章对你有用,请随意赞赏