zoukankan      html  css  js  c++  java
  • Spring BeanPostProcessor

     BeanPostProcessor允许在调用初始化方法前后对 Bean 进行额外的处理。

    BeanPostProcessor源码

    public interface BeanPostProcessor {
    
        Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    
    
        Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
    
    }

    BeanPostProcessor定义了两个方法postProcessBeforeInitialization(Object bean, String beanName) 与 postProcessAfterInitialization(Object bean, String beanName)。bean为需要操作的bean对象,beanName为该对象的名字。

    执行顺序

    postProcessorBeforeInitailization() 方法是在bean实例化,依赖注入之后调用,初始化方法之前。

    postProcessorAfterInitailization()方法是初始化方法之后调用。

    如示例

    public class HelloSpring {
    
        public HelloSpring() {System.out.println("HelloSpring Constructor");}
    
        private String message;
        public void setMessage(String message) {
            this.message = message;
            System.out.println("Message was injected");
            }
        public String getMessage() {return message;}
    
        // 初始化方法
        public void init() {System.out.println("Bean is going through inti");}
    }

    BeanPostProcessor实现

    public class InitHelloSpring implements BeanPostProcessor{
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("Before initialization: " + beanName);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("After initialization: " + beanName);
            return bean;
        }
    }
    public class MainApp {
    
        public static void main(String[] args) {
            AbstractApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
        }
    }

    执行结果如下:

    // bean的实例化与依赖注入
    HelloSpring Constructor
    Message was injected
    
    // 执行postProcessorBeforeInitailization() 方法
    Before initialization: helloSpring
    
    // 执行bean的初始化方法
    Bean is going through inti
    
    // 执行postProcessorAfterInitailization()方法
    After initialization: helloSpring

    postProcessBeforeInitialization() 与 postProcessAfterInitialization()方法的返回值

    这两个方法返回一个Object对象,该对象会更新Spring容器其中原有的bean。

    如上例中,Spring容器中注入的是HelloSpring类型的bean,bean的名字为helloSpring,如果 postProcessBeforeInitialization() 与 postProcessAfterInitialization()返回的不是原有的bean,则原有的会被替换。

        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("Before initialization: " + beanName);
            return new Object();
        }

    postProcessBeforeInitialization() 方法返回的是Object对象,该对象则会取代Spring容器中名为helloSpring的bean。

        public static void main(String[] args) {
    
            AbstractApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
            Object obj = context.getBean("helloSpring");
            System.out.println(obj instanceof HelloSpring);
        }

    执行结果为false。

  • 相关阅读:
    Android 9.0版本及以上开发时遇到的一些版本问题
    【经典】半平面交求解方程组——poj1755
    【模板】凸包向内推进求不严格的半平面交——poj3384
    二分+半平面交——poj1279
    AngularJS 启程
    全栈工程师--这才是真正的从入门到跑路
    数据库学习路线-从入门到入土
    java学习路线-从入门到入土
    前端路线-从入门到入土
    前端小练习
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/11028687.html
Copyright © 2011-2022 走看看