Spring后置处理器

举报
CoderX 发表于 2022/04/16 16:48:19 2022/04/16
【摘要】 Spring后置处理器(BeanPostProcessor)后置处理器的作用Spring Bean生命周期中会调用BeanPostProcessor接口,即为后置处理器,通过改接口可以自定义调用初始化前后执行的操作方法。接口中包含两个方法:postProcessBeforeInitialization() :在 Bean 实例化、属性注入后,初始化前调用。postProcessAfterIn...

Spring后置处理器(BeanPostProcessor)

后置处理器的作用

  1. Spring Bean生命周期中会调用BeanPostProcessor接口,即为后置处理器,通过改接口可以自定义调用初始化前后执行的操作方法。

  2. 接口中包含两个方法:

    • postProcessBeforeInitialization() :在 Bean 实例化、属性注入后,初始化前调用。

    • postProcessAfterInitialization() :在 Bean 实例化、属性注入、初始化完成后调用。

    注意:postProcessBeforeInitialization 和 postProcessAfterInitialization 方法返回值不能为 null,否则会报空指针异常或者通过 getBean() 方法获取不到 Bean 实例对象。

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

代码示例

  1. Java类

     package org.example;public class HelloWorld {
         private String message;public void init(){
             System.out.println("Bean正在初始化");
         }public void destroy(){
             System.out.println("Bean将要被销毁");
         }
     ​
     ​
         public String getMessage() {
             return message;
         }public void setMessage(String message) {
             this.message = message;
         }
     }


  2. 后置处理器类1

     package org.example;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;
         }
     }


  3. 后置处理器类2

     package org.example;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;
         }
     }


  4. 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="hello" class="org.example.HelloWorld" init-method="init" destroy-method="destroy">
             <property name="message" value="Hello World"/>
         </bean><!--注册处理器-->
         <bean class="org.example.InitHelloWorld"/>
         <bean class="org.example.InitHelloWorld2"/>
     ​
     ​
     ​
     </beans>


  5. Main方法

     package org.example;import org.springframework.context.support.AbstractApplicationContext;
     import org.springframework.context.support.ClassPathXmlApplicationContext;
     ​
     ​
     public class App {
         public static void main( String[] args ) {
             //创建bean工厂 使用ApplicationContext的子类AbstractApplicationContext
             AbstractApplicationContext context=new ClassPathXmlApplicationContext("Beans.xml");
     ​
             HelloWorld obj=(HelloWorld)context.getBean("hello");
             System.out.println(obj.getMessage());
             //在非web应用中关闭IoC容器
             context.registerShutdownHook();
         }
     }


  6. 运行结果

     B Before : hello
     A Before:hello
     Bean正在初始化
     B After : hello
     A After:hello
     Hello World
     17:20:01.919 [SpringContextShutdownHook] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@4cf4d528, started on Wed Mar 30 17:20:01 CST 2022
     Bean将要被销毁
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。