历史文章(累计400+篇文章)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
一款利用人工智能生成模型来合成代码的工具Copilot - 第430篇
SpringBoot配置文件内容加密,实现敏感信息保护 - 第431篇
扩展点系列之SmartInstantiationAwareBeanPostProcessor确定执行哪一个构造方法 - 432篇
扩展点系列之ApplicationContextAwareProcessor普通类获取Spring Bean - 第433篇
扩展点系列之初始化之@PostConstruct、init-method、InitializingBean - 第434篇
SpringBoot/Spring扩展点系列之FactoryBean让你不在懵逼 - 第435篇
悟纤:师傅,你看新闻了吗?最近新闻多多~
师傅:你说的是哪个新闻呢?
悟纤:林志颖父子车祸(2022年7月22日),林志颖伤势:头部脸部受到轻伤,暂无生命危险。
师傅:珍惜当下,意外和明天不知道哪个会先来。
悟纤:还有玄奘寺供奉牌位事件。
师傅:不是不报时候未到,时候一到,一切都报。
悟纤:疫情下,看着一切都正常在运转,实则…
师傅:古话说:达则兼济天下,穷则独善其身。在这个混沌的社会下,独善其身都很乱。
师傅:不管怎么样,都是要强大自身。
导读
SmartInitializingSingleton是spring 4.1中引入的新特效,与InitializingBean的功能类似,都是bean实例化后执行自定义初始化,都是属于spring bean生命周期的增强。但是,SmartInitializingSingleton的定义及触发方式方式上有些区别,它的定义不在当前的bean中(a bean's local construction phase)。
一、SmartInitializingSingleton概述
首先我们对于SmartInitializingSingleton先有一个基本的了解。
1.1 是什么?
InitializingBean 是在每一个bean 初始化完成后调用;多例的情况下每初始化一次就掉用一次。
SmartInitializingSingleton是所有的非延迟的、单例的bean 都初始化后调用,只调用一次。如果是多例的bean实现,不会调用。
说明:
(1)实现SmartInitializingSingleton的bean 要是单例。
(2)在所有非延迟的单例的bean初始化完成后调用。
1.2 接口定义
SmartInitializingSingleton接口中的afterSingletonsInstantiated()方法将会在所有的非惰性单实例Bean初始化完成之后进行回调。可以避免早期初始化的意外副作用。SmartInitializingSingleton可以看作是在所有的Bean初始化完成结束后的InitializingBean接口的替代。
1.3 SmartInitializingSingleton&InitializingBean的区别
(1)SmartInitializingSingleton接口只能作用于非惰性单实例Bean,InitializingBean接口无此要求。
(2)SmartInitializingSingleton接口是在所有非惰性单实例初始化完成之后进行激活回调,InitializingBean接口是在每一个Bean实例初始化完成之后进行激活回调。
1.4 使用场景
主要应用场合就是在所有单例bean 创建完成之后,可以在该回调中做一些事情。
举例说明:
(1)在Ribbon使用SmartInitializingSingleton定制个性化的RestTemplate:
(2)XXL-JOB 中SmartInitializingSingleton 的使用:
xxl-job中, XxlJobSpringExecutor,XxlJobSimpleExecutor 继承自 XxlJobExecutor 同时也实现了SmartInitializingSingleton 接口。
XxlJobSpringExecutor 在 afterSingletonsInstantiated()方法中,完成了提取 @XxlJob 注解标注的方法,用于后续任务的执行。调用父类方法中的start() 方法,初始化netty服务器。
(3)spring 容器中 SmartInitializingSingleton 的使用:
EventListenerMethodProcessor也实现了 SmartInitializingSingleton 接口,主要用于完成@EventListener注解方式的事件监听。
在afterSingletonsInstantiated()方法中处理逻辑与xxl-job 中的类似,都是用于筛选实例中被指定注解修饰的方法。
二、SmartInitializingSingleton的使用
对于SmartInitializingSingleton的使用很简单,只需要实现接口SmartInitializingSingleton即可。
2.1 构建项目
构建一个Spring Boot项目,这里在之前的一个项目spring-boot-applicationcontextinitializer-extend进行编码。
2.2 实现接口SmartInitializingSingleton
实现接口SmartInitializingSingleton:
package com.kfit.config;import org.springframework.beans.factory.SmartInitializingSingleton;import org.springframework.stereotype.Component;@Componentpublic class MySmartInitializingSingleton implements SmartInitializingSingleton { @Override public void afterSingletonsInstantiated() { System.out.println("MySmartInitializingSingleton.afterSingletonsInstantiated"); }}
运行Spring Boot应用,可以看到打印日志:
我就是我,是颜色不一样的烟火。 我就是我,是与众不同的小苹果。
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7



