spring笔记6 容器加载过程、bean初始化

来源:互联网 发布:白头发食疗 知乎 编辑:程序博客网 时间:2024/06/03 20:44
AbstractApplicationContextpublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();//// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); //new出DefaultListableBeanFactory  加载BeanDefinitions// 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); // 执行所有的 BeanFactoryPostProcessor  BeanDefinitionRegistryPostProcessor//BeanFactoryPostProcessor 比如PropertyPlaceholderConfigurer替换${}//BeanDefinitionRegistryPostProcessor  比如MapperScannerConfigurer注册动态代理生成的dao实例// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);//按顺序注册实现了PriorityOrdered Ordered 无序 的BeanPostProcessor   //挑选出MergedBeanDefinitionPostProcessor最后注册  注册时候会排重   加入到beanFactory的一个list中// Initialize message source for this context.initMessageSource();//初始化属性messageSource  若容器中没有使用默认的DelegatingMessageSource// Initialize event multicaster for this context.initApplicationEventMulticaster();//初始化属性applicationEventMulticaster  若容器中没有使用默认的SimpleApplicationEventMulticaster// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();//applicationEventMulticaster加入容器中的ApplicationListener// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);//实例化所有的non-lazy-init// Last step: publish corresponding event.finishRefresh();//实例化属性lifecycleProcessor 若容器没有使用DefaultLifecycleProcessor//lifecycleProcessor.onRefresh()//发布ContextRefreshedEvent}catch (BeansException ex) {// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}}}//关闭容器protected void doClose() {boolean actuallyClose;synchronized (this.activeMonitor) {actuallyClose = this.active && !this.closed;this.closed = true;}if (actuallyClose) {if (logger.isInfoEnabled()) {logger.info("Closing " + this);}LiveBeansView.unregisterApplicationContext(this);try {// Publish shutdown event.publishEvent(new ContextClosedEvent(this));}catch (Throwable ex) {logger.warn("Exception thrown from ApplicationListener handling ContextClosedEvent", ex);}// Stop all Lifecycle beans, to avoid delays during individual destruction.try {getLifecycleProcessor().onClose();}catch (Throwable ex) {logger.warn("Exception thrown from LifecycleProcessor on context close", ex);}// Destroy all cached singletons in the context's BeanFactory.destroyBeans();// Close the state of this context itself.closeBeanFactory();// Let subclasses do some final clean-up if they wish...onClose();synchronized (this.activeMonitor) {this.active = false;}}}AbstractAutowireCapableBeanFactory@Overrideprotected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)throws BeanCreationException {if (logger.isDebugEnabled()) {logger.debug("Creating instance of bean '" + beanName + "'");}// Make sure bean class is actually resolved at this point.resolveBeanClass(mbd, beanName);// Prepare method overrides.try {mbd.prepareMethodOverrides();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(mbd.getResourceDescription(),beanName, "Validation of method overrides failed", ex);}try {// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.//使用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()得到bean 如果不为null //接着执行所有的BeanPostProcessor.postProcessAfterInitialization()Object bean = resolveBeforeInstantiation(beanName, mbd);if (bean != null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}Object beanInstance = doCreateBean(beanName, mbd, args);if (logger.isDebugEnabled()) {logger.debug("Finished creating instance of bean '" + beanName + "'");}return beanInstance;}/** * Actually create the specified bean. Pre-creation processing has already happened * at this point, e.g. checking {@code postProcessBeforeInstantiation} callbacks. * <p>Differentiates between default bean instantiation, use of a * factory method, and autowiring a constructor. * @param beanName the name of the bean * @param mbd the merged bean definition for the bean * @param args arguments to use if creating a prototype using explicit arguments to a * static factory method. This parameter must be {@code null} except in this case. * @return a new instance of the bean * @throws BeanCreationException if the bean could not be created * @see #instantiateBean * @see #instantiateUsingFactoryMethod * @see #autowireConstructor */protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {// 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);// Allow post-processors to modify the merged bean definition.synchronized (mbd.postProcessingLock) {if (!mbd.postProcessed) {applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);//执行MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()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() {//单例类添加到SingletonBeanRegistry的map中缓存public Object getObject() throws BeansException {return getEarlyBeanReference(beanName, mbd, bean);}});}// Initialize the bean instance.Object exposedObject = bean;try {populateBean(beanName, mbd, instanceWrapper);//初始化//执行InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation  有一个为false则返回//设置mdb里面autowire的属性,从beanFactory里面取//InstantiationAwareBeanPostProcessor.postProcessPropertyValues//BeanWrapper中完成设置bean的属性if (exposedObject != null) {exposedObject = initializeBean(beanName, exposedObject, mbd);//初始化后执行一些方法//BeanNameAware.setBeanName//BeanClassLoaderAware.setBeanClassLoader//BeanFactoryAware.setBeanFactory//BeanPostProcessor.postProcessBeforeInitialization//InitializingBean.afterPropertiesSet//initMethod//BeanPostProcessor.postProcessAfterInitialization//}}catch (Throwable ex) {if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {throw (BeanCreationException) ex;}else {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);}}if (earlySingletonExposure) {Object earlySingletonReference = getSingleton(beanName, false);if (earlySingletonReference != null) {if (exposedObject == bean) {exposedObject = earlySingletonReference;}else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {String[] dependentBeans = getDependentBeans(beanName);Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);for (String dependentBean : dependentBeans) {if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {actualDependentBeans.add(dependentBean);}}if (!actualDependentBeans.isEmpty()) {throw new BeanCurrentlyInCreationException(beanName,"Bean with name '" + beanName + "' has been injected into other beans [" +StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +"] in its raw version as part of a circular reference, but has eventually been " +"wrapped. This means that said other beans do not use the final version of the " +"bean. This is often the result of over-eager type matching - consider using " +"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");}}}}// Register bean as disposable.try {registerDisposableBeanIfNecessary(beanName, bean, mbd);//实现DisposableBean的bean加入到beanFactory的disposableBeans Map中}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;}//容器关闭时 销毁beanDisposableBeanAdapterpublic void destroy() {if (this.beanPostProcessors != null && !this.beanPostProcessors.isEmpty()) {for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {processor.postProcessBeforeDestruction(this.bean, this.beanName);}}if (this.invokeDisposableBean) {if (logger.isDebugEnabled()) {logger.debug("Invoking destroy() on bean with name '" + this.beanName + "'");}try {if (System.getSecurityManager() != null) {AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {public Object run() throws Exception {((DisposableBean) bean).destroy();return null;}}, acc);}else {((DisposableBean) bean).destroy();}}catch (Throwable ex) {String msg = "Invocation of destroy method failed on bean with name '" + this.beanName + "'";if (logger.isDebugEnabled()) {logger.warn(msg, ex);}else {logger.warn(msg + ": " + ex);}}}if (this.destroyMethod != null) {invokeCustomDestroyMethod(this.destroyMethod);}else if (this.destroyMethodName != null) {Method methodToCall = determineDestroyMethod();if (methodToCall != null) {invokeCustomDestroyMethod(methodToCall);}}}



大致过程

AbstractBeanFactory.getBeanbean = InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()if(bean == null)实例化MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation 初始化BeanNameAware.setBeanNameBeanClassLoaderAware.setBeanClassLoaderBeanFactoryAware.setBeanFactoryBeanPostProcessor.postProcessBeforeInitializationInitializingBean.afterPropertiesSetinitMethodBeanPostProcessor.postProcessAfterInitialization--------------AbstractApplicationContext.refreshBeanFactoryPostProcessor      扩展BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessorregisterBeanPostProcessors 注册publishEvent(new ContextRefreshedEvent(this)); 扩展ApplicationListener--------------AbstractApplicationContext.closepublishEvent(new ContextClosedEvent(this));DestructionAwareBeanPostProcessor.postProcessBeforeDestruction((DisposableBean) bean).destroy();destroyMethod


原创粉丝点击