• Spring IOC 之 SmartInitializingSingleton


    使用

    实现该接口后,当所有单例 bean 都初始化完成以后, 容器会回调该接口的方法 afterSingletonsInstantiated
    主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情。

    原理

    ApplicationContext 在 refresh 过程中会调用 finishBeanFactoryInitialization(beanFactory) 来提前初始化单例bean,具体方法是调用 preInstantiateSingletons
    该方法定义在接口 ConfigurableListableBeanFactory 中。

    public void preInstantiateSingletons() throws BeansException {
    	if (logger.isDebugEnabled()) {
    	    logger.debug("Pre-instantiating singletons in " + this);
    	}
    
    	// Iterate over a copy to allow for init methods which in turn register new bean definitions.
    	// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
    	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();
    			}
    		}
    	}
    }
    
  • 相关阅读:
    找回消失的ubuntu启动选项
    搜索引擎的查询意图识别(关联分析)
    使用Eric构建Caffe应用程序-Baby年龄识别
    使用Caffe预测遇到的问题
    Caffe: Caffe的Python接口
    工厂模式-CaffeNet训练
    caffe特征提取/C++数据格式转换
    Vs2010无法打开文件“Kernel32.lib”、无法打开“libcpmt.lib”"msvcprt.lib"
    编译OpenCV遇到Qmake问题
    caffe学习笔记--跑个SampleCode
  • 原文地址:https://www.cnblogs.com/leihuazhe/p/10043167.html
Copyright © 2020-2023  润新知