spring技术内幕笔记:lazy-init属性和预实例化
来源:互联网 发布:腾讯股票数据接口 编辑:程序博客网 时间:2024/06/06 10:56
1.lazy-init属性和预实例化
在finishBeanFactoryInitialization()方法中封装了对lazy-init属性的处理,实际的处理在DefaultListableBeanFactory的preInstantiateSingletons()方法中实现。
在finishBeanFactoryInitialization()方法中封装了对lazy-init属性的处理,实际的处理在DefaultListableBeanFactory的preInstantiateSingletons()方法中实现。
在方法中对单例的bean完成预实例化,这个预实例化的完成巧妙地委托给容器来实现。如果需要预实例化,就直接调用getBean去触发依赖注入。
public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext, DisposableBean { @Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // 调用obtainFreshBeanFactory()方法 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // 对lazy-init属性进行处理的地方 finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } finally { // Reset common introspection caches in Spring's core, since we // might not ever need metadata for singleton beans anymore... resetCommonCaches(); } } } /** * 完成上下文中的bean factory的初始化 */protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// Initialize conversion service for this context.if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values.if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(new StringValueResolver() {@Overridepublic String resolveStringValue(String strVal) {return getEnvironment().resolvePlaceholders(strVal);}});}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.beanFactory.freezeConfiguration();//初始化所有非懒加载的单例bean,这个方法由DefaultListableBeanFactory实现。beanFactory.preInstantiateSingletons();}}
@SuppressWarnings("serial")public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { @Overridepublic void preInstantiateSingletons() throws BeansException {if (this.logger.isDebugEnabled()) {this.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<String>(this.beanDefinitionNames);// 触发所有非懒加载的单例模式bean的初始化//如果不设置lazy-init属性,依赖注入发生在容器初始化结束以后。//如果设置了lazy-init属性(false),依赖注入发生在容器初始化过程中,会对beanDefinitionMap中所有的Bean进行依赖注入,//这样在初始化过程结束后,容器执行getBean得到已经准备好的Bean,不需要进行依赖注入。for (String beanName : beanNames) {RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);//bean不是抽象类并且是单例模式,lazy-init设为了false,将执行以下代码if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {if (isFactoryBean(beanName)) {final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {@Overridepublic Boolean run() {return ((SmartFactoryBean<?>) factory).isEagerInit();}}, getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {//调用getBean触发依赖注入getBean(beanName);}}else {//调用getBean触发依赖注入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(new PrivilegedAction<Object>() {@Overridepublic Object run() {smartSingleton.afterSingletonsInstantiated();return null;}}, getAccessControlContext());}else {smartSingleton.afterSingletonsInstantiated();}}}}}
阅读全文
0 0
- spring技术内幕笔记:lazy-init属性和预实例化
- spring lazy-init属性
- spring两个重要属性lazy-init和abstract
- spring两个重要属性lazy-init和abstract
- spring两个重要属性lazy-init和abstract
- spring lazy-init和 prototype
- Spring源码解读--init属性和预实例化(延迟加载)
- Spring_2_Spring中lazy-init和scope属性
- spring Bean的生命周期和lazy-init
- spring(4)_ bean属性 scope:作用域和lazy-init
- Spring中的lazy-init
- Spring lazy-init
- spring中lazy-init
- Spring的lazy-init属性延迟初始化Bean
- spring beans标签的default-lazy-init属性
- Spring源码分析之lazy-init属性的配置
- Spring--IoC容器对非lazy-init的singleton Bean实例化过程
- 读spring技术内幕--笔记
- OkHttp3
- EasyDemo*40个比较重要的Android面试常见题
- Spark日志分析项目Demo(1)--Flume-ng的安装
- Unity3D 优化 6 ( 删除 FBX 的 默认材质,减少加载时间)
- 判断两个字符串是否相等
- spring技术内幕笔记:lazy-init属性和预实例化
- Windows 7下安装TensorFlow步骤
- string 、 stringbuffer以及 stringbuilder的区别
- 4-Vue入门之数据绑定
- 453. Minimum Moves to Equal Array Elements
- Android Studio Cannot find local variable
- scala学习笔记一------初步了解scala
- java FTP 文件传输
- CFgym:Outer space invaders(区间dp)