zoukankan      html  css  js  c++  java
  • bean的二次加工-Spring5.X后置处理器BeanPostProcessor

    什么是BeanPostProcessor

    • 是Spring IOC容器给我们提供的一个扩展接口
    • 在调用初始化方法前后对Bean进行额外加工,ApplicationContext会自动扫描实现了BeanPostProcessor得bean,并注册这些bean为后置处理器
    • 是Bean的统一前置后置处理而不是基于某一个bean

    执行顺序

    Spring IOC容器实例化
    调用BeanPostProcessor的postProcessBeforeInitialization方法
    调用bean实例的初始化方法
    调用BeanPostProcessor的postProcessAfterInitialization方法

    注意:接口重写的两个方法不能返回null,如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bean实例对象

    可以注册多个BeanPostProcessor顺序

    • 在Spring机制中可以指定后置处理器调用顺序,通过BeanPostProcessor接口实现类实现Ordered接口getOrder方法,该方法返回整数,默认值为0优先级最高,值越大优先级越低

    CustomBeanPostProcessor.java实现接口BeanPostProcessor

    package net.cybclass.sp.processor;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    public class CustomBeanPostProcessor implements BeanPostProcessor {
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("CustomBeanPostProcessor postProcessBeforeInitialization beanName="+beanName);
            return bean;
        }
    
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("CustomBeanPostProcessor postProcessAfterInitialization beanName="+beanName);
            return bean;
        }
    }

    applicationContext.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.xsd">
        <bean id="video" class="net.cybclass.sp.domain.Video">
            <property name="id" value="8"></property>
            <property name="title" value="SpringBoot课程专题"></property>
        </bean>
        <bean class="net.cybclass.sp.processor.CustomBeanPostProcessor"></bean>
    </beans>

    Video.java

    package net.cybclass.sp.domain;
    
    public class Video {
        public Video()
        {
            System.out.println("Video 默认空构造函数被调用");
        }
        {
            System.out.println("Video 构造块被调用");
        }
        static
        {
            System.out.println("Video static 静态代码块被调用");
        }
        private int id;
        private String title;
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    }

    app.java

    package net.cybclass.sp;
    
    import net.cybclass.sp.domain.Video;
    import net.cybclass.sp.domain.Video2;
    import net.cybclass.sp.domain.VideoOrder;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class app {
        public static void main(String[] args) {
            ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
            Video video=(Video) applicationContext.getBean("video");
            System.out.println(video);
            ((ClassPathXmlApplicationContext)applicationContext).registerShutdownHook();
        }
    }

    验证

  • 相关阅读:
    Func,Action 的介绍及其用法
    创建自定义Windows phone 样式(二)mango下的实现
    今天五一休息
    关于地震
    第一步
    心绪不佳
    真的无语
    购物,生活
    一周结束
    who怕who
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/13304153.html
Copyright © 2011-2022 走看看