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;同时…

求输入N段整数范围的素数之和。

求输入N段整数范围的素数之和。 可参考&#xff1a; 输入任意两个正整数a、b&#xff08;a&#xff1c;b&#xff09;&#xff0c;求[a,b]之间的所有素数和。-CSDN博客 题干求输入N段整数范围的素数之和。 若输入&#xff1a; 3 11 18 5 10 3 7 则计算[11 18]之间的素数…

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

最近&#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…

.a文件和.so文件

C 中的 .a 文件和 .so 文件是两种不同类型的库文件&#xff0c;它们有以下区别&#xff1a; .a 文件&#xff08;静态库文件&#xff09;&#xff1a; 静态库文件是编译时链接的库&#xff0c;它将所有需要的函数和符号都打包在一个文件中。在编译时&#xff0c;编译器将静态…

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…

Linux下 Mysql数据备份脚本

Linux下 Mysql数据备份脚本 #!/bin/bash # 日期格式 DATE$(date %Y%m%d) # 备份目录 BACKUP_DIR"/usr/local/mysql-5.7/backup" # MySQL连接配置 DB_USER"root" DB_PASSWORD"root" DB_NAME"web_bushu" # 备份文件名 BACKUP_FILE&qu…

认识.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…

微信小程序开发-----发起网络请求携带后端token

在开发的时候我们前后端一般会有一个token作为安全保护&#xff0c;当后端接收到用户的登录请求&#xff0c;后端就会发送一个token给用户&#xff0c;此时前端必须要将token保存下来&#xff0c;在每次发起网络请求的时候在header请求头里携带token,下面呢就教大家如何在微信小…

linux硬盘扩容

lsblk fdisk /dev/vda m n&#xff08;如果挂载不成功&#xff0c;则w&#xff09; p partprobe pvcreate /dev/vda3 vgscan vgextend centos /dev/vda3 (注意&#xff0c;centos-home需要根据实际情况进行调整) lvextend -L 99G /dev/mapper/centos-root xfs_growfs…

4 svelte 组件之间传值(属性)

官方网站中介绍到&#xff1a;在任何实际的应用程序中&#xff0c;都需要将数据从一个组件向下传递给它的子组件。为此&#xff0c;我们需要声明属性&#xff0c;通常简称为“props”。在Svelte中&#xff0c;我们使用export关键字来完成此操作。 1 传值 app.svelte: <sc…

webpack配置全局scss

webpack配置全局scss 效果&#xff1a;a.vue使用index.scss中定义的$mainWidth就无需 import "xxxxxxx/index.scss"文件 src/assets/styles/index.scss $mainWidth: 1280px; $red: red src/views/a.vue .aaa {color: $red; } vue.config.js module.exports {…

Ajax技术

目录 一.Ajax简介 1.特点 2.发送请求的方式 3.简介 二.Ajax引入 1.案例 后端&#xff1a; html前端&#xff1a; 2.小结 &#xff08;1&#xff09;基本语法 &#xff08;2&#xff09;注意 &#xff08;3&#xff09;HttpResponse解决方式 一.Ajax简介 1.特点 异…

【开源】基于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.可以省…

R语言——taxize(第三部分)

taxize&#xff08;第三部分&#xff09; 3.39. get_wiki&#xff08;获取维基分类群的页面名称&#xff09;3.40. get_wormsid&#xff08;获取分类群名称的Worms ID&#xff09;3.41. gni_details&#xff08;使用Global Names Index搜索分类学名称详情&#xff09;3.42. gni…

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

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