当前位置: 首页 > article >正文

Spring的后处理器

目录

引言

BeanFactoryPostProcessor

注意 

 BeanPostProcessor


引言

Spring的后处理器是spring对外开发的重要扩展点,允许我们介入到Bean的整个实例化流程来,以达到动态注册BeanDefintion,动态修改BeanDefintion,以及动态修改Bean的作用。

Spring主要有两种后处理器:

  • BeanFactoryPostProcessor:Bean工厂后处理器,BeanDefintionMap填充完毕,Bean实例化之前执行;

  • BeanPostProcessor:Bean后处理器,一般在Bean实例化之后,填充单例池singletonObjects之前执行

BeanFactoryPostProcessor

 BeanFactoryPostProcessor是一个接口规范,实现该接口的类只要交由Spring容器管理的话,那么Spring就会回调该接口的方法,用于对BeanDefinition注册和修改的功能

 完善Bean实例化图

package com.xfy.processor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;

public class MyBeanFactorypostprocessor implements BeanFactoryPostProcessor {
    public void postProcessBeanFactory(ConfigurableListableBeanFactory BeanFactory) throws BeansException {
        System.out.println("pPBF");
        //修改某个BeanDifinition的全限定名,将某个Bean的类型改变
        BeanDefinition userDao = BeanFactory.getBeanDefinition("userDao");
        userDao.setBeanClassName("com.xfy.service.impl.UserServiceImpl");
        //动态的去注册一个BeanDefinition
        BeanDefinition BeanDefinition = new RootBeanDefinition();
        BeanDefinition.setBeanClassName("com.xfy.dao.Impl.PersonDaoImpl");
        DefaultListableBeanFactory DBeanFactory= (DefaultListableBeanFactory) BeanFactory;
        DBeanFactory.registerBeanDefinition("personDao",BeanDefinition);

    }
}

<bean class="com.xfy.processor.MyBeanFactorypostprocessor"></bean>
注意 

Spring提供了一个BeanFactoryPostProcessor的子接口DBeanFactoryRegisterPostProcessor专门用于注册BeanDefintion操作    如下代码

package com.xfy.processor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;

public class MyBeanFactorypostRegistryprocessor implements BeanDefinitionRegistryPostProcessor {
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        RootBeanDefinition beanDefinition = new RootBeanDefinition("com.xfy.dao.Impl.PersonDaoImpl");
        beanDefinitionRegistry.registerBeanDefinition("personDao",beanDefinition);

    }

    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}

 BeanPostProcessor

Bean被实例化后,到最终缓存到名为singletonObjects单例池之前,中间会经过Bean的初始化过程,例如:属性填充,初始化方法init的执行等,其中有一个对外进行扩展的点BeanPostProcessor。我们称为Bean后处理器,跟上面的Bean工厂后处理器相似,他也是一个接口,实现该接口并被容器管理的BeanPostProcessor,会在流程节点上被Spring自动调用

完善Bean实例化流程图

代码实现对Bean的属性赋值如下:

package com.xfy.processor;

import com.xfy.anno.MyComponent;
import com.xfy.dao.Impl.UserDaoImpl;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
@MyComponent("mbpp")
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof UserDaoImpl){
            UserDaoImpl userDao= (UserDaoImpl) bean;
            userDao.setName("haohao");
        }
        System.out.println(beanName+"                         postProcessBeforeInitialization");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"                          postProcessAfterInitialization");
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}


http://www.kler.cn/a/137163.html

相关文章:

  • ChatGPT生成接口文档的方法与实践
  • Vue3之状态管理Vuex
  • JavaWeb期末复习(习题)
  • Redis常见阻塞原因总结
  • 基于MATLAB的图像增强
  • 启用WSL后,使用ssh通道连接ubuntu
  • MeterSphere | 在接口自动化场景中,设置全局Token方法
  • LVS+keepalived——高可用集群
  • [Vue warn]: Extraneous non-props attributes (class)
  • linux进程间通信之消息队列
  • 操作系统基础操作
  • Gem5系统仿真模拟器之创建gem5——翻译自官网
  • MYSQL进阶——存储引擎
  • 【Python入门教程】OpenCV在图片/视频上添加Logo(水印)
  • 云ES容灾方案
  • “茶叶创新:爆改营销策略,三个月狂销2300万“
  • 酒店品牌纷纷冲击中高端,东呈集团能否“快人一步”?
  • “一键导出,高效整理:将之前的部分记录导出!“
  • 如何保障亚马逊多账户的安全,防止关联?
  • 福州大学《嵌入式系统综合设计》实验四:边缘检测
  • Leetcode84(柱状图中最大的矩形)
  • 设计模式-12-策略模式
  • 最新最全系列之Selenium:传入webdriver驱动的新方法 Service()函数;以前的executable_path报警告,即将弃用
  • C/C++杂谈-printf的可变参数机制
  • C# 电脑程序控制电路开关
  • 局域网内Ubuntu上搭建Git服务器