SmartInitializingSingleton的作用和原理

简介: SmartInitializingSingleton的作用和原理

SmartInitializingSingleton中只有一个接口afterSingletonsInstantiated(),其作用是是 在spring容器管理的所有单例对象(非懒加载对象)初始化完成之后调用的回调接口。
具体实现如下:

DefaultListableBeanFactory.preInstantiateSingletons(){
    List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
        // Trigger initialization of all non-lazy singleton beans...
        for (String beanName : beanNames) {
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                if (isFactoryBean(beanName)) {
                    Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                    if (bean instanceof FactoryBean) {
                        final FactoryBean<?> factory = (FactoryBean<?>) bean;
                        boolean isEagerInit;
                        if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                            isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
                                            ((SmartFactoryBean<?>) factory)::isEagerInit,
                                    getAccessControlContext());
                        }
                        else {
                            isEagerInit = (factory instanceof SmartFactoryBean &&
                                    ((SmartFactoryBean<?>) factory).isEagerInit());
                        }
                        if (isEagerInit) {
                            getBean(beanName);
                        }
                    }
                }
                else {
                    getBean(beanName);
                }
            }
        }

        // Trigger post-initialization callback for all applicable beans...
        for (String beanName : beanNames) {
            Object singletonInstance = getSingleton(beanName);
            if (singletonInstance instanceof SmartInitializingSingleton) {
                final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
                if (System.getSecurityManager() != null) {
                    AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                        //关键代码
                        smartSingleton.afterSingletonsInstantiated();
                        return null;
                    }, getAccessControlContext());
                }
                else {
                    //关键代码,
                    smartSingleton.afterSingletonsInstantiated();
                }
            }
        }
}
AI 代码解读
目录
打赏
0
0
0
0
1
分享
相关文章
电感器的作用及其应用
一、电感器的基本原理 电感器是一种用于存储和释放电能的 passive 设备,它的基本原理是利用线圈中的电流产生磁场,从而储存电能。电感器由一个或多个线圈组成,线圈中的导线环绕在一个或多个磁性材料的芯上。当电流通过线圈时,磁场会在芯中产生,这个磁场会储存电能。 二、电感器的类型 根据电感器的结构和特性,可以将电感器分为多种类型。常见的电感器包括固定电感器、可变电感器和互感器。 1. 固定电感器:固定电感器是指电感值不可调节的电感器。它通常由线圈和磁性芯组成,线圈中的导线匝数和磁性芯的材料和形状决定了电感器的电感值。 2. 可变电感器:可变电感器是指电感值可调节的电感器。它通常由线圈和可移动的磁
252 0
宏函数以及作用
宏函数是在预处理阶段由编译器进行替换的代码片段,常用于常量定义、简单计算和代码简化。它们以 `#define` 开头,不进行类型检查,使用时需谨慎。
|
11月前
ztest中ddof起什么作用
ztest中ddof起什么作用
86 0
Hysterix的概念、作用、使用方法
Hysterix的概念、作用、使用方法
113 0
【C】函数真的难嘛?其实一点也不难,原理很简单。
# 什么是函数 程序是由多个零件组合而成的,而函数就是这种“零件”的一个较小单位。 ## main函数和库函数 C语言程序中,main函数是必不可少的。程序运行的时候,会执行main函数的主题部分。main函数中使用了printf、scanf、puts等函数。由C语言提供的这些为数众多的函数称为库函数。 ## 什么是函数 当然,我们也可以自己创建函数。而实际上,我们也必须亲自动手创建各种函数。下面我们来自己创建一个简单的函数。 创建一个函数,接收两个整数参数,返回较大整数的值。 printf函数和scanf函数等创建得比较好得函数,即使不知道其内容,只要了解使用方法,也可以轻松使用。 ## 函
do while(0)的作用以及原因
do while(0)的作用以及原因
203 0
7 段话说明 地图切片的概念与原理
7 段话说明 地图切片的概念与原理
255 0
html+css实战117-作用
html+css实战117-作用
293 0
html+css实战117-作用
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等