zoukankan      html  css  js  c++  java
  • 【Spring】Spring bean的实例化(ClassPathXmlApplicationContext)

    Spring实现HelloWord

    前提:
    1、已经在工程中定义了Spring配置文件beans.xml
    2、写好了一个测试类HelloWorld,里面有方法getMessage()用于输出"hello world"
    3、在beans.xml中配置了一个类HelloWorld

    示例代码:

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    HelloWorld obj = (HelloWorld)context.getBean("HelloWorld");
    obj.getMessage();
    

    运行上面代码,会在控制台打印出hello world字符。

    Spring加载bean过程

    注:分析基于spring-framework-4.3.8.RELEASE

    ClassPathXmlApplicationContext的所有方法列表

    构造函数调用了refresh方法

    代码new ClassPathXmlApplicationContext("beans.xml");使用了构造函数如下:

    	/**
    	 * Create a new ClassPathXmlApplicationContext, loading the definitions
    	 * from the given XML file and automatically refreshing the context.
    	 * @param configLocation resource location
    	 * @throws BeansException if context creation failed
    	 */
    	public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
    		this(new String[] {configLocation}, true, null);
    	}
    	
    		/**
    	 * Create a new ClassPathXmlApplicationContext with the given parent,
    	 * loading the definitions from the given XML files.
    	 * @param configLocations array of resource locations
    	 * @param refresh whether to automatically refresh the context,
    	 * loading all bean definitions and creating all singletons.
    	 * Alternatively, call refresh manually after further configuring the context.
    	 * @param parent the parent context
    	 * @throws BeansException if context creation failed
    	 * @see #refresh()
    	 */
    	public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
    			throws BeansException {
    
    		super(parent);
    		setConfigLocations(configLocations);
    		if (refresh) {
    			refresh();
    		}
    	}
    

    上面构造方法调用了org.springframework.context.support.AbstractApplicationContext#refresh

    @Override
    	public 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();
    
    			// 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();
    
    				// Instantiate all remaining (non-lazy-init) singletons.
                                    //这里是实例化所有非懒加载的实例
    				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();
    			}
    		}
    	}
    

    下面是调用构造器时,Spring初始化的主要过程。(refresh)

    下面是refresh中的finishBeanFactoryInitialization(beanFactory);方法的主要过程。(AbstractApplicationContext.finishBeanFactoryInitialization())
    下面是实例化Bean的过程:

    (在新标签打开查看大图)

    下面是加载Bean定义:AbstractXmlApplicationContext.loadBeanDefinitions()在refresh方法中的obtainFreshBeanFactory的bean定义阶段。
    调用关系如下:

    加载Bean定义过程如下:

    获取bean流程分析

    由于未设置HelloWorld类懒加载(lazy-init=true)(默认是non-lazy-load),因此该类是在初始化ClassPathXmlApplicationContext ,即实例化。(参考:spring容器的懒加载lazy-init设置
    在调用getBean方法时,直接从缓存中拿到已经实例化的bean,详细实现见下面源码分析。

    此外,bean实例化有优先级之分,原因是实现了BeanFactoryPostProcessor的接口在refresh方法执行invokeBeanFactoryPostProcessors(beanFactory);时就会实例化bean。
    因为任何实现了BeanFactoryPostProcessor接口的bean首先要做的事就是先把自己实例化好

    1、调用的获取bean的方法是org.springframework.context.support.AbstractApplicationContext#getBean(java.lang.Class<T>),源码如下:

    	@Override
    	public Object getBean(String name) throws BeansException {
    		assertBeanFactoryActive();
    		return getBeanFactory().getBean(name);
    	}
    

    2、上面调用了org.springframework.context.support.AbstractApplicationContext#getBeanFactory方法

    @Override
    public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
    
    

    该方法是个抽象方法,有两个实现类

    	
    
    //GenericApplicationContext
        private final DefaultListableBeanFactory beanFactory;
    	/**
    	 * Return the single internal BeanFactory held by this context
    	 * (as ConfigurableListableBeanFactory).
    	 */
    	@Override
    	public final ConfigurableListableBeanFactory getBeanFactory() {
    		return this.beanFactory;
    	}
    	
    //AbstractRefreshableApplicationContext
        /** Bean factory for this context */
    	private DefaultListableBeanFactory beanFactory;
    	@Override
    	public final ConfigurableListableBeanFactory getBeanFactory() {
    		synchronized (this.beanFactoryMonitor) {
    			if (this.beanFactory == null) {
    				throw new IllegalStateException("BeanFactory not initialized or already closed - " +
    						"call 'refresh' before accessing beans via the ApplicationContext");
    			}
    			return this.beanFactory;
    		}
    	}
    

    最终都是得到DefaultListableBeanFactory,因此调用的是org.springframework.beans.factory.support.DefaultListableBeanFactory#getBean(java.lang.Class<T>)方法,该方法又调用本类中的org.springframework.beans.factory.support.DefaultListableBeanFactory#getBean(java.lang.Class<T>, java.lang.Object...)方法。

    	@Override
    	public <T> T getBean(Class<T> requiredType) throws BeansException {
    		return getBean(requiredType, (Object[]) null);
    	}
    
    	@Override
    	public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException {
    		NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, args);
    		if (namedBean != null) {
    			return namedBean.getBeanInstance();
    		}
    		BeanFactory parent = getParentBeanFactory();
    		if (parent != null) {
    			return parent.getBean(requiredType, args);
    		}
    		throw new NoSuchBeanDefinitionException(requiredType);
    	}
    

    3、接着来看DefaultListableBeanFactory中的resolveNamedBean方法。
    该方法从xml解析注册到Spring容器中的bean中查找bean的声名,看是否存在该名字的bean。
    然后进行实例化,并返回。

    @SuppressWarnings("unchecked")
    	private <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType, Object... args) throws BeansException {
    		Assert.notNull(requiredType, "Required type must not be null");
    		String[] candidateNames = getBeanNamesForType(requiredType);//查找候选的bean名称
    
    		if (candidateNames.length > 1) { //如果有重名的需要进一步处理
    			List<String> autowireCandidates = new ArrayList<String>(candidateNames.length);
    			for (String beanName : candidateNames) {
    				if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) {
    					autowireCandidates.add(beanName);
    				}
    			}
    			if (!autowireCandidates.isEmpty()) {
    				candidateNames = autowireCandidates.toArray(new String[autowireCandidates.size()]);
    			}
    		}
    
    		if (candidateNames.length == 1) {//如果只有一个,直接进行实例化
    			String beanName = candidateNames[0];
    			return new NamedBeanHolder<T>(beanName, getBean(beanName, requiredType, args));
    		}
    		else if (candidateNames.length > 1) { //如果有重名的需要进一步处理
    			Map<String, Object> candidates = new LinkedHashMap<String, Object>(candidateNames.length);
    			for (String beanName : candidateNames) {
    				if (containsSingleton(beanName)) {
    					candidates.put(beanName, getBean(beanName, requiredType, args));
    				}
    				else {
    					candidates.put(beanName, getType(beanName));
    				}
    			}
    			String candidateName = determinePrimaryCandidate(candidates, requiredType);
    			if (candidateName == null) {
    				candidateName = determineHighestPriorityCandidate(candidates, requiredType);
    			}
    			if (candidateName != null) {
    				Object beanInstance = candidates.get(candidateName);
    				if (beanInstance instanceof Class) {
    					beanInstance = getBean(candidateName, requiredType, args);
    				}
    				return new NamedBeanHolder<T>(candidateName, (T) beanInstance);
    			}
    			throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet());
    		}
    
    		return null;
    	}
    

    bean的名称存放在

    	/** List of bean definition names, in registration order */
    	private volatile List<String> beanDefinitionNames = new ArrayList<String>(256);
    

    4、上面找到beanName之后调用org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String, java.lang.Class<T>, java.lang.Object...)实例化bean
    参考:
    Spring源码系列:依赖注入(一)(AbstractBeanFactory-getBean)
    Spring的Bean-singleton模式
    做一个合格的程序猿之浅析Spring IoC源码(十一)Spring refresh()方法解析之一

    doGetBean代码的执行顺序是:

    1 首先先去实例化好的bean中去找,如果找到,直接返回

    2 然后去当前beanfactory中父类factory找,如果能找到父类的factory,则叫父类去返回,(与jvm的classloader的双亲加载比较像~)

    3 如果都没有找到,则开始初次实例化,先标记开始实例化

    4 开始查看当前要实例化的bean是否依赖于其他的bean,如果依赖,则先实例化依赖的bean,如果依赖的bean还依赖于其他的bean,则接着递归创建

    5 如果创建的bean是单例(spring默认单例)接着创建

    	/**
    	 * 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 when creating a bean instance using explicit arguments
    	 * (only applied when creating a new instance as opposed to retrieving an existing one)
    	 * @return an instance of the bean
    	 * @throws BeansException if the bean could not be created
    	 */
    	public <T> T getBean(String name, Class<T> requiredType, Object... args) throws BeansException {
    		return doGetBean(name, requiredType, args, false);
    	}
    

    调用了

    	/**
    	 * 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 when creating a bean instance using explicit arguments
    	 * (only applied when creating a new instance as opposed to retrieving an existing one)
    	 * @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 {
    
    		final String beanName = transformedBeanName(name);
    		Object bean;
    
    		// Eagerly check singleton cache for manually registered singletons.在已经实例化的bean的缓存中查找
    		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 + "'");
    				}
    			}
    			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是否有该实例
    			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.如果没有,去父beanFactory实例化
    					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 = getMergedLocalBeanDefinition(beanName);
    				checkMergedBeanDefinition(mbd, beanName, args);
    
    				// Guarantee initialization of beans that the current bean depends on.
    				//如果该类有依赖的bean,先实例化依赖的bean
    				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);
    					}
    				}
    
    				// Create bean instance.进行实例化
    				if (mbd.isSingleton()) {
    				//单例的bean在此处实例化
    				//此处调用org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)实例化
    					sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
    						@Override
    						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);
    				}
    
    				else if (mbd.isPrototype()) {//prototype类型的bean在这里实例化
    					// 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);
    				}
    
    				else {
    					String scopeName = mbd.getScope();
    					final Scope scope = this.scopes.get(scopeName);
    					if (scope == null) {
    						throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
    					}
    					try {
    						Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
    							@Override
    							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;
    	}
    

    5、上面调用了org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)对单例bean进行实例化,在该步由于bean已经在AbstractApplicationContext构造方法执行时调用refresh对非懒加载的bean已经实例化,因此这里直接从缓存singletonObjects中获取bean实例并返回。下面的第6、7步是bean未实例化时进行实例化的主要流程(refresh实例化bean时也是调用这个流程)。

    源码如下:

    /**
    	 * Return the (raw) singleton object registered under the given name,
    	 * creating and registering a new one if none registered yet.
    	 * @param beanName the name of the bean
    	 * @param singletonFactory the ObjectFactory to lazily create the singleton
    	 * with, if necessary
    	 * @return the registered singleton object
    	 */
    	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
    		Assert.notNull(beanName, "'beanName' must not be null");
    		synchronized (this.singletonObjects) {
    			Object singletonObject = this.singletonObjects.get(beanName);
    			if (singletonObject == null) {
    				if (this.singletonsCurrentlyInDestruction) {
    					throw new BeanCreationNotAllowedException(beanName,
    							"Singleton bean creation not allowed while singletons of this factory are in destruction " +
    							"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
    				}
    				if (logger.isDebugEnabled()) {
    					logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
    				}
    				beforeSingletonCreation(beanName);
    				boolean newSingleton = false;
    				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
    				if (recordSuppressedExceptions) {
    					this.suppressedExceptions = new LinkedHashSet<Exception>();
    				}
    				try {
    				    //此处的singletonFactory是传入的new ObjectFactory<Object>()匿名类
    					singletonObject = singletonFactory.getObject();
    					newSingleton = true;
    				}
    				catch (IllegalStateException ex) {
    					// Has the singleton object implicitly appeared in the meantime ->
    					// if yes, proceed with it since the exception indicates that state.
    					singletonObject = this.singletonObjects.get(beanName);
    					if (singletonObject == null) {
    						throw ex;
    					}
    				}
    				catch (BeanCreationException ex) {
    					if (recordSuppressedExceptions) {
    						for (Exception suppressedException : this.suppressedExceptions) {
    							ex.addRelatedCause(suppressedException);
    						}
    					}
    					throw ex;
    				}
    				finally {
    					if (recordSuppressedExceptions) {
    						this.suppressedExceptions = null;
    					}
    					afterSingletonCreation(beanName);
    				}
    				if (newSingleton) {
                                            //如果是新的bean实例,添加到缓存singletonObjects中
    					addSingleton(beanName, singletonObject);
    				}
    			}
    			return (singletonObject != NULL_OBJECT ? singletonObject : null);
    		}
    	}
    

    上面代码中的匿名类是在第4步中传入的,这里再次给出源码:

    sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
    						@Override
    						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;
    							}
    						}
    					});
    

    所以实例化调用的是上面的getObject()方法。

    添加到缓存的源码如下。注意添加缓存后,在后续实例化bean前先在缓存中查找,如果存在直接返回实例化的bean。
    org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean调用了org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)来获取缓存的bean实例。

    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingleton
    	/**
    	 * Add the given singleton object to the singleton cache of this factory.
    	 * <p>To be called for eager registration of singletons.
    	 * @param beanName the name of the bean
    	 * @param singletonObject the singleton object
    	 */
    	protected void addSingleton(String beanName, Object singletonObject) {
    		synchronized (this.singletonObjects) {
    			this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
    			this.singletonFactories.remove(beanName);
    			this.earlySingletonObjects.remove(beanName);
    			this.registeredSingletons.add(beanName);
    		}
    	}
    

    6、这里调用了org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])方法实例化bean

    注:要查找createBean方法需要在DefaultListableBeanFactory类中查找,注意参数个数

    /**
    	 * Central method of this class: creates a bean instance,
    	 * populates the bean instance, applies post-processors, etc.
    	 * @see #doCreateBean
    	 */
    	@Override
    	protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
    		if (logger.isDebugEnabled()) {
    			logger.debug("Creating instance of bean '" + beanName + "'");
    		}
    		RootBeanDefinition mbdToUse = 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 = resolveBeanClass(mbd, beanName);
    		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
    			mbdToUse = 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 = resolveBeforeInstantiation(beanName, mbdToUse);
    			if (bean != null) {
    				return bean;
    			}
    		}
    		catch (Throwable ex) {
    			throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
    					"BeanPostProcessor before instantiation of bean failed", ex);
    		}
            //进行实例化
    		Object beanInstance = doCreateBean(beanName, mbdToUse, args);
    		if (logger.isDebugEnabled()) {
    			logger.debug("Finished creating instance of bean '" + beanName + "'");
    		}
    		return beanInstance;
    	}
    

    7、上面调用了org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean实例化bean。根据注释,该方法是Actually create the specified bean

    /**
    	 * 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 explicit arguments to use for constructor or factory method invocation
    	 * @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)
    			throws BeanCreationException {
    
    		// Instantiate the bean.
    		BeanWrapper instanceWrapper = null;
    		if (mbd.isSingleton()) {
    	//1、使用合适的构造函数对bean进行实例化
    	// Create a new instance for the specified bean, using an appropriate instantiation strategy:
    	//factory method, constructor autowiring, or simple instantiation.
    			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 {
    		    //2、这里进行bean初始化,设置属性值
    			populateBean(beanName, mbd, instanceWrapper);
    			if (exposedObject != null) {
    			    3、初始化
    				exposedObject = initializeBean(beanName, exposedObject, mbd);
    			}
    		}
    		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);
    		}
    		catch (BeanDefinitionValidationException ex) {
    			throw new BeanCreationException(
    					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    		}
    
    		return exposedObject;
    	}
    

    三个关键方法源码
    使用构造器初始化bean

    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
    /**
    	 * Create a new instance for the specified bean, using an appropriate instantiation strategy:
    	 * factory method, constructor autowiring, or simple instantiation.
    	 * @param beanName the name of the bean
    	 * @param mbd the bean definition for the bean
    	 * @param args explicit arguments to use for constructor or factory method invocation
    	 * @return BeanWrapper for the new instance
    	 * @see #instantiateUsingFactoryMethod
    	 * @see #autowireConstructor
    	 * @see #instantiateBean
    	 */
    	protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
    		// Make sure bean class is actually resolved at this point.
    		Class<?> beanClass = resolveBeanClass(mbd, beanName);
    
    		if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
    			throw new BeanCreationException(mbd.getResourceDescription(), beanName,
    					"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
    		}
    
    		if (mbd.getFactoryMethodName() != null)  {
    			return instantiateUsingFactoryMethod(beanName, mbd, args);
    		}
    
    		// Shortcut when re-creating the same bean...
    		boolean resolved = false;
    		boolean autowireNecessary = false;
    		if (args == null) {
    			synchronized (mbd.constructorArgumentLock) {
    				if (mbd.resolvedConstructorOrFactoryMethod != null) {
    					resolved = true;
    					autowireNecessary = mbd.constructorArgumentsResolved;
    				}
    			}
    		}
    		if (resolved) {
    			if (autowireNecessary) {
    				return autowireConstructor(beanName, mbd, null, null);
    			}
    			else {
    				return instantiateBean(beanName, mbd);
    			}
    		}
    
    		// Need to determine the constructor...
    		Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    		if (ctors != null ||
    				mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
    				mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {
    			return autowireConstructor(beanName, mbd, ctors, args);
    		}
    
    		// No special handling: simply use no-arg constructor.
    		return instantiateBean(beanName, mbd);
    	}
    

    设置bean属性
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

    /**
    	 * Populate the bean instance in the given BeanWrapper with the property values
    	 * from the bean definition.
    	 * @param beanName the name of the bean
    	 * @param mbd the bean definition for the bean
    	 * @param bw BeanWrapper with bean instance
    	 */
    	protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
    		PropertyValues pvs = mbd.getPropertyValues();
    
    		if (bw == null) {
    			if (!pvs.isEmpty()) {
    				throw new BeanCreationException(
    						mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
    			}
    			else {
    				// Skip property population phase for null instance.
    				return;
    			}
    		}
    
    		// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
    		// state of the bean before properties are set. This can be used, for example,
    		// to support styles of field injection.
    		boolean continueWithPropertyPopulation = true;
    
    		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    			for (BeanPostProcessor bp : getBeanPostProcessors()) {
    				if (bp instanceof InstantiationAwareBeanPostProcessor) {
    					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    						continueWithPropertyPopulation = false;
    						break;
    					}
    				}
    			}
    		}
    
    		if (!continueWithPropertyPopulation) {
    			return;
    		}
    
    		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
    				mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
    			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
    
    			// Add property values based on autowire by name if applicable.
    			if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
    				autowireByName(beanName, mbd, bw, newPvs);
    			}
    
    			// Add property values based on autowire by type if applicable.
    			if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
    				autowireByType(beanName, mbd, bw, newPvs);
    			}
    
    			pvs = newPvs;
    		}
    
    		boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    		boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);
    
    		if (hasInstAwareBpps || needsDepCheck) {
    			PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    			if (hasInstAwareBpps) {
    				for (BeanPostProcessor bp : getBeanPostProcessors()) {
    					if (bp instanceof InstantiationAwareBeanPostProcessor) {
    						InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    						pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
    						if (pvs == null) {
    							return;
    						}
    					}
    				}
    			}
    			if (needsDepCheck) {
    				checkDependencies(beanName, mbd, filteredPds, pvs);
    			}
    		}
    
    		applyPropertyValues(beanName, mbd, bw, pvs);
    	}
    

    可以参考:Spring中获取一个bean的流程-2

    这里会在bean实例化时调用实现BeanPostProcessor的方法对bean进行处理。

    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
    /**
    	 * Initialize the given bean instance, applying factory callbacks
    	 * as well as init methods and bean post processors.
    	 * <p>Called from {@link #createBean} for traditionally defined beans,
    	 * and from {@link #initializeBean} for existing bean instances.
    	 * @param beanName the bean name in the factory (for debugging purposes)
    	 * @param bean the new bean instance we may need to initialize
    	 * @param mbd the bean definition that the bean was created with
    	 * (can also be {@code null}, if given an existing bean instance)
    	 * @return the initialized bean instance (potentially wrapped)
    	 * @see BeanNameAware
    	 * @see BeanClassLoaderAware
    	 * @see BeanFactoryAware
    	 * @see #applyBeanPostProcessorsBeforeInitialization
    	 * @see #invokeInitMethods
    	 * @see #applyBeanPostProcessorsAfterInitialization
    	 */
    	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;
    	}
    	//初始化
    	/**
    	 * Give a bean a chance to react now all its properties are set,
    	 * and a chance to know about its owning bean factory (this object).
    	 * This means checking whether the bean implements InitializingBean or defines
    	 * a custom init method, and invoking the necessary callback(s) if it does.
    	 * @param beanName the bean name in the factory (for debugging purposes)
    	 * @param bean the new bean instance we may need to initialize
    	 * @param mbd the merged bean definition that the bean was created with
    	 * (can also be {@code null}, if given an existing bean instance)
    	 * @throws Throwable if thrown by init methods or by the invocation process
    	 * @see #invokeCustomInitMethod
    	 */
    	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接口方法调用
    				((InitializingBean) bean).afterPropertiesSet();
    			}
    		}
    
    		if (mbd != null) {
    			String initMethodName = mbd.getInitMethodName();
    			if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
    					!mbd.isExternallyManagedInitMethod(initMethodName)) {
    				invokeCustomInitMethod(beanName, bean, mbd);
    			}
    		}
    	}
    
    

    Spring初始化类实例

    最后给出debug出来的Spring初始化bean的流程。

    ServiceAuthToFujitsuClient.afterPropertiesSet() line: 109
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).invokeInitMethods(String, Object, RootBeanDefinition) line: 1367
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1333
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 471
    AbstractAutowireCapableBeanFactory$1.run() line: 409
    AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 380
    AbstractBeanFactory$1.getObject() line: 264
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 220
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class, Object[], boolean) line: 261	-->此处实例化authorization的ref Client
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class, Object[]) line: 185
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 164
    BeanDefinitionValueResolver.resolveReference(Object, RuntimeBeanReference) line: 269
    BeanDefinitionValueResolver.resolveValueIfNecessary(Object, Object) line: 104
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyPropertyValues(String, BeanDefinition, BeanWrapper, PropertyValues) line: 1244
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, AbstractBeanDefinition, BeanWrapper) line: 1008
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 470
    AbstractAutowireCapableBeanFactory$1.run() line: 409
    AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 380
    AbstractBeanFactory$1.getObject() line: 264
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 220
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class, Object[], boolean) line: 261	--->此处实例化ServiceTarget的属性authorization
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class, Object[]) line: 185
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 164
    BeanDefinitionValueResolver.resolveReference(Object, RuntimeBeanReference) line: 269
    BeanDefinitionValueResolver.resolveValueIfNecessary(Object, Object) line: 104
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyPropertyValues(String, BeanDefinition, BeanWrapper, PropertyValues) line: 1244
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, AbstractBeanDefinition, BeanWrapper) line: 1008
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 470
    AbstractAutowireCapableBeanFactory$1.run() line: 409
    AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 380
    AbstractBeanFactory$1.getObject() line: 264
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 220
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class, Object[], boolean) line: 261	--->此处实例化acsService的属性acsServiceTarget
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class, Object[]) line: 185
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 164
    BeanDefinitionValueResolver.resolveReference(Object, RuntimeBeanReference) line: 269
    BeanDefinitionValueResolver.resolveValueIfNecessary(Object, Object) line: 104
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyPropertyValues(String, BeanDefinition, BeanWrapper, PropertyValues) line: 1244
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).populateBean(String, AbstractBeanDefinition, BeanWrapper) line: 1008
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 470
    AbstractAutowireCapableBeanFactory$1.run() line: 409
    AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 380
    AbstractBeanFactory$1.getObject() line: 264
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 220
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class, Object[], boolean) line: 261	 --->此处实例化acsService
    DefaultListableBeanFactory(AbstractBeanFactory).getTypeForFactoryBean(String, RootBeanDefinition) line: 1198	调用了doGetBean
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).getTypeForFactoryBean(String, RootBeanDefinition) line: 625
    DefaultListableBeanFactory(AbstractBeanFactory).isTypeMatch(String, Class) line: 450 --->此处如果是factorybean类型的,会对其进行实例化
    mdb变量实时值:
    Root bean: class [org.springframework.aop.framework.ProxyFactoryBean]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [acs-basic.xml]
    beanName为acsService
    
    // Check bean class whether we're dealing with a FactoryBean.
    if (FactoryBean.class.isAssignableFrom(beanClass)) {
    if (!BeanFactoryUtils.isFactoryDereference(name)) {
    // If it's a FactoryBean, we want to look at what it creates, not the factory class.
    Class type = getTypeForFactoryBean(beanName, mbd);
    return (type != null && typeToMatch.isAssignableFrom(type));
    }
    else {
    return typeToMatch.isAssignableFrom(beanClass);
    }
    }
    
    DefaultListableBeanFactory.getBeanNamesForType(Class, boolean, boolean) line: 223	此处会校验所有bean(包括FactoryBean)
    DefaultListableBeanFactory.getBeansOfType(Class, boolean, boolean) line: 303
    DefaultListableBeanFactory.getBeansOfType(Class) line: 297
    ConverterFacade.afterPropertiesSet() line: 85
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).invokeInitMethods(String, Object, RootBeanDefinition) line: 1367
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1333
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 471
    AbstractAutowireCapableBeanFactory$1.run() line: 409
    AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]
    DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 380
    AbstractBeanFactory$1.getObject() line: 264
    DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 220
    DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class, Object[], boolean) line: 261
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class, Object[]) line: 185
    DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 164
    DMCXmlWebApplicationContext(AbstractApplicationContext).getBean(String) line: 881
    DMCXmlWebApplicationContext(AbstractApplicationContext).invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory) line: 534	--->实例化所有实现BeanFactoryPostProcessor的类,此处包括以下类,此时遍历到ConverterFacade#0
    --->[com.huawei.xtvmw.commons.config.ConfigAssembler, org.springframework.beans.factory.config.PropertyPlaceholderConfigurer, com.huawei.xtvmw.commons.rmi.interceptor.RemoteInvocationClassFactory#0, com.huawei.xtvmw.commons.rmi.ServiceInterceptorFactory#0, com.huawei.xtvmw.repository.spi.ConverterFacade#0, adjustSpider, org.springframework.beans.factory.config.CustomEditorConfigurer#0]
    
    DMCXmlWebApplicationContext(AbstractApplicationContext).refresh() line: 363
    ContextLoader.createWebApplicationContext(ServletContext, ApplicationContext) line: 255
    ContextLoader.initWebApplicationContext(ServletContext) line: 199
    DMCContextLoaderServlet(ContextLoaderServlet).init() line: 81
    DMCContextLoaderServlet.init() line: 48
    DMCContextLoaderServlet(GenericServlet).init(ServletConfig) line: 160
    StandardWrapper.initServlet(Servlet) line: 1280
    StandardWrapper.loadServlet() line: 1193
    StandardWrapper.load() line: 1088
    StandardContext.loadOnStartup(Container[]) line: 5033
    StandardContext.startInternal() line: 5317
    StandardContext(LifecycleBase).start() line: 150
    ContainerBase$StartChild.call() line: 1517
    ContainerBase$StartChild.call() line: 1508
    FutureTask$Sync.innerRun() line: 303
    FutureTask<V>.run() line: 138
    ThreadPoolExecutor$Worker.runTask(Runnable) line: 886
    ThreadPoolExecutor$Worker.run() line: 908
    Thread.run() line: 662
    

    总结

    上面对Spring实例化bean的流程做了简单分析,有几个地方需要注意:
    1、使用ClassPathXmlApplicationContext时,会调用refresh方法对所有非懒加载的bean实例化(默认),此后再调用getBean方法会直接从缓存获取
    2、如果设置bean为懒加载,则bean在调用getBean等方法时才会实例化
    3、BeanFactoryPostProcessor的实例化的优先级最高
    4、beanPostProcessor是可以临时修改bean的,它的优先级高于正常实例化bean的,如果beanPostProcessor能返回,则直接返回了
    5、由2、3两点可以知道bean的实例化是有优先级的

  • 相关阅读:
    java8特性 Optional 工具类
    SpringBoot 配置支付宝接口
    Redis宕机 快速恢复
    flowable流程引擎通过模型ID部署流程
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Mybatis 动态执行SQL语句
    idea 访问 jsp 404问题
    变量名的命名
    CSS设计 Search窗口
    jQuery实现Ajax功能示例
  • 原文地址:https://www.cnblogs.com/z00377750/p/9263646.html
Copyright © 2011-2022 走看看