Spring源码解析(四)Bean的实例化和依赖注入
2018-06-18 02:31:14来源:未知 阅读 ()
我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢。其实一共有两个触发点,但是最后实际上调用的是同一个方法。
第一个:在AbstractApplicationContext的refresh()方法中,容器会初始化lazy-init=false的bean。
// Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory);
第二个:在获得了ApplicationContext后,调用getBean(XX)方法。
实际上它们最终都是调用的AbstractBeanFactory的doGetBean(XX)方法。
/** * Return an instance, which may be shared or independent, of the specified bean. * @param name the name of the bean to retrieve * @param requiredType the required type of the bean to retrieve * @param args arguments to use if creating a prototype using explicit arguments to a * static factory method. It is invalid to use a non-null args value in any other case. * @param typeCheckOnly whether the instance is obtained for a type check, * not for actual use * @return an instance of the bean * @throws BeansException if the bean could not be created */ @SuppressWarnings("unchecked") protected <T> T doGetBean( final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { //如果name已&开头,去掉& final String beanName = transformedBeanName(name); Object bean; // Eagerly check singleton cache for manually registered singletons. /**1.先在单例缓存中查找*/ Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { if (logger.isDebugEnabled()) { if (isSingletonCurrentlyInCreation(beanName)) { logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference"); } else { logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); } } /**2.判断返回instance本身还是要返回FacotryBean*/ bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { // Fail if we're already creating this bean instance: // We're assumably within a circular reference. //判断是否不是循环引用 if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } // Check if bean definition exists in this factory. BeanFactory parentBeanFactory = getParentBeanFactory(); if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { // Not found -> check parent. String nameToLookup = originalBeanName(name); if (args != null) { // Delegation to parent with explicit args. return (T) parentBeanFactory.getBean(nameToLookup, args); } else { // No args -> delegate to standard getBean method. return parentBeanFactory.getBean(nameToLookup, requiredType); } } //标记bean已被创建 if (!typeCheckOnly) { markBeanAsCreated(beanName); } try { final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd, beanName, args); // Guarantee initialization of beans that the current bean depends on. /**3.如果bean依赖于其他bean先初始化,先初始化依赖的bean*/ String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dependsOnBean : dependsOn) { getBean(dependsOnBean); /**4.记录两个bean相互依赖关系,被依赖的bean在销毁前,要先要销毁依赖它的bean*/ registerDependentBean(dependsOnBean, beanName); } } // Create bean instance. /** * 5.创建单例bean,scope="singleton" */ if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); throw ex; } } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } /** * 6.创建原型bean,scope="prototype" */ else if (mbd.isPrototype()) { // It's a prototype -> create a new instance. Object prototypeInstance = null; try { beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } /** * 7. scope=request/session/globalSession */ else { String scopeName = mbd.getScope(); final Scope scope = this.scopes.get(scopeName); if (scope == null) { throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'"); } try { Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() { public Object getObject() throws BeansException { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } catch (IllegalStateException ex) { throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; " + "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", ex); } } } catch (BeansException ex) { cleanupAfterBeanCreationFailure(beanName); throw ex; } } // Check if required type matches the type of the actual bean instance. if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) { try { return getTypeConverter().convertIfNecessary(bean, requiredType); } catch (TypeMismatchException ex) { if (logger.isDebugEnabled()) { logger.debug("Failed to convert bean '" + name + "' to required type [" + ClassUtils.getQualifiedName(requiredType) + "]", ex); } throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } } return (T) bean; }
AbstractAutowireCapableBeanFactory的createBean方法:
@Override protected 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. /**1.解析Bean的Class*/ resolveBeanClass(mbd, beanName); // Prepare method overrides. try { /**2.方法注入准备*/ 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. /**3.BeanPostProcesser第一个扩展点,可以返回一个代理类*/ 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); } /**4.执行spring创建bena实例的流程*/ Object beanInstance = doCreateBean(beanName, mbd, args); if (logger.isDebugEnabled()) { logger.debug("Finished creating instance of bean '" + beanName + "'"); } return beanInstance; }
第4步才是真正创建实例和初始化的主要方法:
1 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { 2 // Instantiate the bean. 3 4 BeanWrapper instanceWrapper = null; 5 if (mbd.isSingleton()) { 6 instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); 7 } 8 if (instanceWrapper == null) { 9 /**5.创建bean实例*/ 10 instanceWrapper = createBeanInstance(beanName, mbd, args); 11 } 12 final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null); 13 Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null); 14 15 // Allow post-processors to modify the merged bean definition. 16 /** 17 * 6.MergedBeanDefinitionPostProcessor合并父子类属性,例如:List属性 18 */ 19 synchronized (mbd.postProcessingLock) { 20 if (!mbd.postProcessed) { 21 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); 22 mbd.postProcessed = true; 23 } 24 } 25 26 // Eagerly cache singletons to be able to resolve circular references 27 // even when triggered by lifecycle interfaces like BeanFactoryAware. 28 /** 29 * 7.及早暴露单例bean引用,解决循环引用 30 */ 31 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && 32 isSingletonCurrentlyInCreation(beanName)); 33 if (earlySingletonExposure) { 34 if (logger.isDebugEnabled()) { 35 logger.debug("Eagerly caching bean '" + beanName + 36 "' to allow for resolving potential circular references"); 37 } 38 //创建匿名内部类,匿名内部类会讲beanName、mbd,bean(final修饰)拷贝一份到内部类,已保证当前方法执行完成后局部变量退栈后内部类还可以访问。 39 addSingletonFactory(beanName, new ObjectFactory<Object>() { 40 public Object getObject() throws BeansException { 41 return getEarlyBeanReference(beanName, mbd, bean); 42 } 43 }); 44 } 45 46 // Initialize the bean instance. 47 Object exposedObject = bean; 48 try { 49 /** 50 * 8.依赖注入 51 */ 52 populateBean(beanName, mbd, instanceWrapper); 53 if (exposedObject != null) { 54 /** 55 * 9.执行自定义BeanProcesser和init-method 56 */ 57 exposedObject = initializeBean(beanName, exposedObject, mbd); 58 } 59 } 60 catch (Throwable ex) { 61 if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) { 62 throw (BeanCreationException) ex; 63 } 64 else { 65 throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex); 66 } 67 } 68 69 if (earlySingletonExposure) { 70 Object earlySingletonReference = getSingleton(beanName, false); 71 if (earlySingletonReference != null) { 72 if (exposedObject == bean) { 73 exposedObject = earlySingletonReference; 74 } 75 else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) { 76 String[] dependentBeans = getDependentBeans(beanName); 77 Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length); 78 for (String dependentBean : dependentBeans) { 79 if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) { 80 actualDependentBeans.add(dependentBean); 81 } 82 } 83 if (!actualDependentBeans.isEmpty()) { 84 throw new BeanCurrentlyInCreationException(beanName, 85 "Bean with name '" + beanName + "' has been injected into other beans [" + 86 StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + 87 "] in its raw version as part of a circular reference, but has eventually been " + 88 "wrapped. This means that said other beans do not use the final version of the " + 89 "bean. This is often the result of over-eager type matching - consider using " + 90 "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example."); 91 } 92 } 93 } 94 } 95 96 // Register bean as disposable. 97 try { 98 /** 99 * 10.注册DestructionAwareBeanPostProcessors和destroy-method 100 */ 101 registerDisposableBeanIfNecessary(beanName, bean, mbd); 102 } 103 catch (BeanDefinitionValidationException ex) { 104 throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex); 105 } 106 107 return exposedObject; 108 }
第5步:实例化Bean对象,封装成BeanWrapper
1 protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) { 2 // Make sure bean class is actually resolved at this point. 3 Class<?> beanClass = resolveBeanClass(mbd, beanName); 4 5 if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) { 6 throw new BeanCreationException(mbd.getResourceDescription(), beanName, 7 "Bean class isn't public, and non-public access not allowed: " + beanClass.getName()); 8 } 9 /**5.1 通过静态方法来实例化bean*/ 10 if (mbd.getFactoryMethodName() != null) { 11 return instantiateUsingFactoryMethod(beanName, mbd, args); 12 } 13 14 // Shortcut when re-creating the same bean... 15 boolean resolved = false; 16 boolean autowireNecessary = false; 17 if (args == null) { 18 synchronized (mbd.constructorArgumentLock) { 19 if (mbd.resolvedConstructorOrFactoryMethod != null) { 20 resolved = true; 21 autowireNecessary = mbd.constructorArgumentsResolved; 22 } 23 } 24 } 25 /**5.2 暂时不知道什么时候会走这???????*/ 26 if (resolved) { 27 if (autowireNecessary) { 28 return autowireConstructor(beanName, mbd, null, null); 29 } 30 else { 31 return instantiateBean(beanName, mbd); 32 } 33 } 34 35 // Need to determine the constructor... 36 /**5.3 BeanPostProcessor的又一个扩展点:SmartInstantiationAwareBeanPostProcessor。 37 * 检测Bean的构造器,可以检测出多个候选构造器,再有相应的策略决定使用哪一个, 38 * 如AutowiredAnnotationBeanPostProcessor实现将自动扫描通过@Autowired/@Va 39 */ 40 Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); 41 /**5.4 通过构造器实例化bean,包括autowire=constructor 和<constructor-arg></constructor-arg>*/ 42 if (ctors != null || 43 mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR || 44 mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { 45 return autowireConstructor(beanName, mbd, ctors, args); 46 } 47 48 // No special handling: simply use no-arg constructor. 49 /**5.5 通过无参构造器实例化bean*/ 50 return instantiateBean(beanName, mbd); 51 }
第8步:Bean实例的初始化也就是属性的注入
1 /** 2 * Populate the bean instance in the given BeanWrapper with the property values 3 * from the bean definition. 4 * @param beanName the name of the bean 5 * @param mbd the bean definition for the bean 6 * @param bw BeanWrapper with bean instance 7 */ 8 protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) { 9 PropertyValues pvs = mbd.getPropertyValues(); 10 11 if (bw == null) { 12 if (!pvs.isEmpty()) { 13 throw new BeanCreationException( 14 mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance"); 15 } 16 else { 17 // Skip property population phase for null instance. 18 return; 19 } 20 } 21 22 // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the 23 // state of the bean before properties are set. This can be used, for example, 24 // to support styles of field injection. 25 boolean continueWithPropertyPopulation = true; 26 /** 27 * 扩展点3:通过InstantiationAwareBeanPostProcessor给属性赋值 28 */ 29 if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { 30 for (BeanPostProcessor bp : getBeanPostProcessors()) { 31 if (bp instanceof InstantiationAwareBeanPostProcessor) { 32 InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; 33 if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { 34 continueWithPropertyPopulation = false; 35 break; 36 } 37 } 38 } 39 } 40 41 if (!continueWithPropertyPopulation) { 42 return; 43 } 44 45 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || 46 mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { 47 MutablePropertyValues newPvs = new MutablePropertyValues(pvs); 48 49 // Add property values based on autowire by name if applicable. 50 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { 51 //根据Name自动装配 52 autowireByName(beanName, mbd, bw, newPvs); 53 } 54 55 // Add property values based on autowire by type if applicable. 56 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { 57 //根据Type自动装配 58 autowireByType(beanName, mbd, bw, newPvs); 59 } 60 61 pvs = newPvs; 62 } 63 64 boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors(); 65 boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE); 66 67 if (hasInstAwareBpps || needsDepCheck) { 68 PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching); 69 if (hasInstAwareBpps) { 70 /** 71 * InstantiationAwareBeanPostProcesser在属性注入之前的扩展点 72 */ 73 for (BeanPostProcessor bp : getBeanPostProcessors()) { 74 if (bp instanceof InstantiationAwareBeanPostProcessor) { 75 InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; 76 pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName); 77 if (pvs == null) { 78 return; 79 } 80 } 81 } 82 } 83 /**是否需要依赖检查*/ 84 if (needsDepCheck) { 85 checkDependencies(beanName, mbd, filteredPds, pvs); 86 } 87 } 88 /**属性注入*/ 89 applyPropertyValues(beanName, mbd, bw, pvs); 90 }
最终是通过java反射调用set方法的invoke实现的属性注入。BeanWrapperImpl setPropertyValue方法
1 //省略..... 2 if (System.getSecurityManager() != null) { 3 try { 4 AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { 5 public Object run() throws Exception { 6 writeMethod.invoke(object, value); 7 return null; 8 } 9 }, acc); 10 } 11 catch (PrivilegedActionException ex) { 12 throw ex.getException(); 13 } 14 } 15 else { 16 writeMethod.invoke(this.object, value); 17 } 18 }
//省略.....
到此,bean的实例化和属性注入已经完成。但是Bean实例的初始化工作还没完成,还有一系列的初始化工作。
第9步:初始化Bean实例
1 protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { 2 if (System.getSecurityManager() != null) { 3 AccessController.doPrivileged(new PrivilegedAction<Object>() { 4 public Object run() { 5 invokeAwareMethods(beanName, bean); 6 return null; 7 } 8 }, getAccessControlContext()); 9 } 10 else { 11 /**1.为实现Aware接口的bean设置一些相应的资源**/ 12 invokeAwareMethods(beanName, bean); 13 } 14 15 Object wrappedBean = bean; 16 if (mbd == null || !mbd.isSynthetic()) { 17 /**2.调用BeanPostProcesser postProcessBeforeInitialization方法*/ 18 wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); 19 } 20 21 try { 22 /**3.调用InitializingBean的afterPropertiesSet方法 23 * 调用自定义init-method 24 */ 25 invokeInitMethods(beanName, wrappedBean, mbd); 26 } 27 catch (Throwable ex) { 28 throw new BeanCreationException( 29 (mbd != null ? mbd.getResourceDescription() : null), 30 beanName, "Invocation of init method failed", ex); 31 } 32 33 if (mbd == null || !mbd.isSynthetic()) { 34 /** 35 * 4.调用BeanPostProcesser postProcessAfterInitialization方法 36 */ 37 wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); 38 } 39 return wrappedBean; 40 }
第10步:注册DisposableBean
1 protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) { 2 AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null); 3 if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) { 4 //单例 5 if (mbd.isSingleton()) { 6 // Register a DisposableBean implementation that performs all destruction 7 // work for the given bean: DestructionAwareBeanPostProcessors, 8 // DisposableBean interface, custom destroy method. 9 registerDisposableBean(beanName, 10 new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc)); 11 } 12 else { 13 // A bean with a custom scope... 14 Scope scope = this.scopes.get(mbd.getScope()); 15 if (scope == null) { 16 throw new IllegalStateException("No Scope registered for scope '" + mbd.getScope() + "'"); 17 } 18 scope.registerDestructionCallback(beanName, 19 new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc)); 20 } 21 } 22 }
public void registerDisposableBean(String beanName, DisposableBean bean) { synchronized (this.disposableBeans) { this.disposableBeans.put(beanName, bean); } } public DisposableBeanAdapter(Object bean, String beanName, RootBeanDefinition beanDefinition, List<BeanPostProcessor> postProcessors, AccessControlContext acc) { Assert.notNull(bean, "Disposable bean must not be null"); this.bean = bean; this.beanName = beanName; this.invokeDisposableBean = (this.bean instanceof DisposableBean && !beanDefinition.isExternallyManagedDestroyMethod("destroy")); this.nonPublicAccessAllowed = beanDefinition.isNonPublicAccessAllowed(); this.acc = acc; String destroyMethodName = inferDestroyMethodIfNecessary(bean, beanDefinition); if (destroyMethodName != null && !(this.invokeDisposableBean && "destroy".equals(destroyMethodName)) && !beanDefinition.isExternallyManagedDestroyMethod(destroyMethodName)) { this.destroyMethodName = destroyMethodName; this.destroyMethod = determineDestroyMethod(); if (this.destroyMethod == null) { if (beanDefinition.isEnforceDestroyMethod()) { throw new BeanDefinitionValidationException("Couldn't find a destroy method named '" + destroyMethodName + "' on bean with name '" + beanName + "'"); } } else { Class<?>[] paramTypes = this.destroyMethod.getParameterTypes(); if (paramTypes.length > 1) { throw new BeanDefinitionValidationException("Method '" + destroyMethodName + "' of bean '" + beanName + "' has more than one parameter - not supported as destroy method"); } else if (paramTypes.length == 1 && !paramTypes[0].equals(boolean.class)) { throw new BeanDefinitionValidationException("Method '" + destroyMethodName + "' of bean '" + beanName + "' has a non-boolean parameter - not supported as destroy method"); } } } this.beanPostProcessors = filterPostProcessors(postProcessors); }
到此,Spring Bean的实例化和初始化工作就完成了。
总结一下Bean的实例创建和初始化过程,也就是Bean的生命周期:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- JVM常见面试题解析 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash