• Spring 后置处理器【1】


    Spring 后置处理器【1】 简单介绍

    一句话:bean 在初始化前或初始化后的瞬间,我自己添加一些业务逻辑

    bean 后置处理器类的内容

    简单代码
    package com.hspedu.spring.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    /**
     * @Author:PigBrother
     * @Date:2022/9/22
     * @Description:ToDo
     */
    
    public class MyBeanPostProcessor implements BeanPostProcessor {
        /**
         * Before : 说明在bean 初始化前被调用
         * @param bean 在ioc 容器中, 我配置的bean 对象
         * @param beanName 在ioc 容器中,bean 的 id
         * @return bean 返回处理后的bean 对象
         * @throws BeansException
         */
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            // 写业务逻辑:在bean 初始化前,修改其一些属性
            System.out.println("postProcessBeforeInitialization() 方法被调用");
            System.out.println("bean = " + bean);
            System.out.println("beanName = " + beanName);
            return bean;
        }
    
        /**
         * after : 说明在bean 初始化后被调用
         * @param bean 在ioc 容器中, 我配置的bean 对象
         * @param beanName 在ioc 容器中,bean 的 id
         * @return bean 返回处理后的bean 对象
         * @throws BeansException
         */
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            // 写业务逻辑:在bean 初始化前,修改其一些属性
            System.out.println("postProcessAfterInitialization() 方法被调用");
            System.out.println("bean = " + bean);
            System.out.println("beanName = " + beanName);
            return bean;
        }
    }
    
    

    代码解读

    • 实现 BeanPostProcessor 接口
    • postProcessBeforeInitialization 和 postProcessAfterInitialization 两个方法
    • 在两个方法中写业务逻辑

    容器配置文件(即xml 文件)

    测试代码

    测试代码
      @Test
        public void beanProcessorTest() {
           ApplicationContext ioc = new ClassPathXmlApplicationContext("beans02.xml");
            House            house = ioc.getBean("house", House.class);
            System.out.println(house);
    
            // 关闭ioc 容器
            ((ClassPathXmlApplicationContext)ioc).close();
    
        }
    

    测试结果

    Spring 后置处理器的简单应用

    将容器内的所有bean的某一个属性的值统一改为另一个值

    有 AOP 的一点影子了

    将大豪宅改成香港豪宅
    package com.hspedu.spring.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    /**
     * @Author:PigBrother
     * @Date:2022/9/22
     * @Description:ToDo
     */
    
    public class MyBeanPostProcessor implements BeanPostProcessor {
        /**
         * Before : 说明在bean 初始化前被调用
         * @param bean 在ioc 容器中, 我配置的bean 对象
         * @param beanName 在ioc 容器中,bean 的 id
         * @return bean 返回处理后的bean 对象
         * @throws BeansException
         */
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            // 写业务逻辑:在bean 初始化前,修改其一些属性
            System.out.println("postProcessBeforeInitialization() 方法被调用; 将所有豪宅改成香港豪宅");
            if (bean instanceof House) {
                House house = (House) bean;
                house.setName("香港豪宅");
            }
            return bean;
        }
    
        /**
         * after : 说明在bean 初始化后被调用
         * @param bean 在ioc 容器中, 我配置的bean 对象
         * @param beanName 在ioc 容器中,bean 的 id
         * @return bean 返回处理后的bean 对象
         * @throws BeansException
         */
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            // 写业务逻辑:在bean 初始化前,修改其一些属性
            System.out.println("postProcessAfterInitialization() 方法被调用");
            System.out.println("bean = " + bean);
            System.out.println("beanName = " + beanName);
            return bean;
        }
    }
    
    
  • 相关阅读:
    天天拍车一面面经(已过)
    《HelloGitHub》第 74 期
    实用调试技巧
    为什么使用Spring Boot?
    【Axure高保真原型】3D柱状图_中继器版
    【数据结构】数据结构知识点总结
    Leetcode 701. 二叉搜索树中的插入操作
    为什么JWT要结合Redis使用
    LeetCode Cookbook 字符串习题 上篇
    [人脸算法]技术方向综述
  • 原文地址:https://www.cnblogs.com/PigBrotherLove/p/16718015.html