最新要闻
- 【环球快播报】茅台董事长丁雄军:买不到茅台还吃不起冰激凌吗?
- 小米12S Ultra官网缺货!卢伟冰推荐小米13 Pro:影像也非常强
- 环球快讯:过去10年 全国130多个县第一次通上铁路
- 环球热门:2.5亿年前 96%的物种突然消失!中国学者有了重大发现
- 精彩看点:还在用20世纪90年代的破系统!美国航空巨头8天赔掉50个亿
- 焦点热文:小米13 Pro把单反相机技术塞入手机里!雷军:效果惊艳
- AMD三颗新U齐发!锐龙9 7900、锐龙7 7700、锐龙5 7600图赏
- 暴雪国服代理谈判被曝进入"二选一"阶段:手游版权开发分成是核心
- 报道:SpaceX猎鹰重型火箭再次发射美军卫星:能抗核打击
- 苹果中国官网上线智能家居板块:一个LED灯泡卖168元 贵吗?
- 世界实时:《三体》电视剧过审上微博热搜 网友:只求别魔改!
- 环球今日报丨去意已决?巴菲特再度减持比亚迪
- 全球快消息!真爱粉!苏州加油为抢一加11首发跑到上海:对新品非常期待
- 全球即时看!又一豪华巨头败走中国 官网关停!长安终于可以独享车标了
- 环球新消息丨广告又来?Win11将在文件管理器显示“推荐内容”
- AMD锐龙7000新U不讲武德:编号更高 频率反而更低
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Spring IOC官方文档学习笔记(八)之容器扩展点
(资料图)
1.通过BeanPostProcessor来自定义bean
(1) BeanPostProcessor用于在容器完成了对bean的实例化,配置及初始化后来实现一些自定义逻辑,它是用于操纵由容器创建的每个bean实例的,即在容器实例化了一个bean后以及该bean的初始化回调(如InitializingBean.afterPropertiesSet()等)被执行之前,会将这个bean交由BeanPostProcessor来进行处理。通过BeanPostProcessor,我们可以对bean实例进行任何操作,包括忽略掉初始化回调等,BeanPostProcessor通常用来检查回调接口,或用来生成某个bean的代理对象,因此一些Spring AOP的基础类就被实现为BeanPostProcessor实例,以提供代理对象,如下是简单使用BeanPostProcessor的一个例子
//让ExampleA实现3个初始化回调public class ExampleA implements InitializingBean { private String name; public ExampleA() { System.out.println("ExampleA的构造方法被调用"); System.out.println("----------------------------------------"); } //这个方法只用于IOC的属性注入 public void setName(String name) { System.out.println("IOC对ExampleA的name属性进行注入,值为:" + name); System.out.println("----------------------------------------"); this.name = name; } //这个方法用于我们自己手动注入 public void setNameInOtherWay(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "ExampleA{" + "name="" + name + "\"" + "}"; } @PostConstruct public void postConstruct() { System.out.println("正在执行初始化回调PostConstruct,此时的ExampleA为:" + this); this.setNameInOtherWay("zzz2"); System.out.println("执行完毕,此时的ExampleA为:" + this); System.out.println("----------------------------------------"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("正在执行初始化回调InitializingBean.afterPropertiesSet,此时的ExampleA为:" + this); this.setNameInOtherWay("zzz3"); System.out.println("执行完毕,此时的ExampleA为:" + this); System.out.println("----------------------------------------"); } public void init() { System.out.println("正在执行初始化回调init-method,此时的ExampleA为:" + this); this.setNameInOtherWay("zzz4"); System.out.println("执行完毕,此时的ExampleA为:" + this); System.out.println("----------------------------------------"); }}//实现BeanPostProcessor,自定义后置处理器来操纵bean实例(注意:需要把我们的自定义处理器注入到容器中),它主要提供了2个方法public class Processor implements BeanPostProcessor { /** * 该方法作用于bean实例创建配置好后,初始化回调执行前,来自定义一些逻辑 * @param bean 实例化并配置好后的bean * @param beanName bean的名称 * @return 自定义操作完成后的bean * @throws BeansException */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("正在执行postProcessBeforeInitialization,此时的ExampleA为:" + bean); ((ExampleA) bean).setNameInOtherWay("zzz1"); System.out.println("执行完毕,此时的ExampleA为:" + bean); System.out.println("----------------------------------------"); return bean; } /** * 该方法作用于初始化回调执行后 */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("正在执行postProcessAfterInitialization,此时的ExampleA为:" + bean); ((ExampleA) bean).setNameInOtherWay("zzz5"); System.out.println("执行完毕,此时的ExampleA为:" + bean); System.out.println("----------------------------------------"); return bean; }} //启动容器后,打印结果为ExampleA的构造方法被调用----------------------------------------IOC对ExampleA的name属性进行注入,值为:zzz----------------------------------------正在执行postProcessBeforeInitialization,此时的ExampleA为:ExampleA{name="zzz"}执行完毕,此时的ExampleA为:ExampleA{name="zzz1"}----------------------------------------正在执行初始化回调PostConstruct,此时的ExampleA为:ExampleA{name="zzz1"}执行完毕,此时的ExampleA为:ExampleA{name="zzz2"}----------------------------------------正在执行初始化回调InitializingBean.afterPropertiesSet,此时的ExampleA为:ExampleA{name="zzz2"}执行完毕,此时的ExampleA为:ExampleA{name="zzz3"}----------------------------------------正在执行初始化回调init-method,此时的ExampleA为:ExampleA{name="zzz3"}执行完毕,此时的ExampleA为:ExampleA{name="zzz4"}----------------------------------------正在执行postProcessAfterInitialization,此时的ExampleA为:ExampleA{name="zzz4"}执行完毕,此时的ExampleA为:ExampleA{name="zzz5"}----------------------------------------
综上可见,添加了BeanPostProcessor后,bean的初始化流程为:执行bean的构造函数 -> IOC进行属性注入 -> BeanPostProcessor.postProcessBeforeInitialization -> 三大初始化回调 -> BeanPostProcessor.postProcessAfterInitialization
(2) 我们可以向容器中注入多个自定义BeanPostProcessor,并通过实现Ordered接口来控制这些BeanPostProcessor的执行顺序,如下所示
public class ExampleA { }//让该自定义后置处理器实现Ordered接口,指定它在所有自定义后置处理器中的执行顺序public class Processor0 implements BeanPostProcessor, Ordered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Order值为0的postProcessBeforeInitialization执行..."); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Order值为0的postProcessAfterInitialization执行..."); return bean; } @Override public int getOrder() { return 0; }}public class Processor1 implements BeanPostProcessor, Ordered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Order值为1的postProcessBeforeInitialization执行..."); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Order值为1的postProcessAfterInitialization执行..."); return bean; } @Override public int getOrder() { return 1; }} //启动容器,输出如下Order值为0的postProcessBeforeInitialization执行...Order值为1的postProcessBeforeInitialization执行...Order值为0的postProcessAfterInitialization执行...Order值为1的postProcessAfterInitialization执行...
由上可见,getOrder返回值越小,自定义的后置处理器就越先执行
(3) 在一个容器中注入了一个BeanPostProcessor,那么该BeanPostProcessor仅对该容器中的bean进行后置处理,例如,即父容器中的BeanPostProcessor不会作用于子容器中的bean
(4) BeanPostProcessor作用于bean实例化并配置好了之后,换句话说,在BeanPostProcessor起作用时,bean实例已经存在了,因此,如果我们想要修改bean的配置元数据(即BeanDefinition,此时的bean还未被创建),则需要实现BeanFactoryPostProcessor接口,它与BeanPostProcessor类似,只不过作用时机不同
未完待续...
-
Spring IOC官方文档学习笔记(八)之容器扩展点
1 通过BeanPostProcessor来自定义bean(1)BeanPostProcessor用于在容器完成了对bean的实例化,配置及初...
来源: Spring IOC官方文档学习笔记(八)之容器扩展点
HTML超文本标记语言4
【环球快播报】茅台董事长丁雄军:买不到茅台还吃不起冰激凌吗?
小米12S Ultra官网缺货!卢伟冰推荐小米13 Pro:影像也非常强
环球快讯:过去10年 全国130多个县第一次通上铁路
环球热门:2.5亿年前 96%的物种突然消失!中国学者有了重大发现
精彩看点:还在用20世纪90年代的破系统!美国航空巨头8天赔掉50个亿
ThreadLocal底层原理
焦点热文:小米13 Pro把单反相机技术塞入手机里!雷军:效果惊艳
AMD三颗新U齐发!锐龙9 7900、锐龙7 7700、锐龙5 7600图赏
暴雪国服代理谈判被曝进入"二选一"阶段:手游版权开发分成是核心
报道:SpaceX猎鹰重型火箭再次发射美军卫星:能抗核打击
环球今热点:在QEMU-KVM环境下部署Oracle 19.16 RAC
全球要闻:HTML超文本标记语言3
苹果中国官网上线智能家居板块:一个LED灯泡卖168元 贵吗?
世界实时:《三体》电视剧过审上微博热搜 网友:只求别魔改!
环球今日报丨去意已决?巴菲特再度减持比亚迪
全球快消息!真爱粉!苏州加油为抢一加11首发跑到上海:对新品非常期待
世界观速讯丨C++引用【cherno课程学习】
【天天报资讯】「年终总结」写了 3 年文章的我,昨天第一次露脸直播。
环球今日报丨【前端调试】- 利用 Performance 和 Memory 分析内存
热点!操作系统 — 精髓与设计原理(第一章 计算机系统概述)
世界播报:学习笔记——Mybatis映射文件根标签与子标签
全球即时看!又一豪华巨头败走中国 官网关停!长安终于可以独享车标了
环球新消息丨广告又来?Win11将在文件管理器显示“推荐内容”
AMD锐龙7000新U不讲武德:编号更高 频率反而更低
车企"英文+数字"的新车命名规则被吐槽无趣 不如中文
外星人M18首发!京东方推出18英寸480Hz笔记本屏
全球热议:java不同版本jdk切换
每日焦点!读博初始心境-求讨论
前沿热点:抖音2023年春节红包来了:分4亿 最高可得万元奖金
环球快看点丨彻底终结充电焦虑?韩国SK On新技术:汽车电池18分钟充满
世界微资讯!电竞手机要消亡!卢伟冰:有了Redmi K60就不需要电竞手机
国内演员指责电视收费乱象:大几千买的电视看不了 打开全要收费
NAT类型检测方案
世界热议:学习笔记——Mybatis核心配置文件概述及根标签
VisualStudio 使用 FastTunnel 辅助搭建远程调试环境
世界观焦点:“外星科技”加持!Redmi 12C支持双SIM卡+TF卡拓展:699元起
搜狐张朝阳谈工作意义:年轻人赚钱享乐的想法不对
同步小米13 Ultra!小米平板6/6 Pro来了:处理器、屏幕大升级
今晚20点整:京东年货红包重磅加码 最高9999元
360Hz超高刷也白菜价了 泰坦军团1ms电竞显示器到手1629元
火山引擎 DataTester:5 个优化思路,构建高性能 A/B 实验平台
环球新资讯:对话阿里云叔同:如何看待 2022 年云原生的发展,2023 年有哪些值得关注的技术?
全球新动态:字符串匹配算法综述
新资讯:网易云音乐用户画像资产治理及业务赋能
每日热议![概率论与数理统计]笔记:3.1 随机向量的分布
环球短讯!俄罗斯开发者1年拿不到钱!好好的微星AfterBurner被一场战争害死
盘点CES上让人耳目一新的小玩意:极具创意
参与美国“阿尔忒弥斯计划” 日本人将首次登陆月球:日期未定
2499元起 Redmi K60成了:京东好评率比iPhone 14更高
新动态:你能接受不?奔驰Smart精灵#1开启硬件订阅:座椅加热1299元
环球播报:软件开发入门教程网之C++ 引用
[笔记]斜率优化
HTML超文本标记语言2
时讯:股价暴跌后!特斯拉最大华裔散户天天“炮轰”马斯克
环球今热点:手慢真无了 码已不全!森马羽绒/棉服大促:一百多到手
世界热讯:美菱推出“杀新冠冰箱”:灭杀率高达99.9% 已过权威认证
全球时讯:PS5主机应该横放还是竖放引热议 索尼:都可以
热点评!配第四代i-MMD 东风本田新款英仕派e:HEV官图发布:真大号思域
世界视点!【操作系统实验/Golang】实验4:虚拟内存页面置换算法
世界时讯:Python工具箱系列(二十二)
初识Vue
环球消息!ACWING 4261. 孤独的照片
外观复刻iPhone 14 Pro!乐视手机S1 Pro标配8+128GB存储:自称5G小霸王
当前讯息:一加8钉子户上车一加11:真正上手那一刻被惊艳到了
每日消息!一加11成为最火爆的第二代骁龙8旗舰!李杰:友商都可以去查
NVIDIA推出第5代MAX-Q技术:游戏本性能进一步提升
女子买200万豪车 亲友400箱礼花庆贺 整条街道都摆满了
当前热议!无监控,不运维!深入浅出介绍ChengYing监控设计和使用
学习笔记——在IDEA中创建Maven版的web工程;框架;Mybatis简介;搭建Mybatis框架步骤
每日热议!成功率100%!中国民营火箭谷神星一号五连胜:一箭五星
今日热闻!33岁男子酗酒20年骨头坏死:13岁开始喝、每天至少半斤
动画版口碑崩盘 《三体》国产剧版过审获许可证 最快本月上线腾讯视频
世界速递!特斯拉最大散户投资者成马斯克头号反对者:连续多日公开炮轰
关注:一步一步实现若依框架--2.2实现后台限流rate_limiter
最资讯丨ACWING 4645. 选数异或
天天要闻:全球第四大汽车制造商CEO:欧洲中产阶级将选购中国汽车
清华应届硕士炮轰字节恶意低薪:月薪2万 硕士白读还倒贴
世界快看:面试官:数据库日期类型字段,需要兼容不同数据库,应该如何选择?
今日最新!ThreadLocal源码解析及实战应用
交换机二层组播配置
管理工具造成的阻塞
前沿热点:国产战机大片!电影《长空之王》定档:今年五一上映
杭州外来人口占3成 河南人数比肩本地土著 原来有历史原因
小米13系列大卖、汽车售价可达35万以上 小米高端成了:股价大涨
采埃孚新安全带:不用开空调 可提升电动车15%续航
焦点速读:3999元起 一加11首销51分钟打破所有二代骁龙8销量、销售额双记录
家用光纤宽带多少兆合适?家用光纤怎么接路由器?
招财猫的原型是什么猫?招财猫左手右手分别代表什么?
修正液的成分是什么?修正液的性质有哪些?
丁克家族是什么意思?丁克家庭的好处和坏处有哪些?
纪宝贝是什么电视剧的角色?纪宝贝是什么品种的狗?
印度首家旗舰店来了?传苹果(AAPL.US)开始招聘零售店员工
年终盘点丨最受开发者欢迎的文章 TOP20
天天快报!华硕ROG首款DP2.1接口显示器发布:无压缩4K 160Hz画质
世界热讯:车主激烈维权上演0元购!特斯拉成都门店否认:都是理性维权
重达2.4吨!美国40年前发射卫星今日坠落地球:或为朝鲜半岛
行业最低!一加Buds Pro 2首销899元:全链路延时仅54ms
【全球独家】腾讯发布未成年人春节寒假限玩通知:春节7天全开 工作日继续禁玩