Spring源码分析——SpringIOC

Spring源码分析——SpringIOC

开始

在Spring中,有两种配置方式,一种是xml版本的,另外一种是注解版本的。他们分别对应不同的ApplicationContext。xml版本的是ClassPathXmlApplicationContext,而注解版本的是AnnotationConfigApplicationContext。

// 用我们的配置文件来启动一个 ApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext子类的构造参数

先看ClassPathXmlApplicationContext的构造方法

org.springframework.context.support.ClassPathXmlApplicationContext#ClassPathXmlApplicationContext(java.lang.String[], boolean, org.springframework.context.ApplicationContext)

	public ClassPathXmlApplicationContext(
			String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
			throws BeansException {

		super(parent);
		/*简单的把传入进来的配置文件的classpath路径设置到成员变量configLocations中*/
		setConfigLocations(configLocations);
		if (refresh) {
			/*核心部分,进行BeanFactory的创建,扫描配置文件加载BeanDefinition,Bean的创建和初始化*/
			refresh();
		}
	}

然后就是AnnotationConfigApplicationContext的构造方法

org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.Class<?>…)

	public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		this();
		/**
		 * 解析并注册配置类,也就是我们配置的AppConfig
		 * 解析成BeanDefinition,注册到BeanFactory的成员变量beanDefinitionMap中
		 * 这里的BeanFactory就是DefaultListableBeanFactory
		 */
		register(componentClasses);
		/*核心部分,进行BeanFactory的创建,扫描配置文件加载BeanDefinition,Bean的创建和初始化*/
		refresh();
	}

可以发现,就是在调用refresh() 方法前做了不同的处理。然后就调用refresh()方法,refresh方法会调用到父类AbstractApplicationContext的refresh方法。

refresh方法时Spring中最重要的方法了
org.springframework.context.support.AbstractApplicationContext#refresh

	@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

			/**
			 * Prepare this context for refreshing.
			 * 准备工作,设置启动状态,记录系统时间(不重要)
			 */
			prepareRefresh();

			/**
			 * 创建DefaultListableBeanFactory,
			 * 扫描并注册BeanDefinition到BeanDefinitionMap中,
			 * 返回这个BeanFactory
			 * 注意:
			 * 	如果是注解的bean,不会在这里注册BeanDefinition到BeanDefinitionMap
			 * 	而是在下面的invokeBeanFactoryPostProcessors里,通过bean工厂后置处理器完成
			 */
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			/**
			 * 设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean
			 */
			prepareBeanFactory(beanFactory);

			try {
				// 这个是留给ApplicationContext子类的扩展点,允许在子类中对bean工厂进行后处理。
				postProcessBeanFactory(beanFactory);

				StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
				// 调用上下文中注册为bean的工厂处理器。
				invokeBeanFactoryPostProcessors(beanFactory);

				// 注册 BeanPostProcessor 的实现类,注意看和 BeanFactoryPostProcessor 的区别
				// 此接口两个方法: postProcessBeforeInitialization 和 postProcessAfterInitialization
				// 两个方法分别在 Bean 初始化之前和初始化之后得到执行。注意,到这里 Bean 还没初始化
				registerBeanPostProcessors(beanFactory);
				beanPostProcess.end();

				// 初始化当前 ApplicationContext 的 MessageSource,国际化
				initMessageSource();

				// 初始化当前 ApplicationContext 的事件广播器
				initApplicationEventMulticaster();

				// 从方法名就可以知道,典型的模板方法(钩子方法),
				// 具体的子类可以在这里初始化一些特殊的 Bean(在初始化 singleton beans 之前)
				onRefresh();

				// 注册事件监听器,监听器需要实现 ApplicationListener 接口
				registerListeners();

				/**
				 * 重点方法:
				 * 初始化所有的 singleton beans
				 */
				finishBeanFactoryInitialization(beanFactory);

				// 最后,广播事件,ApplicationContext 初始化完成
				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();
				contextRefresh.end();
			}
		}
	}

上面的方法没必要全都看,我们分析IOC,主要看3个方法就够了

  1. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); 这个是BeanFactory的创建,以及解析配置文件,加载BeanDefinition
  2. invokeBeanFactoryPostProcessors(beanFactory); 这个是触发Bean工厂后置处理器的回调
  3. finishBeanFactoryInitialization(beanFactory); 这个是实例化和初始化所有的bean

BeanFactory的创建,加载BeanDefinition

我们先来看refresh方法中第一个要分析的方法

			/**
			 * 创建DefaultListableBeanFactory,
			 * 扫描并注册BeanDefinition到BeanDefinitionMap中,
			 * 返回这个BeanFactory
			 * 注意:
			 * 	如果是注解的bean,不会在这里注册BeanDefinition到BeanDefinitionMap
			 * 	而是在下面的invokeBeanFactoryPostProcessors里,通过bean工厂后置处理器完成
			 */
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

这个方法里面会创建BeanFactory,具体类型是DefaultListableBeanFactory。并且在创建了DefaultListableBeanFactory之后,会进行配置文件的解析工作,加载BeanDefinition,注册到DefaultListableBeanFactory的beanDefinitionMap中

org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactory

	protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		/* 销毁旧的BeanFactory,创建新的BeanFactory并扫描注册BeanDefinition */
		refreshBeanFactory();
		/* 获取并返回创建的BeanFactory */
		return getBeanFactory();
	}

上面方法分两步

  1. 刷新BeanFactory,也就是销毁旧的BeanFactory,创建新的BeanFactory。然后还会加载BeanDefinition
  2. 获取并返回BeanFactory

我们只要看第一步就可以,因为第一步走完以后,BeanFactory就已经保存在AbstractRefreshableApplicationContext的成员变量中了,也就是当前ApplicationContext实现类的父类的成员变量,所以只是返回成员变量而已。

org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory

	@Override
	protected final void refreshBeanFactory() throws BeansException {
		/**
		 * 检查当前ApplicationContext是否已经有启动的BeanFactory
		 * 如果有,则销毁Bean,关闭BeanFactory
		 */
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
			/*创建DefaultListableBeanFactory*/
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			beanFactory.setSerializationId(getId());
			/*设置BeanFactory的两个属性:是否允许 Bean 覆盖、是否允许循环引用*/
			customizeBeanFactory(beanFactory);
			/*加载 BeanDefinition 到 BeanFactory 中*/
			loadBeanDefinitions(beanFactory);
			/*保存此BeanFactory到成员变量*/
			this.beanFactory = beanFactory;
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}
  1. 先销毁所有的bean,关闭旧的工厂
  2. 创建DefaultListableBeanFactory
  3. 设置两个重要的属性到DefaultListableBeanFactory中:allowBeanDefinitionOverriding-是否允许Bean覆盖,allowCircularReferences-是否允许循环依赖
  4. 加载BeanDefinition

我们直接看的4步,BeanDefinition的加载

org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory)

	@Override
	protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
		/**
		 * Create a new XmlBeanDefinitionReader for the given BeanFactory.
		 * 创建XmlBeanDefinitionReader,他的功能是解析配置文件并加载BeanDefinition
		 */
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

		// Configure the bean definition reader with this context's
		// resource loading environment.
		beanDefinitionReader.setEnvironment(this.getEnvironment());
		beanDefinitionReader.setResourceLoader(this);
		beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

		// Allow a subclass to provide custom initialization of the reader,
		// then proceed with actually loading the bean definitions.
		initBeanDefinitionReader(beanDefinitionReader);

		/* 解析配置文件,加载并注册BeanDefinition */
		loadBeanDefinitions(beanDefinitionReader);
	}
  1. 创建一个XmlBeanDefinitionReader,很明显到时候xml配置文件就是通过他来解析
  2. loadBeanDefinitions(beanDefinitionReader); 解析配置文件,加载并注册BeanDefinition

这里直接看最后一步
org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.xml.XmlBeanDefinitionReader)

	protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
		/**
		 * 当前如果已经有加载的Resource,则先进行前期BeanDefinition的加载
		 * 一般是扩展的子ApplicationContext预设的BeanDefinition
		 * 这里为空,所以先不走
		 */
		Resource[] configResources = getConfigResources();
		if (configResources != null) {
			reader.loadBeanDefinitions(configResources);
		}
		/**
		 * 这里是读取配置文件成Resource,并解析加载BeanDefinition的步骤,
		 * 会走到上面的loadBeanDefinitions(Resource...)方法
		 */
		String[] configLocations = getConfigLocations();
		if (configLocations != null) {
			reader.loadBeanDefinitions(configLocations);
		}
	}

这里有两个分支

  • 如果当有加载了的Resource,则先走上面一个分支,进行预设的配置加载
  • 如果没有预设的Resource,则走下面一步,读取配置文件成Resource对象

但是其实下面一步走后还是会走到上面的方法中。这里一进来,会先走下面一个分支,因为现在没有任何预先加载的Resource对象

org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions(java.lang.String…)

	@Override
	public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {
		Assert.notNull(locations, "Location array must not be null");
		int count = 0;
		for (String location : locations) {
			/*遍历配置文件路径,并一个个加载解析*/
			count += loadBeanDefinitions(location);
		}
		return count;
	}

这里会遍历所有的配置文件路径,解析配置文件。但是我们只传入了一个,通常也只会传入一个,所以这里可以当成是一个配置文件的解析,循环只会走一遍。

org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions(java.lang.String, java.util.Set<org.springframework.core.io.Resource>)

	public int loadBeanDefinitions(String location, @Nullable Set<Resource> actualResources) throws BeanDefinitionStoreException {
		ResourceLoader resourceLoader = getResourceLoader();
		...
		if (resourceLoader instanceof ResourcePatternResolver) {
			try {
				/*读取当前的xml配置文件,成一个resources数组*/
				Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
				/*走到之前的loadBeanDefinitions(Resource...)方法,解析Resource成BeanDefinition*/
				int count = loadBeanDefinitions(resources);
				...
				return count;
			}
			catch (IOException ex) {
				...
			}
		}
		else {
			...
		}
	}
  1. 读取当前的xml配置文件,成一个resources数组
  2. 解析Resource,加载BeanDefinition。这里会走到之前loadBeanDefinitions方法的上面一个分支里的方法

我们直接看第二步

org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.Resource…)

	@Override
	public int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException {
		Assert.notNull(resources, "Resource array must not be null");
		int count = 0;
		for (Resource resource : resources) {
			/*遍历解析Resource,加载BeanDefinition*/
			count += loadBeanDefinitions(resource);
		}
		return count;
	}

遍历Resource,并调用loadBeanDefinitions的另外一个重载的方法,也就是刚刚进来跳过没走的那个分支。

org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.Resource)

	@Override
	public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
		/*把resouce封装成EncodedResource*/
		return loadBeanDefinitions(new EncodedResource(resource));
	}

有调了loadBeanDefinitions的另外一个重载的方法,继续点进去

org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.support.EncodedResource)

	public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
		...

		Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();

		...
		/**
		 * 获取当前配置文件的输入流,封装成InputSource
		 * 并执行BeanDefinitions的加载
		 */
		try (InputStream inputStream = encodedResource.getResource().getInputStream()) {
			InputSource inputSource = new InputSource(inputStream);
			if (encodedResource.getEncoding() != null) {
				inputSource.setEncoding(encodedResource.getEncoding());
			}
			/*真正开始BeanDefinition的加载,在spring中,但凡是doxxx的方法,代表要真正开始,而前面都是铺垫*/
			return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
		}
		catch (IOException ex) {
			...
		}
		finally {
			currentResources.remove(encodedResource);
			if (currentResources.isEmpty()) {
				this.resourcesCurrentlyBeingLoaded.remove();
			}
		}
	}

这里要调用doLoadBeanDefinitions方法,开始真正的BeanDefinition加载工作

org.springframework.beans.factory.xml.XmlBeanDefinitionReader#doLoadBeanDefinitions

	protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
			throws BeanDefinitionStoreException {

		try {
			/*解析成Document对象*/
			Document doc = doLoadDocument(inputSource, resource);
			/*执行BeanDefinition的解析注册*/
			int count = registerBeanDefinitions(doc, resource);
			if (logger.isDebugEnabled()) {
				logger.debug("Loaded " + count + " bean definitions from " + resource);
			}
			return count;
		}
		catch ...
	}
  1. 解析配置文件,获取Document对象
  2. 根据Document对象,加载BeanDefinition

我们看第二步

org.springframework.beans.factory.xml.XmlBeanDefinitionReader#registerBeanDefinitions

	public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
		/*创建BeanDefinitionDocumentReader对象*/
		BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
		int countBefore = getRegistry().getBeanDefinitionCount();
		/*解析Document并注册BeanDefinition*/
		documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
		return getRegistry().getBeanDefinitionCount() - countBefore;
	}
  1. 创建BeanDefinitionDocumentReader对象
  2. 解析Document并注册BeanDefinition

我们看第二步

org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#registerBeanDefinitions

	@Override
	public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
		this.readerContext = readerContext;
		/*获取Document中的Element节点(root)并解析*/
		doRegisterBeanDefinitions(doc.getDocumentElement());
	}

获取根节点,并从根节点开始解析

org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions

	protected void doRegisterBeanDefinitions(Element root) {
		// 我们看名字就知道,BeanDefinitionParserDelegate 必定是一个重要的类,它负责解析 Bean 定义,
		// 这里为什么要定义一个 parent? 看到后面就知道了,是递归问题,
		// 因为 <beans /> 内部是可以定义 <beans /> 的,所以这个方法的 root 其实不一定就是 xml 的根节点,也可以是嵌套在里面的 <beans /> 节点,
		// 从源码分析的角度,我们当做根节点就好了
		BeanDefinitionParserDelegate parent = this.delegate;
		this.delegate = createDelegate(getReaderContext(), root, parent);

		if (this.delegate.isDefaultNamespace(root)) {
			String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
			if (StringUtils.hasText(profileSpec)) {
				String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
						profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
				// We cannot use Profiles.of(...) since profile expressions are not supported
				// in XML config. See SPR-12458 for details.
				if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
					if (logger.isDebugEnabled()) {
						logger.debug("Skipped XML bean definition file due to specified profiles [" + profileSpec +
								"] not matching: " + getReaderContext().getResource());
					}
					return;
				}
			}
		}

		preProcessXml(root);
		/*通过BeanDefinitionParserDelegate解析当前节点*/
		parseBeanDefinitions(root, this.delegate);
		postProcessXml(root);

		this.delegate = parent;
	}

我们直接看parseBeanDefinitions(root, this.delegate);,其他的忽略

org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseBeanDefinitions

	protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
		if (delegate.isDefaultNamespace(root)) {
			NodeList nl = root.getChildNodes();
			for (int i = 0; i < nl.getLength(); i++) {
				Node node = nl.item(i);
				if (node instanceof Element) {
					Element ele = (Element) node;
					if (delegate.isDefaultNamespace(ele)) {
						/*默认的标签*/
						parseDefaultElement(ele, delegate);
					}
					else {
						/*自定义的标签*/
						delegate.parseCustomElement(ele);
					}
				}
			}
		}
		else {
			/*自定义的标签*/
			delegate.parseCustomElement(root);
		}
	}

这里有两种情况

  • 默认标签的解析,就是spring原生的标签
  • 自定义标签的解析,就是其他和spring做整合的框架提供的标签

我们看默认标签的解析

org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseDefaultElement

	private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
		if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
			importBeanDefinitionResource(ele);
		}
		else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
			processAliasRegistration(ele);
		}
		else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
			/*<bean/>解析*/
			processBeanDefinition(ele, delegate);
		}
		else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
			// recurse
			doRegisterBeanDefinitions(ele);
		}
	}

这里涉及四种标签的解析,我们只看最简单的bean标签的解析

	protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
		/*解析当前bean节点为为BeanDefinition,并用BeanDefinitionHolder进行包装*/
		BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
		if (bdHolder != null) {
			bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
			try {
				/**
				 * 里面会调用到DefaultListableBeanFactory的registerBeanDefinition重写方法
				 * 把该BeanDefinition注册到DefaultListableBeanFactory的成员变量beanDefinitionMap中
				 * this.beanDefinitionMap.put(beanName, beanDefinition);
				 */
				BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
			}
			catch (BeanDefinitionStoreException ex) {
				...
			}
			...
		}
	}

processBeanDefinition方法中,当前的流程分两步

  1. 解析当前bean节点为为BeanDefinition,并用BeanDefinitionHolder进行包装
  2. 把BeanDefinition注册到DefaultListableBeanFactory的成员变量beanDefinitionMap中

我们先看第一步

org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseBeanDefinitionElement(org.w3c.dom.Element)

	@Nullable
	public BeanDefinitionHolder parseBeanDefinitionElement(Element ele) {
		return parseBeanDefinitionElement(ele, null);
	}

org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseBeanDefinitionElement(org.w3c.dom.Element, org.springframework.beans.factory.config.BeanDefinition)

	@Nullable
	public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) {
		String id = ele.getAttribute(ID_ATTRIBUTE);
		String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);

		List<String> aliases = new ArrayList<>();
		// 将 name 属性的定义按照 ”逗号、分号、空格“ 切分,形成一个别名列表数组,
		if (StringUtils.hasLength(nameAttr)) {
			String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);
			aliases.addAll(Arrays.asList(nameArr));
		}

		String beanName = id;
		// 如果没有指定id, 那么用别名列表的第一个名字作为beanName
		if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {
			beanName = aliases.remove(0);
			...
		}

		if (containingBean == null) {
			checkNameUniqueness(beanName, aliases, ele);
		}

		// 根据 <bean ...>...</bean> 中的配置创建 BeanDefinition,然后把配置中的信息都设置到实例中
		AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);
		// 到这里,整个 <bean /> 标签就算解析结束了,一个 BeanDefinition 就形成了
		if (beanDefinition != null) {
			// 如果都没有设置 id 和 name,那么此时的 beanName 就会为 null,进入下面这块代码产生
			if (!StringUtils.hasText(beanName)) {
				try {
					if (containingBean != null) {
						beanName = BeanDefinitionReaderUtils.generateBeanName(
								beanDefinition, this.readerContext.getRegistry(), true);
					}
					else {
						beanName = this.readerContext.generateBeanName(beanDefinition);
						String beanClassName = beanDefinition.getBeanClassName();
						if (beanClassName != null &&
								beanName.startsWith(beanClassName) && beanName.length() > beanClassName.length() &&
								!this.readerContext.getRegistry().isBeanNameInUse(beanClassName)) {
							aliases.add(beanClassName);
						}
					}
					...
				}
				catch (Exception ex) {
				...
				}
			}
			String[] aliasesArray = StringUtils.toStringArray(aliases);
			// 返回 BeanDefinitionHolder
			return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);
		}

		return null;
	}

这里重点方法就是中间的 AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean); 其他可以不用看。这里就是Bean标签的解析,BeanDefinition的加载,
然后返回的BeanDefinition在最后被包装成BeanDefinitionHolder返回

org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseBeanDefinitionElement(org.w3c.dom.Element, java.lang.String, org.springframework.beans.factory.config.BeanDefinition)

	@Nullable
	public AbstractBeanDefinition parseBeanDefinitionElement(
			Element ele, String beanName, @Nullable BeanDefinition containingBean) {

		...

		try {
			// 创建 BeanDefinition
			AbstractBeanDefinition bd = createBeanDefinition(className, parent);

			// 设置 BeanDefinition 的一堆属性,这些属性定义在 AbstractBeanDefinition 中
			parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
			bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));

			/**
			 * 下面的一堆是解析 <bean>......</bean> 内部的子元素,
			 * 解析出来以后的信息都放到 bd 的属性中
			 */

			// 解析 <meta />
			parseMetaElements(ele, bd);
			// 解析 <lookup-method />
			parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
			// 解析 <replaced-method />
			parseReplacedMethodSubElements(ele, bd.getMethodOverrides());
			// 解析 <constructor-arg />
			parseConstructorArgElements(ele, bd);
			// 解析 <property />
			parsePropertyElements(ele, bd);
			// 解析 <qualifier />
			parseQualifierElements(ele, bd);

			bd.setResource(this.readerContext.getResource());
			bd.setSource(extractSource(ele));

			return bd;
		}
		catch ...

		return null;
	}

可以看到这里要进行标签的解析了,包括bean标签本身的属性(id,name,class,scope,是否懒加载…),以及他嵌套的其他标签

细枝末节就不看了,bean标签的解析看到这里接续,这里就会返回BeanDefinition,然后再外面就被包装为BeanDefinitionHolder返回了

然后回到processBeanDefinition方法中,看第二步,就是把BeanDefinition注册到DefaultListableBeanFactory的成员变量beanDefinitionMap中

/**
 * 里面会调用到DefaultListableBeanFactory的registerBeanDefinition重写方法
 * 把该BeanDefinition注册到DefaultListableBeanFactory的成员变量beanDefinitionMap中
 * this.beanDefinitionMap.put(beanName, beanDefinition);
 */
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());

org.springframework.beans.factory.support.BeanDefinitionReaderUtils#registerBeanDefinition

	public static void registerBeanDefinition(
			BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
			throws BeanDefinitionStoreException {

		// 获取该BeanDefinition的beanName
		String beanName = definitionHolder.getBeanName();
		// 注册这个 Bean
		registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());

		// 如果还有别名的话,也要根据别名统统注册一遍
		String[] aliases = definitionHolder.getAliases();
		if (aliases != null) {
			for (String alias : aliases) {
				registry.registerAlias(beanName, alias);
			}
		}
	}

这里会获取beanName作为key,BeanDefinition作为value,进行注册。下面是注册别名。

我们直接看Bean的注册

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

	@Override
	public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException {

		...
		
		/*查看此beanName是否已有注册的BeanDefinition*/
		BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
		if (existingDefinition != null) {
			/*如果“允许BeanDefinition覆盖”属性为false,则抛出异常*/
			if (!isAllowBeanDefinitionOverriding()) {
				throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
			}
			else if (existingDefinition.getRole() < beanDefinition.getRole()) {
				...
			}
			else if (!beanDefinition.equals(existingDefinition)) {
				...
			}
			else {
				...
			}
			/* 注册BeanDefinition,其实就是放到一个map中 */
			this.beanDefinitionMap.put(beanName, beanDefinition);
		}
		else {
			if (hasBeanCreationStarted()) {
				...
			}
			else {
				// 最正常的应该是进到这里。
				// 将 BeanDefinition 放到这个 map 中
				this.beanDefinitionMap.put(beanName, beanDefinition);
				// 这是个 ArrayList,所以会按照 bean 配置的顺序保存每一个注册的 Bean 的名字
				this.beanDefinitionNames.add(beanName);
				removeManualSingletonName(beanName);
			}
			this.frozenBeanDefinitionNames = null;
		}
		...
	}

可以看到调用的是DefaultListableBeanFactory重写的方法,this.beanDefinitionMap.put(beanName, beanDefinition); 就是把BeanDefinition放到成员变量beanDefinitionMap,他就是一个Map。

然后依次类推加载完成所有的标签,然后就会返回创建好的DefaultListableBeanFactory,此时他已经报错了所有的BeanDefinition,除了注解方式声明的Bean。因为在AnnotationConfigApplicationContext是没有xml配置文件的,我们传递给他的构造函数的参数是一个配置类的class,他只会在refresh方法执行前先加载这个类,变成BeanDefinition,另外的Bean,要等到refresh方法中的下一步 invokeBeanFactoryPostProcessors(beanFactory); 当中完成。这个也是 AnnotationConfigApplicationContext 和 ClassPathXmlApplicationContext 的另外一个不同点。实际上他们俩的不同,仅限于在配置文件到BeanDefinition的阶段,由BeanDefinition到Bean(也就是Bean的实例化和初始化)这个阶段,他们的逻辑是一样的,因为都是调用父类的方法。

调用上下文中注册为bean的工厂处理器

BeanFactory的创建和BeanDefinition的加载完毕以后,回到refresh方法中,这是已经返回了beanFactory,以ConfigurableListableBeanFactory类型接收。后面会走以下两步方法

// 设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean
prepareBeanFactory(beanFactory);
// 这个是留给ApplicationContext子类的扩展点,允许在子类中对bean工厂进行后处理。
postProcessBeanFactory(beanFactory);

但是不是我们分析的重点,所以不看,直接进入下一步,触发所以已注册的Bean工厂后置处理器的回调,首先看看什么是Bean工厂后置处理器

@FunctionalInterface
public interface BeanFactoryPostProcessor {
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

这个就是Bean工厂后置处理器的接口,实现了这个接口的实现类就是Bean工厂的后置处理器,实现类实现的方法postProcessBeanFactory,会在BeanFactory创建完毕并且BeanDefinition加载后,的得到回调。运行我们去对BeanFactory做一些操作,例如继续往里面添加机构BeanDefinition,或者修改里面的信息

回到refresh方法中,现在refresh方法中走到这一步

// 调用上下文中注册为bean的工厂处理器。
invokeBeanFactoryPostProcessors(beanFactory);

org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors

	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		/**
		 * 这里主要工作是:
		 * 执行所有的注册到Spring中的BeanFactoryPostProcessor的实现类的postProcessBeanFactory方法
		 *
		 * 但是会在此之前先处理:
		 * 调用容器中所有实现了BeanDefinitionRegistryPostProcessor的实现类的postProcessBeanDefinitionRegistry方法
		 * 而BeanDefinitionRegistryPostProcessor又继承了BeanFactoryPostProcessor
		 * 其中Spring-Mybatis就是利用这个方法进行Mapper的扫描和注册成BeanDefinition
		 */
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

		...
	}

org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List<org.springframework.beans.factory.config.BeanFactoryPostProcessor>)

	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		// 首先执行 BeanDefinitionRegistryPostProcessors , 如果有的话.
		Set<String> processedBeans = new HashSet<>();

		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
			/**
			 * 循环遍历所有的BeanFactoryPostProcessor,
			 * 发现是BeanDefinitionRegistryPostProcessor类型,
			 * 则调用他的postProcessBeanDefinitionRegistry.
			 * 把BeanDefinitionRegistry对象传入进去,
			 * 所以这里允许BeanDefinitionRegistryPostProcessor可以继续像容器注册一些额外的BeanDefinition
			 * 例如Spring-Mybatis中注册了所有扫描到的Mapper
			 */
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					registryProcessors.add(registryProcessor);
				}
				else {
					regularPostProcessors.add(postProcessor);
				}
			}

			// Do not initialize FactoryBeans here: We need to leave all regular beans
			// uninitialized to let the bean factory post-processors apply to them!
			// Separate between BeanDefinitionRegistryPostProcessors that implement
			// PriorityOrdered, Ordered, and the rest.
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			/* 通过BeanFactoryPostProcesser完成注解版BeanDefinition的解析注册 */
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
			currentRegistryProcessors.clear();

			// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
			currentRegistryProcessors.clear();

			// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
			boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					if (!processedBeans.contains(ppName)) {
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						processedBeans.add(ppName);
						reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
				currentRegistryProcessors.clear();
			}

			// 现在, 执行所有工厂后置处理器的 postProcessBeanFactory 回调方法
			/* 再次执行BeanFactoryPostProcesser完成cglib代理 */
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

		else {
			// Invoke factory processors registered with the context instance.
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}

		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let the bean factory post-processors apply to them!
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// Finally, invoke all other BeanFactoryPostProcessors.
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

		// Clear cached merged bean definitions since the post-processors might have
		// modified the original metadata, e.g. replacing placeholders in values...
		beanFactory.clearMetadataCache();
	}

这里方法很长步骤很多,首先是先触发BeanDefinitionRegistryPostProcessors的子类的回调,执行他的则调用他的postProcessBeanDefinitionRegistry方法,BeanDefinitionRegistryPostProcessors也实现了BeanFactoryPostProcessor 接口,所以也是特殊的Bean工厂后置处理器。

然后注解版的Bean这样在这里加载并注册

最后就会进行BeanFactoryPostProcesser的回调

实例化并初始化所有的Bean

现在Bean工厂的后置处理器回调已经完成,回到refresh方法中。

接下啦是注册 BeanPostProcessor 的实现类,也就是Bean后置处理,Bean工厂后置处理器是作用域BeanFactory的,而Bean后置处理器是作用于Bean的。

// 注册 BeanPostProcessor 的实现类,注意看和 BeanFactoryPostProcessor 的区别
// 此接口两个方法: postProcessBeforeInitialization 和 postProcessAfterInitialization
// 两个方法分别在 Bean 初始化之前和初始化之后得到执行。注意,到这里 Bean 还没初始化
registerBeanPostProcessors(beanFactory);

这里就不展开了

然后是国际化

// 初始化当前 ApplicationContext 的 MessageSource,国际化
initMessageSource();

也不展开,然后是

// 初始化当前 ApplicationContext 的事件广播器
initApplicationEventMulticaster();

也不展开,然后是

// 从方法名就可以知道,典型的模板方法(钩子方法),
// 具体的子类可以在这里初始化一些特殊的 Bean(在初始化 singleton beans 之前)
onRefresh();

onRrefresh方法时留给子类的一个扩展点,例如在SpringBoot中,就是通过这个方法,完成Tomcat的手动启动,这里不展开

注册事件监听器

// 注册事件监听器,监听器需要实现 ApplicationListener 接口
registerListeners();

下面进入重点方法,bean的实例化和初始化

// 实例化和初始化所有的bean
finishBeanFactoryInitialization(beanFactory);

org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization

	protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		// 首先,初始化名字为 conversionService 的 Bean
		// 初始化的动作包装在 beanFactory.getBean(...) 中
		if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
				beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
			beanFactory.setConversionService(
					beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
		}

		...

		// 先初始化 LoadTimeWeaverAware 类型的 Bean
		// 一般用于织入第三方模块,在 class 文件载入 JVM 的时候动态织入,
		String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
		for (String weaverAwareName : weaverAwareNames) {
			getBean(weaverAwareName);
		}
		...

		// 开始初始化
		beanFactory.preInstantiateSingletons();
	}

我们直接看最后一步 beanFactory.preInstantiateSingletons();

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

	@Override
	public void preInstantiateSingletons() throws BeansException {
		...
		/* 获取先前扫描注册BeanDefinition是保存的beanNames */
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		// 触发所有的非懒加载的 singleton beans 的初始化操作
		for (String beanName : beanNames) {
			// 合并父 Bean 中的配置,注意 <bean id="" class="" parent="" /> 中的 parent
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			// 非抽象、非懒加载的 singletons。如果配置了 'abstract = true',那是不需要初始化的
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				// 处理 FactoryBean
				if (isFactoryBean(beanName)) {
					// FactoryBean 的话,在 beanName 前面加上 ‘&’ 符号。再调用 getBean,getBean
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						FactoryBean<?> factory = (FactoryBean<?>) bean;
						boolean isEagerInit;
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
							isEagerInit = AccessController.doPrivileged(
									(PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean<?>) factory).isEagerInit());
						}
						if (isEagerInit) {
							getBean(beanName);
						}
					}
				}
				else {
					// 对于普通的 Bean,只要调用 getBean(beanName) 这个方法就可以进行初始化了
					getBean(beanName);
				}
			}
		}

		...
	}

这里首先从DefaultListableBeanFactory的成员变量beanDefinitionNames中获取所有的beanName,这是之前加载BeanDefinition时注册进去的。然后遍历所有的beanName,调用getBean方法。

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

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

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

	protected <T> T doGetBean(
			String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
			throws BeansException {

		// 获取一个 “正统的” beanName,处理两种情况,一个是前面说的 FactoryBean(前面带 ‘&’),
		// 一个是别名问题,因为这个方法是 getBean,获取 Bean 用的,你要是传一个别名进来,是完全可以的
		String beanName = transformedBeanName(name);

		// 注意跟着这个,这个是返回值
		Object bean;

		/**
		 * 尝试从BeanFactory的三个缓存池中获取该bean
		 * 获取得到则返回,不走下面的创建初始化方法。
		 * 此处作用:
		 * 1.给已经创建过的bean,再调getBean是获取该bean
		 * 2.处理循环依赖时返回该bean的半成品(已创建未初始化)
		 */
		Object sharedInstance = getSingleton(beanName);
		if (sharedInstance != null && args == null) {
			if (logger.isTraceEnabled()) {
				...
			}
			// 下面这个方法:如果是普通 Bean 的话,直接返回 sharedInstance,
			// 如果是 FactoryBean 的话,返回它创建的那个实例对象
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}

		/*第一次getBean,就会进入else分支*/
		else {
			// 当前线程已经创建过了此 beanName 的 prototype 类型的 bean,那么抛异常
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}

			// 检查一下这个 BeanDefinition 在容器中是否存在
			BeanFactory parentBeanFactory = getParentBeanFactory();
			/* 父容器不为空,且当前容器不存在此BeanDefinition */
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				// 如果当前容器不存在这个 Binition,试试父容器中有没有eanDef
				String nameToLookup = originalBeanName(name);
				if (parentBeanFactory instanceof AbstractBeanFactory) {
					return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
							nameToLookup, requiredType, args, typeCheckOnly);
				}
				else if (args != null) {
					// Delegation to parent with explicit args.
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else if (requiredType != null) {
					// No args -> delegate to standard getBean method.
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
				else {
					return (T) parentBeanFactory.getBean(nameToLookup);
				}
			}

			if (!typeCheckOnly) {
				markBeanAsCreated(beanName);
			}

			try {
				StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
						.tag("beanName", name);
				if (requiredType != null) {
					beanCreation.tag("beanType", requiredType::toString);
				}
				/* 准备创建bean,先获取BeanDefinition */
				RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
				checkMergedBeanDefinition(mbd, beanName, args);

				// 先初始化依赖的所有 Bean
				// 注意,这里的依赖指的是 depends-on 中定义的依赖
				String[] dependsOn = mbd.getDependsOn();
				if (dependsOn != null) {
					for (String dep : dependsOn) {
						// 检查是不是有循环依赖,这里的循环依赖和我们前面说的循环依赖又不一样,这里肯定是不允许出现的
						if (isDependent(beanName, dep)) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
						}
						// 注册一下依赖关系
						registerDependentBean(dep, beanName);
						try {
							// 先初始化被依赖项
							getBean(dep);
						}
						catch (NoSuchBeanDefinitionException ex) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
						}
					}
				}

				// singleton 实例的创建分支
				if (mbd.isSingleton()) {
					/* getSingleton会在里面调用此匿名内部类ObjectFactory创建Bean */
					sharedInstance = getSingleton(beanName, () -> {
						try {
							/* 真正创建Bean的方法 */
							return createBean(beanName, mbd, args);
						}
						catch (BeansException ex) {
							destroySingleton(beanName);
							throw ex;
						}
					});
					/**
					 * 获取真正的返回值:
					 * 如果是putongbean,就是此sharedInstance对象
					 * 如果是FactoryBean:
					 * 	1.beanName前带&,则返回该FactoryBean
					 * 	2.否则返回给FactoryBean的getObject返回的Bean
					 */
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}

				// 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);
				}

				// 如果不是 singleton 和 prototype 的话,需要委托给相应的实现类来处理
				else {
					String scopeName = mbd.getScope();
					if (!StringUtils.hasLength(scopeName)) {
						throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");
					}
					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, () -> {
							beforePrototypeCreation(beanName);
							try {
								return createBean(beanName, mbd, args);
							}
							finally {
								afterPrototypeCreation(beanName);
							}
						});
						bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
					}
					catch (IllegalStateException ex) {
						throw new ScopeNotActiveException(beanName, scopeName, ex);
					}
				}
				beanCreation.end();
			}
			catch (BeansException ex) {
				cleanupAfterBeanCreationFailure(beanName);
				throw ex;
			}
		}

		// 最后,检查一下类型对不对,不对的话就抛异常,对的话就返回了
		if (requiredType != null && !requiredType.isInstance(bean)) {
			try {
				T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
				if (convertedBean == null) {
					throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
				}
				return convertedBean;
			}
			catch (TypeMismatchException ex) {
				if (logger.isTraceEnabled()) {
					...
				}
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		return (T) bean;
	}

这里方法很长,但是我们只要看一下几步就可以了

  1. Object sharedInstance = getSingleton(beanName); 先尝试从单例缓存池中获取
  2. sharedInstance = getSingleton(beanName, () -> {})singleton 实例的创建,getSingleton会在里面调用此匿名内部类ObjectFactory创建Bean
  3. createBean(beanName, mbd, args); 匿名内部类ObjectFactory的方法,真正创建Bean的方法

尝试从单例缓存池中获取

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)

	@Override
	@Nullable
	public Object getSingleton(String beanName) {
		/* allowEarlyReference为true表示允许循环引用 */
		return getSingleton(beanName, true);
	}

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)

	@Nullable
	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		/*如果从一级缓存取到则直接返回,一般出现在获取已经完成的bean,或者单向引用 */
		Object singletonObject = this.singletonObjects.get(beanName);
		/*获取不到且当前beanName对应的Bean正在创建中(实例化后初始化前)*/
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				/*先从二级缓存中取*/
				singletonObject = this.earlySingletonObjects.get(beanName);
				/*二级完成取不到 && 允许循环引用*/
				if (singletonObject == null && allowEarlyReference) {
					/*从三级缓存中获取当前Bean对应的ObjectFactory */
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						/*获取到了,则调用getObject,获取当前正在创建中的对象*/
						singletonObject = singletonFactory.getObject();
						/*添加到二级缓存*/
						this.earlySingletonObjects.put(beanName, singletonObject);
						/*从三级缓存中删除,下次就直接从二级缓存中取了*/
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}

这里第一次进来,肯定啥都取不到的,所以返回null

从缓存池取不到,则创建bean

创建bean前后的工作,进行标记

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)

	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(beanName, "Bean name must not be null");
		synchronized (this.singletonObjects) {
			// 尝试从一级缓存中获取,但是第一次进来还是null
			Object singletonObject = this.singletonObjects.get(beanName);
			if (singletonObject == null) {
				// 判断当前实例化的bean是否正在销毁的集合里面
				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()) {
					...
				}
				/**
				 * 当spring觉得可以着手来创建bean的时候首先便是调用beforeSingletonCreation(beanName)
				 * 判断当前正在实例化的bean是否存在正在创建的集合当中
				 * 当他需要正式创建bean的时候他会记录一下这个bean正在创建(add到一个set集合当中)
				 * 其实这个集合主要是为了循环依赖服务的
				 */
				beforeSingletonCreation(beanName);
				boolean newSingleton = false;
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = new LinkedHashSet<>();
				}
				try {
					/**
					 * 调用ObjectFactory对象的getObject方法创建并初始化bean
					 * 就是外面那个lamda表达式
					 * 这一步走完,一个bean的创建和初始就完成了
					 */
					singletonObject = singletonFactory.getObject();
					newSingleton = true;
				}
				catch (IllegalStateException ex) {
					...
				}
				catch (BeanCreationException ex) {
					...
				}
				finally {
					if (recordSuppressedExceptions) {
						this.suppressedExceptions = null;
					}
					/*创建完成以后,把beanName从正在创建中的集合中remove掉 */
					afterSingletonCreation(beanName);
				}
				if (newSingleton) {
					// 添加到一级缓存
					addSingleton(beanName, singletonObject);
				}
			}
			return singletonObject;
		}
	}

这里可以看到,spring在创建bean前后,会进行标记的添加和删除工作,表示当前bean正在创建,而创建完毕了,就删除此标签

标签的添加
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#beforeSingletonCreation

	protected void beforeSingletonCreation(String beanName) {
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
	}

当前bean的beanName添加到singletonsCurrentlyInCreation,代表要正在创建这个bean了

创建完毕,删除标签
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#afterSingletonCreation

	protected void afterSingletonCreation(String beanName) {
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
			throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
		}
	}

从singletonsCurrentlyInCreation中把beanName删除

而singletonsCurrentlyInCreation其实是一个set集合

然后真正bean的创建工作在中间这一行

/**
 * 调用ObjectFactory对象的getObject方法创建并初始化bean
 * 就是外面那个lamda表达式
 * 这一步走完,一个bean的创建和初始就完成了
 */
singletonObject = singletonFactory.getObject();

这里的singletonFactory对象是一个ObjectFactory类型,就是外边的那个lambda表达式,里面会调用
createBean(beanName, mbd, args);方法进行bean的创建

bean的生命周期

下面开始分析Bean的实例化和初始化,也就是bean的生命周期,当然BeanDefinition的加载也可以纳入到bean的生命周期

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

	@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {

		...
		RootBeanDefinition mbdToUse = mbd;

		/* 通过BeanDefinition获取该bean的Class对象 */
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
			mbdToUse = new RootBeanDefinition(mbd);
			mbdToUse.setBeanClass(resolvedClass);
		}

		// 准备方法覆写,这里又涉及到一个概念:MethodOverrides,它来自于 bean 定义中的 <lookup-method />和 <replaced-method />
		try {
			mbdToUse.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
			...
		}

		try {
			// 让 BeanPostProcessor 在这一步有机会返回代理,而不是 bean 实例,InstantiationAwareBeanPostProcessor
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) { // 如果返回了代理,则不会走下面的创建流程
				return bean;
			}
		}
		catch (Throwable ex) {
			...
		}

		try { 
			/* 上面的Class对象已经保存到mbdToUse, 创建 bean */
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			...
			return beanInstance;
		}
		catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
			...
		}
		catch (Throwable ex) {
			...
		}
	}

我们直接看doCreateBean方法

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

	protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {

		// 实例化bean
		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {
			// 实例化 Bean,这里非常关键
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		Object bean = instanceWrapper.getWrappedInstance();
		Class<?> beanType = instanceWrapper.getWrappedClass();
		if (beanType != NullBean.class) {
			mbd.resolvedTargetType = beanType;
		}

		// 涉及接口:MergedBeanDefinitionPostProcessor, 允许 post-processors 修改合并后的bean definition
		synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {
				try {
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				}
				catch (Throwable ex) {
					...
				}
				mbd.postProcessed = true;
			}
		}

		/**
		 * createBeanInstance(beanName, mbd, args)实例化后,初始化前
		 * 判断是否支持循环引用,是否单例 && 支持循环引用 && 正在创建中(beanName在singletonsCurrentlyInCreation中)
		 * this.allowCircularReferences默认为true
		 * 这里为了解决循环引用,先缓存一个工厂,存放实例化后初始化前的单例
		 * org.springframework.beans.factory.ObjectFactory<T>
		 *     T getObject()
		 */
		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			...
			/*在二级缓存中,存放当前bean对应的工厂*/
			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
		}

		// 初始化bean实例.
		Object exposedObject = bean;
		try {
			// 这一步也是非常关键的,这一步负责属性装配,因为前面的实例只是实例化了,并没有设值,这里就是设值
			// 并且标注了@PostConstruct的方法,也会在此调用,属于初始化回调
			populateBean(beanName, mbd, instanceWrapper);
			/**
			 * 执行各种初始化回调,标签中有init-method属性的,执行init-method指向的方法
			 * 实现了InitializingBean 接口接口的执行重写的afterPropertiesSet()方法
			 * 执行各种BeanPostProcessor实现类的两个回调方法(Before & After)
			 */
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}
		catch (Throwable ex) {
			...
		}

		/**
		 * 这里也涉及循环引用的问题:
		 * 此时该bean已经实例化完成,执行了BeanPostProcesser的两个回调方法,
		 * 有可能该Bean的类型已经改变,也就是说和他实例化时的类型不一致,
		 * 因为循环引用是在该bean在实例化后初始化前提前暴露,让别的bean引用而完成的
		 * 此时已经是该bean初始化完成,如果类型不一致,又检测到有其他已经创建完成的bean依赖了这个bean,就会报错
		 */
		if (earlySingletonExposure) {
			// 尝试从缓存中获取单例,注意后面的参数为false,表示不从第三级缓存singletonFactories中获取,为什么呢?因为这里不允许循环依赖
			Object earlySingletonReference = getSingleton(beanName, false);
			//如果不为null,就会进入if条件中,因为earlySingletonReference不为null,说明存在循环引用,
			//为什么呢?因为第一个处理的时候,会将引用放到singletonFactories缓存中,当循环依赖注入的时候,
			//会通过singletonFactories中拿到提前暴露的引用,然后放到第二级缓存earlySingletonObjects中。
			//所以,在这里拿到了earlySingletonReference,表明存在循环引用。
			if (earlySingletonReference != null) {
				//如果相等,那么就什么也不做,将earlySingletonReference返回回去即可
				if (exposedObject == bean) {
					exposedObject = earlySingletonReference;
				}
				/**
				 * 下面就是类型不相等的处理
				 * 类型不相等 && 已经有创建完成的bean依赖此Bean
				 * 满足这两个条件,就报错
				 */
				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
					String[] dependentBeans = getDependentBeans(beanName);
					Set<String> actualDependentBeans = new LinkedHashSet<>(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 " +
								"'getBeanNamesForType' 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的生命周期的过程。重要步骤不多,只是注释比较多

  1. instanceWrapper = createBeanInstance(beanName, mbd, args); 实例化bean
  2. populateBean(beanName, mbd, instanceWrapper); 属性注入,也就是所谓的DI
  3. exposedObject = initializeBean(beanName, exposedObject, mbd); bean的初始化回调
bean的实例化

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance

	protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
		// 确保已经加载了此 class
		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());
		}

		Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
		if (instanceSupplier != null) {
			return obtainFromSupplier(instanceSupplier, beanName);
		}

		if (mbd.getFactoryMethodName() != null) {
			/**
			 * 采用静态工厂方法实例化,注意,不是 FactoryBean
			 * <bean id="clientService" ="examples.ClientService" factory-method="createInstance"/>
			 */
			return instantiateUsingFactoryMethod(beanName, mbd, args);
		}

		// 如果已经解析过则使用功能解析好的构造函数方法,不需要再次锁定。
		// 这里的是通过 mbd.resolvedConstructorOrFactoryMethod 属性来缓存解析过的构造函数。
		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);
			}
		}

		// 利用 SmartInstantiationAwareBeanPostProcessor 进行构造函数的解析
		// SmartInstantiationAwareBeanPostProcessor 是一个接口
		// 具体实现类是 AutowiredAnnotationBeanPostProcessor
		// 根据参数解析构造函数,并将解析出来的构造函数缓存到mdb 的  resolvedConstructorOrFactoryMethod  属性中
		Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
		if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
				mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
			return autowireConstructor(beanName, mbd, ctors, args);
		}

		// Preferred constructors for default construction?
		ctors = mbd.getPreferredConstructors();
		if (ctors != null) {
			// 构造函数自动注入
			return autowireConstructor(beanName, mbd, ctors, null);
		}

		// No special handling: simply use no-arg constructor.
		// 使用默认构造函数构造
		return instantiateBean(beanName, mbd);
	}

我们看一下默认构造函数的处理

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#instantiateBean

	protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
		try {
			Object beanInstance;
			if (System.getSecurityManager() != null) {
				...
			}
			else {
				beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this); // 实例化
			}
			BeanWrapper bw = new BeanWrapperImpl(beanInstance); // 包装成BeanWrapper
			initBeanWrapper(bw);
			return bw;
		}
		catch (Throwable ex) {
			...
		}
	}

org.springframework.beans.factory.support.SimpleInstantiationStrategy#instantiate(org.springframework.beans.factory.support.RootBeanDefinition, java.lang.String, org.springframework.beans.factory.BeanFactory)

	@Override
	public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
		// 如果不存在方法覆写,那就使用 java 反射进行实例化,否则使用 CGLIB,
		// lookup-method 和 replaced-method
		if (!bd.hasMethodOverrides()) {
			Constructor<?> constructorToUse;
			synchronized (bd.constructorArgumentLock) {
				constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
				if (constructorToUse == null) {
					final Class<?> clazz = bd.getBeanClass();
					if (clazz.isInterface()) {
						throw new BeanInstantiationException(clazz, "Specified class is an interface");
					}
					try {
						if (System.getSecurityManager() != null) {
							constructorToUse = AccessController.doPrivileged(
									(PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);
						}
						else {
							constructorToUse = clazz.getDeclaredConstructor();
						}
						bd.resolvedConstructorOrFactoryMethod = constructorToUse;
					}
					catch (Throwable ex) {
						throw new BeanInstantiationException(clazz, "No default constructor found", ex);
					}
				}
			}
			// 利用构造方法进行实例化
			return BeanUtils.instantiateClass(constructorToUse);
		}
		else {
			// 存在方法覆写,利用 CGLIB 来完成实例化,需要依赖于 CGLIB 生成子类
			return instantiateWithMethodInjection(bd, beanName, owner);
		}
	}

BeanUtils.instantiateClass(constructorToUse);里面就是通过构造函数反射实例,然后返回实例化对象的过程,然后外面有把他包装为BeanWrapper对象返回

属性注入

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

	protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		if (bw == null) {
			if (mbd.hasPropertyValues()) {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
			}
			else {
				// Skip property population phase for null instance.
				return;
			}
		}

		// 到这步的时候,bean 实例化完成(通过工厂方法或构造方法),但是还没开始属性设值,
		// InstantiationAwareBeanPostProcessor 的实现类可以在这里对 bean 进行状态修改
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
				// 调用InstantiationAwareBeanPostProcessor实现类的postProcessAfterInstantiation方法
				if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
					// 如果返回 false,代表不需要进行后续的属性设值,也不需要再经过其他的 BeanPostProcessor 的处理
					return;
				}
			}
		}

		// bean 实例的所有属性都在这里了
		PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

		int resolvedAutowireMode = mbd.getResolvedAutowireMode();
		// 如果自动装配类型为1-byName 或 2-byType 则进入此分支 但这里是标签形式的,不是注解@Autowire
		if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
			// 1-AUTOWIRE_BY_NAME 通过名字找到所有属性值,如果是 bean 依赖,先初始化依赖的 bean。记录依赖关系
			if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
				autowireByName(beanName, mbd, bw, newPvs);
			}
			// 2-AUTOWIRE_BY_TYPE 通过类型装配。复杂一些
			if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
				autowireByType(beanName, mbd, bw, newPvs);
			}
			pvs = newPvs;
		}

		boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
		boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);

		/* 通过BeanPostProcessor完成注解版的自动装配  */
		PropertyDescriptor[] filteredPds = null;
		if (hasInstAwareBpps) {
			if (pvs == null) {
				pvs = mbd.getPropertyValues();
			}
			for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
				PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
				if (pvsToUse == null) {
					if (filteredPds == null) {
						filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
					}
					// 这里有个非常有用的 BeanPostProcessor 进到这里: AutowiredAnnotationBeanPostProcessor
					// 对采用 @Autowired、@Value 注解的依赖进行设值,这里的内容也是非常丰富的
					pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
					if (pvsToUse == null) {
						return;
					}
				}
				pvs = pvsToUse;
			}
		}
		if (needsDepCheck) {
			if (filteredPds == null) {
				filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
			}
			checkDependencies(beanName, mbd, filteredPds, pvs);
		}

		if (pvs != null) {
			// 设置 bean 实例的属性值
			applyPropertyValues(beanName, mbd, bw, pvs);
		}
	}

这里是分为标签版的bean的属性注入处理,和注解版的属性注入的处理
这里涉及自动装配类型,可以先看一下都有哪些类型

org.springframework.beans.factory.config.AutowireCapableBeanFactory

	/**
	 * 手动装配
	 */
	int AUTOWIRE_NO = 0;

	/**
	 * 通过名称自动装配
	 */
	int AUTOWIRE_BY_NAME = 1;

	/**
	 * 通过类型自动状态
	 */
	int AUTOWIRE_BY_TYPE = 2;

	/**
	 * 通过构造器自动装配
	 */
	int AUTOWIRE_CONSTRUCTOR = 3;

	/**
	 * @autowired 的自动装配类型
	 */
	@Deprecated
	int AUTOWIRE_AUTODETECT = 4;

我们看看一下autowireByName方法的处理,也就是通过beanName自动装配

	protected void autowireByName(
			String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {

		String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
		for (String propertyName : propertyNames) {
			if (containsBean(propertyName)) {
				/**
				 * 属性注入,getBean获取依赖的Bean,有可能没有,需要创建
				 * 有可能已经创建完成,直接从一级缓存singleObjects中获取,
				 * 或者涉及到循环引用,从三级缓存SingletonFactoryes中获取
				 */
				Object bean = getBean(propertyName);
				pvs.add(propertyName, bean);
				registerDependentBean(propertyName, beanName);
				if (logger.isTraceEnabled()) {
					...
				}
			}
			else {
				if (logger.isTraceEnabled()) {
					...
				}
			}
		}
	}

可以看到如果属性中引用了另外一个bean,会在此调用getBean方法进行该bean的创建,涉及到循环依赖的东西,这里先不看了

初始化回调

属性注入完毕以后,就要进入该bean的初始化回调工作

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

	protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			// 如果 bean 实现了 BeanNameAware、BeanClassLoaderAware 或 BeanFactoryAware 接口,回调
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			// BeanPostProcessor 的 postProcessBeforeInitialization 回调
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
			// 处理 bean 中定义的 init-method,
			// 或者如果 bean 实现了 InitializingBean 接口,调用 afterPropertiesSet() 方法
			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()) {
			/**
			 * BeanPostProcessor 的 postProcessAfterInitialization 回调
			 * Aop就在此处完成
			 */
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}

可以清晰的看到回调流程

  1. 如果 bean 实现了 BeanNameAware、BeanClassLoaderAware 或 BeanFactoryAware 接口,回调
    如果该bean实现了BeanNameAware接口,则回调setBeanName(String name)方法;如果实现了BeanClassLoaderAware接口,则回调setBeanClassLoader(ClassLoader classLoader)方法;如果实现了BeanFactoryAware接口,则回调setBeanFactory(BeanFactory beanFactory)方法
  2. BeanPostProcessor的实现类(也就是Bean后置处理器) 的 postProcessBeforeInitialization 回调
  3. 处理 bean 中定义的 init-method,或者如果 bean 实现了 InitializingBean 接口,调用 afterPropertiesSet() 方法
  4. BeanPostProcessor的实现类 postProcessAfterInitialization 回调

但是有一点要注意,@PostConstruct标注的方法不在此处回调,而是在属性注入这一步

至此一个bean的实例化和初始化就完成了,该bean进入可以使用的状态

bean的销毁

每一个bean最后都会有一步销毁的工作,这是他生命周期的最后阶段

// 销毁所有的bean,实现了DisposableBean接口的bean,则回调重写方法destroy()
// 还有xml中配置了destroy-mothod实现的bean,执行指定的销毁回调
// 以及bean中 @PreDestroy标注的方法
destroyBeans();
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值