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");//动态的去注册一个BeanDefinitionBeanDefinition 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 {@Overridepublic 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;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(beanName+"                          postProcessAfterInitialization");return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}
}

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

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

相关文章

怎么实现在微信公众号秒杀商品的功能呢

实现微信公众号秒杀商品的功能&#xff0c;需要结合微信公众平台和后端开发技术。下面将介绍整个实现过程&#xff0c;包括前期准备、开发流程和后期运营等方面。 一、前期准备 确定秒杀商品&#xff1a;选择适合秒杀的商品&#xff0c;要求数量充足、质量良好&#xff0c;同时…

一次性能测试,为啥把我逼疯了?

最近&#xff0c;公司领导让我做下性能方面的竞品对比&#xff0c;作为一个性能测试小白的我&#xff0c;突然接到这样的任务&#xff0c;下意识发出大大的疑问。 整理好心情&#xff0c;内心想着“领导一定是为了考验我&#xff0c;才给我这个任务的”&#xff0c;开始了这一…

electron使用electron-builder macOS windows 打包 签名 更新 上架

项目文件大概目录 1. 安装electron-builder 2. macOS 2.1 创建 Certificates, Identifiers & Profiles Devices 在mac上安装xcode&#xff0c;打开xcode&#xff0c;然后按以下步骤操作。 (1) xcode的菜单栏&#xff1a;xcode > settings。登录apple id。 (2) 登录后…

【操作系统】文件系统之文件共享与文件保护

文章目录 文件共享硬链接软链接 文件保护口令保护加密保护访问控制 文件共享 为了实现文件的共享&#xff0c;引入了“计数器”字段&#xff0c;当一个文件每被一个用户所共享&#xff0c;那么计数器就加一。如果一个用户删除文件&#xff0c;计数器相应的减一。如果计数器为0…

uniapp+vue3使用pinia,安卓端报错白屏

报错内容&#xff1a; reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->at useStore2 (app-service.js:1487:15)at (app-service.js:1714:17)at (app-serv…

认识.NET Aspire:高效构建云原生应用的利器

简介 在几天前的.NET 8发布会上&#xff0c;来自微软的Glenn Condron和David Fowler为我们演示了.NET Aspire&#xff0c;在Visual Studio的帮助下&#xff0c;它展现出了惊人的开发效率。 短短的十分钟内&#xff0c;David现场演示了如何轻松创建了一个具有服务发现&#xf…

Unity模拟薄膜干涉效果

Unity制作薄膜干涉效果&#xff0c;色彩斑斓的黑色石头 大家好&#xff0c;我是阿赵。   这次来做一个模拟薄膜干涉的彩色效果&#xff0c;Shader是使用ASE来连接&#xff0c;也算是ASE做复杂一点的效果的一个例子吧。 一、什么是薄膜干涉 以下解释来源于百度百科&#xff1…

【开源】基于Vue和SpringBoot的微信小程序的音乐平台

项目编号&#xff1a; S 055 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S055&#xff0c;文末获取源码。} 项目编号&#xff1a;S055&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

Oracle(2-4)Naming Method Configuration

文章目录 一、基础知识1、OV of Naming Methods 命名方法的OV2、Five Key Parameters 连接数据库的五个关键参数 二、基础操作1、tnsnames.ora网络名配置 Naming Method Configuration 数据库网络命名配置 目标1&#xff1a; 描述主机命名和本地服务名称解析之间的区别使用Orac…

Java-super

【1】super:指的是&#xff1a; 父类的 【2】super可以修饰属性&#xff0c;可以修饰方法&#xff1b; 在子类的方法中&#xff0c;可以通过 super.属性 super.方法 的方式&#xff0c;显示的去调用父类提供的属性&#xff0c;方法。在通常情况下&#xff0c;super.可以省…

如何利用 AI 写一本书并实现被动收入

如何每个月写一本能赚 5000 美元的书&#xff1f;不少人不知道如何在一周内写作和出版一本书 这里有个教程教你如何利用 AI 写一本书并实现被动收入 [收藏起来以备后用] 推出书友智能写作工具&#xff1a;Bookwiz 不用花几年时间独自写作一本小说&#xff0c;人工智能可以作…

使用activiti部署提示不是 ‘NCName‘ 的有效值

排查发现是整个流程图的&#xff0c;流程名称没有填写 修改之后就可以了

Taro编译警告解决方案:Error: chunk common [mini-css-extract-plugin]

文章目录 1. 背景2. 问题分析3. 解决方案3.1 更新 Taro 版本3.2 更新相关依赖3.3 调整 webpack 配置3.4 检查依赖版本 4. 拓展与分析4.1 拓展4.2 避免不必要的依赖4.3 查阅 Taro GitHub 仓库 5. 总结 &#x1f389;欢迎来到Java学习路线专栏~Taro编译警告解决方案&#xff1a;E…

windows如何查看自己的ip地址

windows如何查看自己的ip地址 1.打开控制面板 2.进入网络和internet 3.进入网络共享中心 4.点击以太网进入网络详情页&#xff0c;或邮件已连接的网络&#xff0c;点击属性 5.查看ipv4地址就是当前机器ip

美容仪器经营小程序商城的作用如何

美容仪器可以包含剃须刀、微针仪、微晶笔等&#xff0c;除了美容美业机构需要外&#xff0c;在家庭中也有不小的需求&#xff0c;对产品经营商家来说除了满足客户线下订购的需求外&#xff0c;还需要线上拓展更广的客群及多场景客户在线消费。 入驻第三方平台是商家们首先考虑…

大数据基础设施搭建 - Kafka(with ZooKeeper)

文章目录 一、简介二、单机部署2.1 上传压缩包2.2 解压压缩包2.3 修改配置文件&#xff08;1&#xff09;配置zookeeper地址&#xff08;2&#xff09;修改kafka运行日志(数据)存储路径 2.4 配置环境变量2.5 启动/关闭2.6 测试&#xff08;1&#xff09;查看当前服务器中的所有…

做外贸要学会分析客户情况

最近在某产品的专业群里询问一款产品&#xff0c;看谁可以做&#xff0c;然后很快就有一个自称是工厂的人加上了我。因为自己本身并不懂这个产品&#xff0c;很多他们发的问题自己都答不上来。我就如实告诉他自己是个新手&#xff0c;可以把你们现在能做的&#xff0c;或者已经…

家庭教育专家:如何创建家庭自主学习环境?

经常听到一些父母这样抱怨&#xff1a;“明明和孩子说好就看20分钟电视&#xff0c;结果到了时间&#xff0c;他死活都不肯关。”“作业还没完成的情况下&#xff0c;孩子还一直抱着手机或者电子产品玩游戏。到了约定时间也不撒手&#xff0c;一直跟你讨价还价。” 其实&#…

最前端|低代码平台轻松设计可视化图表【内含网站资源】

在前端设计中&#xff0c;我们经常需要使用可视化图表来呈现数据和信息。然而&#xff0c;每次都要自己从头开始设计图表未免太过繁琐。为了解决这个问题&#xff0c;我们调研了low code平台上的可视化图表功能。 本篇文章为大家带来以下问题的解答&#xff1a; &#xff08;1&…

接口测试需要验证数据库么?

有的接口会返回很多数据&#xff0c;有的接口可能就返回一个状态码及success之类的消息&#xff0c;这些需要验证数据库么&#xff1f;现在在写一个测试框架&#xff0c;配置接口参数和预期返回值&#xff0c;生成xml文件管理用例&#xff0c;用一个比较方法对预期和返回作比较…