spring学习----bean实例化
来源:互联网 发布:淘宝店如何装修 编辑:程序博客网 时间:2024/05/24 01:19
实例化相关核心类
- AbstractBeanFactory 实现getBean
- AbstractAutowireCapableBeanFactory 实现createBean(即实例化bean)
bean生命周期
- bean实例创建
- 为bean实例设置属性
- 调用bean的初始化方法
- 应用通过IOC容器使用bean
- 容器关闭时,调用销毁方法destory
bean实例化入口getBean()方法
AbstractBeanFactory实现getBean()–>doGetBean–>createBean()
子类AbstractAutowireCapableBeanFactory实现createBean–>doCreateBean
1、createBeanInstance方法创建bean(JVM反射 cglib具体参考源码) 1、populateBean方法(依赖注入,先执行autowire注解,在执行property注入依赖) 2、initializeBean()初始化bean 第一步判断是否实现BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口执行相应set方法 第二步执行实现BeanPostProcessor接口的前置方法postProcessBeforeInitialization 第三步执行初始化方法 是否实现InitializingBean若实现先执行afterProperties方法 执行指定init方法 第四步执行实现BeanPostProcessor接口的后置方法postProcessAfterInitialization
注意:
getBean先从缓存了查找,有直接获取,没有创建已bean实例
doGetBean中判断是否有依赖,若有,先实例化依赖bean(getBean递归实现)
相应源码
依赖递归实现AbstractBeanFactory doGetBean
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// Guarantee initialization of beans that the current bean depends on.String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) { for (String dep : dependsOn) { if (isDependent(beanName, dep)) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); } registerDependentBean(dep, beanName); getBean(dep); }}
AbstractAutowireCapableBeanFactory实例化实现类 doCreateBean
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) throws BeanCreationException { // Instantiate the bean. BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); } final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null); Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null); mbd.resolvedTargetType = beanType; // Allow post-processors to modify the merged bean definition. synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { try { applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); } catch (Throwable ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", ex); } mbd.postProcessed = true; } } // Eagerly cache singletons to be able to resolve circular references // even when triggered by lifecycle interfaces like BeanFactoryAware. boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { if (logger.isDebugEnabled()) { logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references"); } addSingletonFactory(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { return getEarlyBeanReference(beanName, mbd, bean); } }); } // Initialize the bean instance. Object exposedObject = bean; try { populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { exposedObject = initializeBean(beanName, exposedObject, mbd); } } ...
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run() { invokeAwareMethods(beanName, bean); return null; } }, getAccessControlContext()); } else { invokeAwareMethods(beanName, bean); } Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); } try { invokeInitMethods(beanName, wrappedBean, mbd); } catch (Throwable ex) { throw new BeanCreationException( (mbd != null ? mbd.getResourceDescription() : null), beanName, "Invocation of init method failed", ex); } if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean;}
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable { boolean isInitializingBean = (bean instanceof InitializingBean); if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) { if (logger.isDebugEnabled()) { logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'"); } if (System.getSecurityManager() != null) { try { AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { @Override public Object run() throws Exception { ((InitializingBean) bean).afterPropertiesSet(); return null; } }, getAccessControlContext()); } catch (PrivilegedActionException pae) { throw pae.getException(); } } else { ((InitializingBean) bean).afterPropertiesSet(); } } if (mbd != null) { String initMethodName = mbd.getInitMethodName(); if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) && !mbd.isExternallyManagedInitMethod(initMethodName)) { invokeCustomInitMethod(beanName, bean, mbd); } }}
bean对容器感知
通过实现aware接口 set方法 实际执行时机initializeBean方法
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
ResourceLoaderAware
ApplicationContextAware
MessageSourceAware
ApplicationEventPublisherAwareApplicationContextAwareProcessor (实现BeanPostProcessor接口)
使bean能通过实现Aware接口set方法获取容器相关高级特性
private void invokeAwareInterfaces(Object bean) { if(bean instanceof Aware) { if(bean instanceof EnvironmentAware) { ((EnvironmentAware)bean).setEnvironment(this.applicationContext.getEnvironment()); } if(bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware)bean).setEmbeddedValueResolver(this.embeddedValueResolver); } if(bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware)bean).setResourceLoader(this.applicationContext); } if(bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware)bean).setApplicationEventPublisher(this.applicationContext); } if(bean instanceof MessageSourceAware) { ((MessageSourceAware)bean).setMessageSource(this.applicationContext); } if(bean instanceof ApplicationContextAware) { ((ApplicationContextAware)bean).setApplicationContext(this.applicationContext); } } }
阅读全文
0 0
- spring学习----bean实例化
- Spring Bean的实例化(学习笔记)
- Spring 实例化bean
- spring实例化bean
- Spring实例化bean
- Spring学习笔记之Bean的实例化
- Spring学习之实例化bean的三种方式
- Spring学习之bean的实例化,销毁
- SPRING BEAN的实例化
- spring bean 实例化问题
- spring中实例化bean
- Spring之实例化Bean
- spring Bean的实例化
- Spring的Bean实例化
- Spring bean 如何实例化
- Spring-Bean的实例化
- 实例化Spring容器,实例化bean
- 传智播客spring学习,实例化bean的方式及Bean的作用域
- 51nod1076 2条不相交的路径
- [编程题] 庆祝61
- POJ-3494--Largest Submatrix of All 1’s---单调栈的应用
- java IO流(一) --字节流
- LeetCode
- spring学习----bean实例化
- IDEA和mysql版本的问题
- 技术文章|治疗IT架构“僵硬症” 几款工具提高数字化转型效率
- js判断滚动条是否滚到底部
- ThinkPHP5 动态连接数据库
- react native TimePickerAndroid详解
- 同步类容器与并发类 容器
- 整数算法训练01—统计1~n有多少个9
- 盘点家居建材圈七月十大事件