Java Spring后处理器

news2024/9/25 11:16:32

Java Spring后处理器

在Spring框架中,交给Spring管理的类信息都会被Spring底层自动加载被封装成对应的BeanDefinition对象存储在beanDefinitionMap的Map集合中去,那么除了直接将类信息配置的方式外,还有别的方式可以对想要交给Spring管理的类进行针对性处理封装,这里就可以使用到Spring的后处理器。

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


Spring的后处理器分为两类:BeanFactoryPostProcessorBeanPostProcessor

  • BeanFactoryPostProcessor:Bean工厂后处理器,在BeanDefinitionMap填充完毕,Bean实例化之前执行
  • BeanPostProcessor:Bean后处理器,一般在Bean实例化之后,填充到单例池singletonObjects之前执行

Bean实例化链接:Bean的实例化

在这里插入图片描述


BeanFactoryPostProcessor样例:

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("beanDefinitionMap填充完毕后,Spring容器回调此方法");

        //功能一:修改BeanDefinition的信息
        //根据BeanName获取封装的BeanDefinition对象
        BeanDefinition myClass= configurableListableBeanFactory.getBeanDefinition("myClass");
        myClass.setBeanClassName("com.test.MyClassChange");

        //功能二:注册BeanDefinition到beandDefinitionMap中
        //设置BeanDefinition的Bean信息
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
        rootBeanDefinition.setBeanClassName("com.test.MyClassNew");
        //进行BeanDefinition注册
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;
        defaultListableBeanFactory.registerBeanDefinition("myClassNew",rootBeanDefinition);

    }
}

FactoryBeanProcessor工厂后处理,可以 修改 beanBeanDefintionMap中注册的BeanBeanDefintion内容或者 新注册 BeanBeanDefintion到beanBeanDefintionMap中去,注册功能可以理解注解的实现,工厂后处理器去遍历带上注解的类,让后将其进行注册

BeanFactoryPostProcessor类似注解实现样例:

public class MyComponentBeanFactoryPostPocessor implements BeanDefinitionRegistryPostProcessor {
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        // 通过扫描工具去扫描指定包及其子包下的所有类,收集使用@MyComponent的注解的类
        Map<String, Class> myComponentAnnotationMap = BaseClassScanUtils.scanMyComponentAnnotation("com.test");
        // 遍历Map,组装BeanDefinition对象
        Iterator<String> iterator = myComponentAnnotationMap.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            String className = myComponentAnnotationMap.get(key).getName();
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
            //获取待注册的类名
            rootBeanDefinition.setBeanClassName(className);
            //进行BeanDefinition注册
            beanDefinitionRegistry.registerBeanDefinition(key, rootBeanDefinition);
            System.out.println("工厂后处理器注册了" + key + "对象");
        }
    }

    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}

注册的时候可以用专用子接口BeanDefinitionRegistryPostProcessor去注册,此接口在BeanFactoryPostProcessor之前执行


BeanPostProcessor样例:

public class MyBeanPostProcessor implements BeanPostProcessor {

	//在init方法执行之前执行
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + ":postProcessBeforeInitialization");
            //判断Bean的实例类型
	        if(bean instanceof MyClass){
            MyClass myClass= (MyClass) bean;
            //MyClass中有个String属性attribute,在此处可以注入值
            myClass.setAttribute("setAttribute");
        }
        return null;
    }
    
	//在init方法执行之后执行
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + ":postProcessAfterInitialization");
        return null;
    }
}

BeanPostProcessor可以修改Bean的内容,先创建Bean的构造方法,再执行postProcessBeforeInitialization方法、执行Bean的其他方法(init初始化方法等)、最后执行postProcessAfterInitialization方法

Spring的AOP代理增强就是基于此后处理的原理进行实现,可以在Bean实例中进行切面的织入

AOP博客链接:AOP博客链接

代理博客链接:代理博客链接

BeanFactoryPostProcessor类似AOP实现样例:

public class myAopBeanPostProcessor implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return null;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        // 使用动态代理,对目标Bean进行增强,返回proxy对象,进而存储到单例池singletonObjects中
        Object beanProxy = Proxy.newProxyInstance(
                bean.getClass().getClassLoader(),
                bean.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    //1、前置增强
                    System.out.println("方法:" + method.getName() + "-开始时间:" + new Date());
                    //2、执行目标方法
                    Object result = method.invoke(bean, args);
                    //3、后置增强
                    System.out.println("方法:" + method.getName() + "-结束时间:" + new Date());

                    return result;
                }
        );

        return beanProxy;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matlab在管理学中的应用简matlab基础【二】

1、MATLAB语言概述 1.1 MATLAB语言的发展 matlab语言是由美国的Clever Moler博士于1980年开发的 MATLAB Matrix Laboratory 它将一个优秀软件的易用性与可靠性、通用性与专业性 、一般目的的应用与高深的科学技术应用有机的结合 MATLAB是一种直译式的高级语言&#xff0c;比…

【安装Ubuntu18.04遇到的问题】未找到WIFI适配器

大家好&#xff0c;我是小政。好久没有更新文章&#xff0c;近期开始陆续分享一些研究生阶段正在学习的知识和遇到的一些问题。 联想拯救者Y9000P关于安装Ubuntu未找到WIFI适配器的解决方法1.Ubuntu18.042.网卡信息3.解决方法&#xff08;1&#xff09;用手机USB连接电脑提供网…

如何判断对象是否该被回收(引用计数法、可达性分析算法)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; JVM &#x1f308; 算法类型&#xff1a;Hot100题 &#x1f30…

计算机的应用领域

文章目录计算机的应用领域1、商业2、银行业3、保险行业4、教育行业5、市场营销6、卫生保健7、工程设计8、军事9、通讯10、政府计算机的应用领域 本节&#xff0c;我将带领您了解计算机在各个领域的应用。 1、商业 计算机的功能丰富&#xff0c;极高的计算能力&#xff0c;计…

sqli-labs/Less-56

这一关的欢迎界面提示我们还是以id作为注入点 我们仍然有14次尝试机会 首先我们还是先来判断一下是否属于数字型注入 输入如下 id1 and 12 回显如下 正确回显 属于字符型 接着输入1 查看回显 这个回显说明两件事情 一个是我们后面不能使用报错注入进行注入了 一个是我们这个…

Elasticsearch:使用反向地理编码在地图上显示自定义区域统计数据

在实际的许多应用中&#xff0c;我们可能并不一定按照行政区来进行划分区域&#xff0c;比如我们常说江浙一代&#xff0c;我们可以理解江苏和浙江这两个省合在一起&#xff0c;而不是把它们分开。我们有时也说长江三角区&#xff0c;它可能是跨几个省市的一个区域&#xff0c;…

每隔一段时间自动敲键盘的的vbs脚本

1. 上代码 set wscreateobject("wscript.shell") do ws.sendkeys "{TAB}" WScript.Sleep Int(6 *Rnd1)*1000 loop2. 代码解释 每隔1~6秒,按一次TAB键 2.1 循环执行操作代码 do ....操作..... loop2.2 按下Tab键 ws.sendkeys "{TAB}" 即…

HTML5期末大作业商城网页设计与实:(手表 3页)HTML+CSS

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#…

python中字典的循环遍历的方式

python开发中经常会用到对于字典、列表等数据的循环遍历&#xff0c;但是python中对于字典的遍历对于很多初学者来讲非常陌生&#xff0c;今天就来讲一下python中字典的循环遍历的两种方式。 注意&#xff1a; python2和python3中&#xff0c;下面两种方法都是通用的。 1、只…

两种数据提取框架的比较(scrapy和webmagic)

背景&#xff1a; 最近北京疫情有点严重&#xff0c;状态是居家办公&#xff0c;又是买菜做饭又是核酸检测心情是无比的烦躁还总是会议&#xff0c;无需发言的会议就边听边写写csdn记录一下。这几天在用Java写一个数据抓取的程序&#xff0c;用于数据分析等等。第一是因为原项目…

十二、虚拟 DOM 和 render() 函数(2)

本章概要 用普通 JavaScript 代替模板功能 v-if 和 v-forv-modelv-on事件和按键修饰符插槽 JSX实例&#xff1a;帖子列表 12.3 用普通 JavaScript 代替模板功能 原先在模板中可以使用的一些功能在 render() 函数中没有再提供&#xff0c;需要自己编写 JavaScript 代码来实现…

docker-Cgroups的资源限制

一、Cgroup的介绍 cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被namespace 隔离起来的资源&#xff0c;还可以 为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。 cpu时间片的概念 …

atoi函数的介绍和模拟实现

今天我来介绍atoi函数和模拟实现atoi函数。 目录atoi和与其功能相似的函数的介绍atoi函数的模拟实现atoi和与其功能相似的函数的介绍 atoi函数是一个将字符串转换为整数值的函数。 由msdn查询可以得知&#xff0c;atoi函数的返回类型是int类型&#xff0c;参数类型是const ch…

用于不同功率的模块式TEC半导体致冷器超高精度温度控制装置

摘要&#xff1a;针对目前TEC半导体制冷器温控装置对高精度、模块化、可编程和远程控制等方面的技术需求&#xff0c;本文提出了一种高性价比的解决方案。解决方案的具体内容是采用模块式结构&#xff0c;以24位AD和16位DA超高精度PID控制器作为基础单元&#xff0c;采用分立模…

不调参,免训练,VisionBank AI OCR新功能升级上线!

应用背景 OCR字符识别&#xff0c;是指对部件或产品上刻印的字符进行确认、辨别、判定的检测识别。此项技术目前已广泛应用于工业自动化生产的产品质量管理环节当中&#xff0c;企业通过为机器视觉检测设备安装OCR系统&#xff0c;快速完成对产品生产日期、保质期、生产批号、…

红色荧光TAMRA alkyne 5-isomer,945928-17-6,5四甲基罗丹明-炔基

TAMRA alkyne,5-isomer反应原理&#xff1a; 红色荧光四甲基罗丹明炔烃可通过铜催化的点击反应与叠氮化合物反应。点击化学的代表反应为铜催化的叠氮-炔基Husigen环加成反应&#xff08;Copper-Catalyzed Azide–Alkyne Cycloaddition&#xff09;。点击化学的概念对化学合成领…

线性二分类——机器学习

目录 一、算法思想 二、算法原理 三、算法分析 四、源程序代码 五、运行结果及分析 六、总结 一、算法思想 &#xff08;1&#xff09;二分类:表示分类任务有两个类别&#xff0c;比如我们想识别图片中是不是狗&#xff0c;也就是说&#xff0c;训练一个分类器&#xff0c;…

如何使用云服务器搭配宝塔面板搭建Z-blog个人博客系统

之前写过使用过WordPress和Typecho搭建个人博客网站的方法&#xff0c;这篇文章将使用Z-blog搭建个人博客系统&#xff0c;Z-blog相当于WordPress而言&#xff0c;更加小巧&#xff0c;但是依然有着强大的功能&#xff0c;以及丰富的主题和插件&#xff0c;因此也值得很多用户选…

数字图像处理均衡化、规定化例题及解题思路

目录 均衡化 规定化 均衡化 前置知识&#xff1a; rk:表示灰度级 nk:表示第k个灰度级出现的个数 sk:表示用变换函数公式计算映射后的灰度级sk 变换函数公式&#xff1a; 例题&#xff1a; 1.列表写出图像直方图均衡化的过程 2.画出均衡化以后的图像 3.画出原始图像直方图…

如何给PDF解密?建议收藏这些方法

我们在传输接收文件的时候&#xff0c;经常都是以PDF格式进行的&#xff0c;因为PDF格式具有很强的稳定性。那小伙伴们平时接收的时候&#xff0c;会不会发现有些PDF文件为了保密性会进行加密&#xff0c;如果我们经常需要使用它&#xff0c;就需要不断地输入密码&#xff0c;这…