热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spring源码解析bean初始化与依赖注入一

2019独角兽企业重金招聘Python工程师标准前言本文转自“天河聊技术”微信公众号本次主要介绍bean初始化与依赖注入正文找到这个方法org.springframework

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前言

本文转自“天河聊技术”微信公众号

本次主要介绍bean初始化与依赖注入

 

正文

找到这个方法org.springframework.context.support.AbstractApplicationContext#refresh这行代码

finishBeanFactoryInitialization(beanFactory);

初始化非延迟初始化的单例对象。

 

进入到这个方法

org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization

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设置转换器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(strVal -> getEnvironment().resolvePlaceholders(strVal));}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early. 初始化LoadTimeWeaverAware beanString[] 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.允许缓存所有bean定义元数据,而不期望进一步更改。beanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons.实例化所有剩余的(非延迟-init)单例。beanFactory.preInstantiateSingletons();}

找到这行代码

beanFactory.preInstantiateSingletons();

实例化非延迟加载的单例bean

进入到这个方法

org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons

@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.
//    迭代一个副本&#xff0c;以允许init方法&#xff0c;它反过来注册新的bean定义。虽然这可能不是常规工厂引导的一部分&#xff0c;但它可以正常工作。List beanNames &#61; new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...触发立即加载的bean初始化for (String beanName : beanNames) {RootBeanDefinition bd &#61; getMergedLocalBeanDefinition(beanName);
//       非抽象、非延迟加载的bean立即加载if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {if (isFactoryBean(beanName)) {Object bean &#61; getBean(FACTORY_BEAN_PREFIX &#43; beanName);if (bean instanceof FactoryBean) {final FactoryBean factory &#61; (FactoryBean) bean;boolean isEagerInit;if (System.getSecurityManager() !&#61; null && factory instanceof SmartFactoryBean) {isEagerInit &#61; AccessController.doPrivileged((PrivilegedAction)((SmartFactoryBean) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit &#61; (factory instanceof SmartFactoryBean &&((SmartFactoryBean) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}}else {getBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...为所有适用的bean触发后初始化回调…for (String beanName : beanNames) {Object singletonInstance &#61; getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton &#61; (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() !&#61; null) {AccessController.doPrivileged((PrivilegedAction) () -> {
//                单例bean创建完成后回调smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {smartSingleton.afterSingletonsInstantiated();}}}}

找到这行代码

如果是立即加载if (isEagerInit) {getBean(beanName);}

org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)

&#64;Override
public Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);
}

进入这个方法

org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

protected T doGetBean(final String name, &#64;Nullable final Class requiredType,&#64;Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {final String beanName &#61; transformedBeanName(name);Object bean;// Eagerly check singleton cache for manually registered singletons.为手动注册的singleton检查单例缓存。Object sharedInstance &#61; getSingleton(beanName);if (sharedInstance !&#61; null && args &#61;&#61; null) {if (logger.isDebugEnabled()) {
//          bean是否正在创建if (isSingletonCurrentlyInCreation(beanName)) {logger.debug("Returning eagerly cached instance of singleton bean &#39;" &#43; beanName &#43;"&#39; that is not fully initialized yet - a consequence of a circular reference");}else {logger.debug("Returning cached instance of singleton bean &#39;" &#43; beanName &#43; "&#39;");}}bean &#61; getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// Fail if we&#39;re already creating this bean instance:// We&#39;re assumably within a circular reference.if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// Check if bean definition exists in this factory.BeanFactory parentBeanFactory &#61; getParentBeanFactory();
//       检查bean定义是否在beanFactoryif (parentBeanFactory !&#61; null && !containsBeanDefinition(beanName)) {// Not found -> check parent.beanName&#61;&beanNameString nameToLookup &#61; originalBeanName(name);if (parentBeanFactory instanceof AbstractBeanFactory) {
//             递归调用return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);}else if (args !&#61; 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);}}if (!typeCheckOnly) {markBeanAsCreated(beanName);}try {final RootBeanDefinition mbd &#61; getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// Guarantee initialization of beans that the current bean depends on.当前依赖的bean初始化String[] dependsOn &#61; mbd.getDependsOn();if (dependsOn !&#61; null) {for (String dep : dependsOn) {
//                确定依赖的bean是否已经初始化if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between &#39;" &#43; beanName &#43; "&#39; and &#39;" &#43; dep &#43; "&#39;");}
//                注册依赖的beanregisterDependentBean(dep, beanName);
//                递归调用getBean(dep);}}// Create bean instance.创建bean对象if (mbd.isSingleton()) {sharedInstance &#61; getSingleton(beanName, () -> {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 &#61; getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}else if (mbd.isPrototype()) {
//             bean定义为原型模式// It&#39;s a prototype -> create a new instance.Object prototypeInstance &#61; null;try {beforePrototypeCreation(beanName);prototypeInstance &#61; createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean &#61; getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else {String scopeName &#61; mbd.getScope();final Scope scope &#61; this.scopes.get(scopeName);if (scope &#61;&#61; null) {throw new IllegalStateException("No Scope registered for scope name &#39;" &#43; scopeName &#43; "&#39;");}try {Object scopedInstance &#61; scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});bean &#61; getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {throw new BeanCreationException(beanName,"Scope &#39;" &#43; scopeName &#43; "&#39; is not active for the current thread; consider " &#43;"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.检查所需类型是否与实际bean实例的类型匹配。if (requiredType !&#61; null && !requiredType.isInstance(bean)) {try {T convertedBean &#61; getTypeConverter().convertIfNecessary(bean, requiredType);if (convertedBean &#61;&#61; null) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch (TypeMismatchException ex) {if (logger.isDebugEnabled()) {logger.debug("Failed to convert bean &#39;" &#43; name &#43; "&#39; to required type &#39;" &#43;ClassUtils.getQualifiedName(requiredType) &#43; "&#39;", ex);}throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return (T) bean;}

找到这行代码

bean &#61; getObjectForBeanInstance(sharedInstance, name, beanName, null);

protected Object getObjectForBeanInstance(Object beanInstance, String name, String beanName, &#64;Nullable RootBeanDefinition mbd) {// Don&#39;t let calling code try to dereference the factory if the bean isn&#39;t a factory.//如果bean不是工厂&#xff0c;不要让调用代码破坏工厂。if (BeanFactoryUtils.isFactoryDereference(name)) {if (beanInstance instanceof NullBean) {return beanInstance;}if (!(beanInstance instanceof FactoryBean)) {throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());}}// Now we have the bean instance, which may be a normal bean or a FactoryBean.// If it&#39;s a FactoryBean, we use it to create a bean instance, unless the// caller actually wants a reference to the factory.//现在我们有了bean实例&#xff0c;它可能是一个普通的bean或一个FactoryBean。
//如果它是一个FactoryBean&#xff0c;我们使用它来创建一个bean实例&#xff0c;除非。
//打电话的人实际上想要一个关于工厂的资料。if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {return beanInstance;}Object object &#61; null;if (mbd &#61;&#61; null) {
//       先从缓存中获取对象object &#61; getCachedObjectForFactoryBean(beanName);}if (object &#61;&#61; null) {// Return bean instance from factory.FactoryBean factory &#61; (FactoryBean) beanInstance;// Caches object obtained from FactoryBean if it is a singleton.从FactoryBean中获取的缓存对象&#xff0c;如果它是一个单例对象。if (mbd &#61;&#61; null && containsBeanDefinition(beanName)) {mbd &#61; getMergedLocalBeanDefinition(beanName);}boolean synthetic &#61; (mbd !&#61; null && mbd.isSynthetic());
//       从factoryBean中获取对象object &#61; getObjectFromFactoryBean(factory, beanName, !synthetic);}return object;}

找到这行代码

//        先从缓存中获取对象object &#61; getCachedObjectForFactoryBean(beanName);

如果是factoryBean&#xff0c;从中缓存中获取对象

找到这行代码

object &#61; getObjectFromFactoryBean(factory, beanName, !synthetic);

如果缓存中没有就从beanFactory中获取

进入这个方法

org.springframework.beans.factory.support.FactoryBeanRegistrySupport#getObjectFromFactoryBean

protected Object getObjectFromFactoryBean(FactoryBean factory, String beanName, boolean shouldPostProcess) {
//    如果单例对象if (factory.isSingleton() && containsSingleton(beanName)) {synchronized (getSingletonMutex()) {
//          先从缓存中获取Object object &#61; this.factoryBeanObjectCache.get(beanName);if (object &#61;&#61; null) {
//             从factoryBean中获取object &#61; doGetObjectFromFactoryBean(factory, beanName);// Only post-process and store if not put there already during getObject() call above// (e.g. because of circular reference processing triggered by custom getBean calls)Object alreadyThere &#61; this.factoryBeanObjectCache.get(beanName);if (alreadyThere !&#61; null) {object &#61; alreadyThere;}else {
//                是否需要后续处理if (shouldPostProcess) {try {object &#61; postProcessObjectFromFactoryBean(object, beanName);}catch (Throwable ex) {throw new BeanCreationException(beanName,"Post-processing of FactoryBean&#39;s singleton object failed", ex);}}this.factoryBeanObjectCache.put(beanName, object);}}return object;}}else {Object object &#61; doGetObjectFromFactoryBean(factory, beanName);if (shouldPostProcess) {try {object &#61; postProcessObjectFromFactoryBean(object, beanName);}catch (Throwable ex) {throw new BeanCreationException(beanName, "Post-processing of FactoryBean&#39;s object failed", ex);}}return object;}}

返回到这个方法

org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean这一行代码

注册依赖的beanregisterDependentBean(dep, beanName);

找到这一行代码

return createBean(beanName, mbd, args);

进入这个方法

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])

&#64;Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, &#64;Nullable Object[] args)throws BeanCreationException {if (logger.isDebugEnabled()) {logger.debug("Creating instance of bean &#39;" &#43; beanName &#43; "&#39;");}RootBeanDefinition mbdToUse &#61; mbd;// Make sure bean class is actually resolved at this point, and// clone the bean definition in case of a dynamically resolved Class// which cannot be stored in the shared merged bean definition.Class resolvedClass &#61; resolveBeanClass(mbd, beanName);if (resolvedClass !&#61; null && !mbd.hasBeanClass() && mbd.getBeanClassName() !&#61; null) {mbdToUse &#61; new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try {mbdToUse.prepareMethodOverrides();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),beanName, "Validation of method overrides failed", ex);}try {// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.Object bean &#61; resolveBeforeInstantiation(beanName, mbdToUse);if (bean !&#61; null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}try {
//       bean创建Object beanInstance &#61; doCreateBean(beanName, mbdToUse, args);if (logger.isDebugEnabled()) {logger.debug("Finished creating instance of bean &#39;" &#43; beanName &#43; "&#39;");}return beanInstance;}catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {// A previously detected exception with proper bean creation context already,// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.throw ex;}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);}}

找到这行代码

Object bean &#61; resolveBeforeInstantiation(beanName, mbdToUse);

bean初始化之前的一些操作&#xff0c;主要是对beanProccessors的处理

&#64;Nullableprotected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean &#61; null;if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {// Make sure bean class is actually resolved at this point.if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {Class targetType &#61; determineTargetType(beanName, mbd);if (targetType !&#61; null) {
//             调用bean初始化前处理器bean &#61; applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);if (bean !&#61; null) {
//                bean初始化以后调用处理器bean &#61; applyBeanPostProcessorsAfterInitialization(bean, beanName);}}}mbd.beforeInstantiationResolved &#61; (bean !&#61; null);}return bean;}

找到这一行代码

//        bean创建Object beanInstance &#61; doCreateBean(beanName, mbdToUse, args);

下次接着介绍。

 

 

最后

 

本次介绍到这里&#xff0c;以上内容仅供参考。


转:https://my.oschina.net/u/3775437/blog/1813119



推荐阅读
author-avatar
小文982_412
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有