Spring容器初始化源码全解析

容器概述

org.springframework.context.ApplicationContext接口代表 Spring IoC 容器,负责实例化、配置和组装 bean。容器通过读取配置元数据来获取需要被实例化、配置的对象,
配置元数据包括 XML、Java 注解或 Java BeanConfig等。本文详解容器初始过程。


使用

配置元数据

  1. XML
    先创建一个 xxx.xml 项目中常见 applicationContext.xml。然后配置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myBean" class="com.xia.xmlbean.MyBean">  
        <!-- 这里可以填充属性,注入等。 -->
    </bean>

    <bean id="xxx" class="xxxx">
       <!-- 配置你自己的类 -->
    </bean>
</beans>

关注公众号【Code视角】深入学习Spring等Java相关知识。

  1. 注解 Spring 2.5 引入了对基于注解的配置元数据的支持
package com.xia.annotation;

import org.springframework.stereotype.Component;

@Component
public class MyBean {

    public void helloWord(){
        System.out.println("helloWord");
    }
    
    public static void main(String[] args) {

        ApplicationContext context = new AnnotationConfigApplicationContext("com.xia.annotation");

        context.getBean(MyBean.class).helloWord();
    }
}
  1. Java 从 Spring 3.0 开始,Spring JavaConfig 项目提供的许多特性成为核心 Spring Framework 的一部分
public class MyBean {
    public void helloWord(){
        System.out.println("helloWord");
    }
}


@Configuration
public class ConfigBean {

    @Bean
    public MyBean createMyBean(){
        return new MyBean();
    }

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigBean.class);
        ctx.getBean(MyBean.class).helloWord();
    }
}

实例化容器

// 多种ApplicationContext实现类  
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

使用容器

// 多种ApplicationContext实现类
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

context.getBean(MyBean.class).helloWord();

// 或者这样
GenericApplicationContext context1 = new GenericApplicationContext();
new XmlBeanDefinitionReader(context1).loadBeanDefinitions("applicationContext.xml");
context1.refresh();

context1.getBean(MyBean.class).helloWord();

关注公众号【Code视角】深入学习Spring等Java相关知识。

源码详解

ApplicationContext继承
Spring容器初始化源码全解析_第1张图片

ApplicationContext继承了六个接口、每个接口都赋予了它特有的功能。

核心接口

  1. org.springframework.beans.factory.ListableBeanFactory

ListableBeanFactory继承BeanFactory、BeanFactory定义了bean的获取、创建等。 部分方法如下

    @Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;
	
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
	
	boolean containsBean(String name);
		
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
	
	Object getBean(String name) throws BeansException;
	
	// 这个属性很重要 在FactoryBean创建对象时,会创建两个对象、一个是FactoryBean对象本身,还有一个getBean的对象,这个时候FactoryBean对象的beanName会加上&
	String FACTORY_BEAN_PREFIX = "&";
	

ListableBeanFactory 是对Bean获取上进行增强,对BeanDefinition的统计等 BeanDefinition是bean定义信息。部分方法如下

    // 检查bean定义信息
    boolean containsBeanDefinition(String beanName);
    
    // 获取注册表数量
    int getBeanDefinitionCount();
    
    // 工厂中定义的所有bean的名称。
    String[] getBeanDefinitionNames();
  1. org.springframework.beans.factory.HierarchicalBeanFactory

HierarchicalBeanFactory继承BeanFactory、主要应用于层级体系的容器类、给容器提供了父子容器实现的定义。

    
    // 回当前BeanFactory的父BeanFactory
	@Nullable
	BeanFactory getParentBeanFactory();
	
	// 检测当前BeanFactory中是否包含指定名字的Bean。不去检测其父BeanFactory中是否包含类似于Listable中的查找Bean的方法
	boolean containsLocalBean(String name);

辅助功能接口

  1. org.springframework.core.env.EnvironmentCapable

EnvironmentCapable定义了获取Environment实例的方法,Environment是Spring容器中获取配置属性的对象,属性包括但不限于 系统属性、环境变量等

    // 获取Environment实例
	Environment getEnvironment();
  1. org.springframework.context.MessageSource

MessageSource为容器定义了支持国际化的功能,目前笔者工作中没有遇到过,故不进行编写

  1. org.springframework.context.ApplicationEventPublisher

ApplicationEventPublisher 为容器提供事件发布功能,这里在工作中使用较多,重点,部分方法如下

    // ApplicationEventPublisher被@FunctionalInterface修饰,说明它是函数式接口

    // 通知应用所有已注册且匹配的监听器此ApplicationEvent
    default void publishEvent(ApplicationEvent event) {
		publishEvent((Object) event);
	}
	
	// 通知应用所有已注册且匹配的监听器此Event ,如果这个Event不是一个ApplicationEvent,则其被包裹于PayloadApplicationEvent
	void publishEvent(Object event);
  1. org.springframework.core.io.support.ResourcePatternResolver

ResourcePatternResolver用于解析资源文件的策略接口,继承于ResourceLoader接口,为Spring容器提供了加载资源的能里

ResourceLoader 资源解析

	// 解析资源,返回Resource资源数据
	Resource getResource(String location);
	
	@Nullable
	ClassLoader getClassLoader();

ResourcePatternResolver

    // 对ResourceLoader进行增强,可以加载多个资源数据
	Resource[] getResources(String locationPattern) throws IOException;

这里笔者教大家一个源码小技巧,如果找不到源码接口的实现类,可以试着 Defaultxxx找它的默认实现

把如上几个接口串联起来的话,就会发现,Spring容器提供了,资源加载(元数据加载)、SpringBean获取,注册表数据获取, 事件发布等。 这个时候应该有个疑问: bean创建呢?

ApplicationContext部分实现

  1. org.springframework.context.support.AbstractApplicationContext 抽象类

这个类实现了Spring容器的初始化核心方法org.springframework.context.support.AbstractApplicationContext#refresh,主要对于Bean创建、增强(AOP)、事件发布等。代码的设计模式为++模板方法++,笔者将在下文进行详细讲解。

  1. org.springframework.context.support.ClassPathXmlApplicationContext

  2. org.springframework.context.support.FileSystemXmlApplicationContext

  3. org.springframework.web.context.support.AbstractRefreshableWebApplicationContext

web抽象

  1. org.springframework.web.context.support.AnnotationConfigWebApplicationContext

  2. org.springframework.web.context.support.XmlWebApplicationContext

通过阅读Spring源码发现,Spring在对核心功能扩展的时候都是通过继承现有的类,然后核心不变,只对外围的资源加载和输出进行改变,迎合需求。这种设计需要很高的抽象概念、良好的设计思想。

例如:

org.springframework.context.support.AbstractXmlApplicationContext

子类有:
org.springframework.context.support.ClassPathXmlApplicationContext 
org.springframework.context.support.FileSystemXmlApplicationContext

见名知意, 核心都是通过Xml文件加载数据,只是源头不同。
ClassPathXmlApplicationContext 通过类路径下的xml进行加载。
FileSystemXmlApplicationContext 可以指定绝对路径进行加载xml。

笔者以++org.springframework.context.annotation.AnnotationConfigApplicationContext++为例讲解容器的初始化过程

初始化流程图
Spring容器初始化源码全解析_第2张图片

源码解析

入口方法

public static void main(String[] args) {

    ApplicationContext context = new AnnotationConfigApplicationContext("com.xia.annotation");

    context.getBean(MyBean.class).helloWord();
}

实例化Context对象


    public AnnotationConfigApplicationContext(String... basePackages) {
    	// 调用无参构造方法 这里在创建父类的时候 为应用上下文创建一个默认的DefaultListableBeanFactory
    	this();
    	// 扫描包路径
    	scan(basePackages);
    	// 核心方法 来自于org.springframework.context.support.AbstractApplicationContext#refresh
    	refresh();
    }

org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.String…) 之this();

构造无参构造器,创建注解bean定义读取器,和注册bean元数据扫描器

    public AnnotationConfigApplicationContext() {
        // 分步记录ApplicationStartup各个阶段的时间或者指标数据
		StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
    	//  创建元数据扫描器,因为注解是后期扩展,所以最初的Spring读取器不适用,那么就需要扩展自己的bean定义读取器
		this.reader = new AnnotatedBeanDefinitionReader(this);
		// 创建解析器环境结束
		createAnnotatedBeanDefReader.end();
        // 创建BeanDefinition扫描器
		// 可以用来扫描包或者类,生成bean定义信息 
		this.scanner = new ClassPathBeanDefinitionScanner(this);
	}
  1. new AnnotatedBeanDefinitionReader(this);

1.1 获取Environment,创建ConditionEvaluator,注册内置注解后置处理器。需要传入一个Spring容器,所以这里传入的是this。

    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
        //  getOrCreateEnvironment(registry)
        //  这个方法是为了获取Environment,存储运行时环境变量
		this(registry, getOrCreateEnvironment(registry));
    }
    
    // 然后其重载的构造方法
    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		Assert.notNull(environment, "Environment must not be null");
		this.registry = registry;
		this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
		
		// 注册注解配置的的处理器  
		AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
	}
    

1.2 AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);

给当前传入的BeanDefinitionRegistry注册注解处理器,简单来说就是给当前Spring容器注入内置的注解后置处理器(重要), 下面我们对源码进行解读。

    public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
		registerAnnotationConfigProcessors(registry, null);
	}
	public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
			BeanDefinitionRegistry registry, @Nullable Object source) {
        
        // 得到DefaultListableBeanFactory工厂
		DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
		if (beanFactory != null) {
		    // 判断有没有处理注解的排序器,就是判断容器Comparator dependencyComparator 属性是否是AnnotationAwareOrderComparator
		    // 第一次初始化 这里是null 所以会set一个AnnotationAwareOrderComparator.INSTANCE 自定义注解排序器
			if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
				beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
			}
			
			// 对bean依赖进行处理的策略接口。
			// 这里默认值不是处理注解的实例,所以需要重新set一个ContextAnnotationAutowireCandidateResolver
			// ContextAnnotationAutowireCandidateResolver 这里定义了如何处理延迟加载,会判断【Lazy】这个注解
			if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
				beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
			}
		}
        
        // 创建了一个链表来保存注册的BeanDefinition, 方便传递
		Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
        //注册一个配置类解析器的bean定义(ConfigurationClassPostProcessor)  
        //先从AbstractApplicationContext抽象类中获取到默认的BeanFactory(DefaultListableBeanFactory)判断成员属性beanDefinitionMap中是否包含internalConfigurationAnnotationProcessor处理器 【很显然不包含】  
        if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		     //ConfigurationClassPostProcessor这个处理器主要解析配置类的信息的处理器很重要
			RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
			def.setSource(source);
			 //并添加到容器中 registerPostProcessor这一步 主要创建了BeanDefinitionHolder持有器里边包含BeanDefinition还有beanName,如果有别名会把别名也进行保存,方便通过beanName来查找,强。
            // registerPostProcessor这个方法在转换成持有器的同时,也会往DefaultListableBeanFactory的beanDefinitionMap中保存一份key就是beanName(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)value就是处理器

			beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

        // 设置AutoWired注解解析器的bean定义信息, 这里首次创建是不包含的。
		if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		    // 创建了一个AutowiredAnnotationBeanPostProcessor处理器并创建一个持有器注册到容器中
		    // 持有器就是包含BeanDefinition和这个BeanDefinition的BeanName和别名
		    // AutowiredAnnotationBeanPostProcessor 对AutowiredAnnotationBean解析器
			RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
		if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		    // 对JSR-250 注解支持,这里也会完成注册
			RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		// 检查是否支持jpa, 这里要看是否使用jpa做为持久层框架,否则是不会进行注册的。
		if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		    // JPA注解支持
			RootBeanDefinition def = new RootBeanDefinition();
			try {
				def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
						AnnotationConfigUtils.class.getClassLoader()));
			}
			catch (ClassNotFoundException ex) {
				throw new IllegalStateException(
						"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
			}
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

        // 对事件注解进行处理的处理器 EventListenerMethodProcessor。 首次初始化会进行注册。  【@EventListener 】 这类注解的处理
		if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
			// 事件监听
			RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
		}

        //注册化事件监听工厂处理器  
        //主要处理@EventListener注解配合第7步
		if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
		}

		return beanDefs;
	}

1.2.1 registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME) 方法是如何注册的。 实际来说 就是注册到beanFactory中beanDefinitionMap属性中,后续进行使用。

	private static BeanDefinitionHolder registerPostProcessor(BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {

		definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		// 核心在这个方法 调用容器的注册bean定义信息进行注册
		registry.registerBeanDefinition(beanName, definition);
		return new BeanDefinitionHolder(definition, beanName);
	}

org.springframework.context.support.GenericApplicationContext#registerBeanDefinition

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

		this.beanFactory.registerBeanDefinition(beanName, beanDefinition);
	}

org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition (注册bean定义信息的核心方法,后面代码也都会使用这个 所以需要着重讲解下)

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

		Assert.hasText(beanName, "Bean name must not be empty");
		Assert.notNull(beanDefinition, "BeanDefinition must not be null");

		if (beanDefinition instanceof AbstractBeanDefinition) {
			try {
				((AbstractBeanDefinition) beanDefinition).validate();
			}
			catch (BeanDefinitionValidationException ex) {
				throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
						"Validation of bean definition failed", ex);
			}
		}
        // 是否已经注册
		BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
		if (existingDefinition != null) {
			if (!isAllowBeanDefinitionOverriding()) {
				throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
			}
			else if (existingDefinition.getRole() < beanDefinition.getRole()) {
				// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
				if (logger.isInfoEnabled()) {
					logger.info("Overriding user-defined bean definition for bean '" + beanName +
							"' with a framework-generated bean definition: replacing [" +
							existingDefinition + "] with [" + beanDefinition + "]");
				}
			}
			else if (!beanDefinition.equals(existingDefinition)) {
				if (logger.isDebugEnabled()) {
					logger.debug("Overriding bean definition for bean '" + beanName +
							"' with a different definition: replacing [" + existingDefinition +
							"] with [" + beanDefinition + "]");
				}
			}
			else {
				if (logger.isTraceEnabled()) {
					logger.trace("Overriding bean definition for bean '" + beanName +
							"' with an equivalent definition: replacing [" + existingDefinition +
							"] with [" + beanDefinition + "]");
				}
			}
			// beanFactory 中的注册表就是 beanDefinitionMap 属性
			// private final Map beanDefinitionMap = new ConcurrentHashMap<>(256);
			// 这里是ConcurrentHashMap多线程下线程安全
			this.beanDefinitionMap.put(beanName, beanDefinition);
		}
		else {
		    // 如果是普通的bean元信息, 这里是会判断 当前容器是否处于启动状态,启动状态下,不允许对元素进行修改, 为什么?
		    // 是为了迭代安全, 设计的严谨。
			if (hasBeanCreationStarted()) {
				// Cannot modify startup-time collection elements anymore (for stable iteration)
				synchronized (this.beanDefinitionMap) {
					this.beanDefinitionMap.put(beanName, beanDefinition);
					List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
					updatedDefinitions.addAll(this.beanDefinitionNames);
					updatedDefinitions.add(beanName);
					this.beanDefinitionNames = updatedDefinitions;
					removeManualSingletonName(beanName);
				}
			}
			else {
				// Still in startup registration phase
				this.beanDefinitionMap.put(beanName, beanDefinition);
				this.beanDefinitionNames.add(beanName);
				removeManualSingletonName(beanName);
			}
			this.frozenBeanDefinitionNames = null;
		}

		if (existingDefinition != null || containsSingleton(beanName)) {
			resetBeanDefinition(beanName);
		}
		else if (isConfigurationFrozen()) {
			clearByTypeCache();
		}
	}

【AnnotatedBeanDefinitionReader】小结:总体来说就是初始化了Ioc容器和各种的BeanDefinition的处理器注册到Ioc的BeanDefinitionMap中容器中。值得注意的是,这里都不进行实例化bean对象,为什么? 个人理解:分层、业务解耦 所有的bean创建都放到核心方法进行处理。

  1. this.scanner = new ClassPathBeanDefinitionScanner(this);
    public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) {
        // 需要注意的是这里 useDefaultFilters 参数传的是true。
        // 是否需要处理特定注解 ture 是处理, false 不处理
       // useDefaultFilters这里默认是true,扫描带有@Component ro @Repository ro @Service ro @Controller 的组件
其中@Repository @Service @Controller都实现了@Component
		this(registry, true);
	}
    public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) {
		this(registry, useDefaultFilters, getOrCreateEnvironment(registry));
	}
    public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) {
		this(registry, useDefaultFilters, getOrCreateEnvironment(registry));
	}

吐槽下 调用的真深啊!!!!!

    public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
			Environment environment) {
        // 这里registry本身就实现了ResourceLoader 所以可以当作读取器
		this(registry, useDefaultFilters, environment,
				(registry instanceof ResourceLoader ? (ResourceLoader) registry : null));
	}
	public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
			Environment environment, @Nullable ResourceLoader resourceLoader) {

		Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
		this.registry = registry;
        
        // 这里前面默认传递的是true
		if (useDefaultFilters) {
		   //注册包扫描默认的规则  
			registerDefaultFilters();
		}
		// 设置环境属性。
		setEnvironment(environment);
		//设置资源加载器  
		setResourceLoader(resourceLoader);
	}

2.1 registerDefaultFilters()

当调用这个方法后,会把拦截规则进行添加,简单来说就是说 扫描的时候会把带有Component的类或者 JSR-330,JSR-250规则的类,进行读取,注册注册表。

    protected void registerDefaultFilters() {
        // 添加Component注解拦截规则实例。
		this.includeFilters.add(new AnnotationTypeFilter(Component.class));
		ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();
		try {
			this.includeFilters.add(new AnnotationTypeFilter(
					((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));
			logger.trace("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning");
		}
		catch (ClassNotFoundException ex) {
			// JSR-250 1.1 API (as included in Java EE 6) not available - simply skip.
		}
		try {
			this.includeFilters.add(new AnnotationTypeFilter(
					((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));
			logger.trace("JSR-330 'javax.inject.Named' annotation found and supported for component scanning");
		}
		catch (ClassNotFoundException ex) {
			// JSR-330 API not available - simply skip.
		}
	}

2.2 setResourceLoader(resourceLoader);

    // AnnotationConfigApplicationContext实现了resourceLoader,向上转型
	@Override
	public void setResourceLoader(@Nullable ResourceLoader resourceLoader) {
		
		//判断resourceLoader是否属于resourcePatternResolver是的话强转不是的话PathMatchingResourcePatternResolver创建一个【默认是AnnotationConfigApplicationContext类型】主要作用是解析本地的pattern(类似与正则匹配url)
		this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
	    //创建一个CachingMetadataReaderFactory 并且往DefaultResourceLoader中缓存resourceCaches缓存了一份MetadataReader
        //metadataReader对一个类的各种元数据都封装成一个MetadataReader  一个类的元数据主要包括类上的注解 
		this.metadataReaderFactory = new CachingMetadataReaderFactory(resourceLoader);
	    //初始化了一个CandidateComponentsIndex(带有缓存 key为类加载器下次使用可以直接去缓存中获取)
        //初始化了一个@Componet的index值处理器
		this.componentsIndex = CandidateComponentsIndexLoader.loadIndex(this.resourcePatternResolver.getClassLoader());
	}

【ClassPathBeanDefinitionScanner】小结:主要初始化了@Component的过滤器,设置了一些环境,加载了resourcePatternResolver、metadataReaderFactory(类元数据工厂)、componentsIndex

初始化中的【this()】讲解完毕,这里主要对容器的各种属性赋值,使之有加载、处理元数据的能力和空间

org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.String…) 之scan(basePackages);

这里开始复制

	@Override
	public void scan(String... basePackages) {
		Assert.notEmpty(basePackages, "At least one base package must be specified");
		StartupStep scanPackages = this.getApplicationStartup().start("spring.context.base-packages.scan").tag("packages", () -> Arrays.toString(basePackages));
		// 这里调用 ClassPathBeanDefinitionScanner scan() 方法。
		this.scanner.scan(basePackages);
		scanPackages.end();
	}
  1. org.springframework.context.annotation.ClassPathBeanDefinitionScanner#scan
	public int scan(String... basePackages) {
	    // 获取当前容器中BeanDefinition数量 beanDefinitionMap.size();
		int beanCountAtScanStart = this.registry.getBeanDefinitionCount();
        
        // 扫描元数据
		doScan(basePackages);

		// Register annotation config processors, if necessary.
		if (this.includeAnnotationConfig) {
		    // 这里在初始化的时候 已经注册了内置的后置处理器
			AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
		}
        
        // 业务BeanDefinition数量 需要减去内置处理器的数量
		return (this.registry.getBeanDefinitionCount() - beanCountAtScanStart);
	}

1.1 org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan

根据传入的包路径,把包中带有注解的类解析成BeanDefinition。

    protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
		Assert.notEmpty(basePackages, "At least one base package must be specified");
		Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
		for (String basePackage : basePackages) {
		    // 核心方法 把包中类解析成BeanDefinition。
			Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
			for (BeanDefinition candidate : candidates) {
			
			    // 解析注解Bean定义类中的作用域元信息
				ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
				candidate.setScope(scopeMetadata.getScopeName());
				String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
				if (candidate instanceof AbstractBeanDefinition) {
					// 对BeanDefinition进行完善
					postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
				}
				if (candidate instanceof AnnotatedBeanDefinition) {
				    // 这里也是 进行完善, 主要针对注解的
				    // 最终会调用这个方法 org.springframework.context.annotation.AnnotationConfigUtils#processCommonDefinitionAnnotations(org.springframework.beans.factory.annotation.AnnotatedBeanDefinition, org.springframework.core.type.AnnotatedTypeMetadata)
					// 把metadata中的 @Lazy、 @Primary、@DependsOn、 @Role、 @Description 等元数据赋值到candidate对应的属性上面
					AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
				}
				// 是否存在数据冲突
				if (checkCandidate(beanName, candidate)) {
				    // 生成最终的BeanDefinitionHolder
					BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
					// 根据注解Bean 定义类中配置的作用域,创建相应的代理对象
					definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
					beanDefinitions.add(definitionHolder);
					// 注册到容器中的注册表
					registerBeanDefinition(definitionHolder, this.registry);
				}
			}
		}
		return beanDefinitions;
	}

1.1.1 org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#findCandidateComponents

    public Set<BeanDefinition> findCandidateComponents(String basePackage) {
		if (this.componentsIndex != null && indexSupportsIncludeFilters()) {
			return addCandidateComponentsFromIndex(this.componentsIndex, basePackage);
		}
		else {
		    // 调这里
			return scanCandidateComponents(basePackage);
		}
	}
    private Set<BeanDefinition> scanCandidateComponents(String basePackage) {
		Set<BeanDefinition> candidates = new LinkedHashSet<>();
		try {
		
		    // 通过包路径 拼接Class路径 例如:classpath*:com/xia/annotation/**/*.class
			String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
					resolveBasePackage(basePackage) + '/' + this.resourcePattern;
		    // 构造方法注册的资源解析器,然后class路径加载资源
		    
		    // 调用这个方法org.springframework.context.support.GenericApplicationContext#getResources
		    // 然后又调用了org.springframework.context.support.AbstractApplicationContext#getResources 
		    // 最终调用到 org.springframework.core.io.support.PathMatchingResourcePatternResolver#getResources
		    // 之后调用 org.springframework.core.io.support.PathMatchingResourcePatternResolver#findPathMatchingResources 这个方法把类路径转换成绝对路径找到class文件,然后把file构建成org.springframework.core.io.FileSystemResource#FileSystemResource(java.io.File)类
			Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);
			boolean traceEnabled = logger.isTraceEnabled();
			boolean debugEnabled = logger.isDebugEnabled();
			for (Resource resource : resources) {
				if (traceEnabled) {
					logger.trace("Scanning " + resource);
				}
				try {
				    // 获取注册的MetadataReader,然后传入参数resource
					MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);
					// 这里就是处理前面说的注解规则 类是否@Component 如果有就进行解析, 很重要 请注意
					if (isCandidateComponent(metadataReader)) {
					
					    // new ScannedGenericBeanDefinition 实例 这个时候设置beanName和资源,对于bean标签还未解析
						ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
						sbd.setSource(resource);
						if (isCandidateComponent(sbd)) {
							if (debugEnabled) {
								logger.debug("Identified candidate component class: " + resource);
							}
							// add 返回 
							candidates.add(sbd);
						}
						else {
							if (debugEnabled) {
								logger.debug("Ignored because not a concrete top-level class: " + resource);
							}
						}
					}
					else {
						if (traceEnabled) {
							logger.trace("Ignored because not matching any filter: " + resource);
						}
					}
				}
				catch (FileNotFoundException ex) {
					if (traceEnabled) {
						logger.trace("Ignored non-readable " + resource + ": " + ex.getMessage());
					}
				}
				catch (Throwable ex) {
					throw new BeanDefinitionStoreException(
							"Failed to read candidate component class: " + resource, ex);
				}
			}
		}
		catch (IOException ex) {
			throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);
		}
		return candidates;
	}

1.1.2 org.springframework.context.annotation.AnnotationScopeMetadataResolver#resolveScopeMetadata

	@Override
	public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) {
		ScopeMetadata metadata = new ScopeMetadata();
		if (definition instanceof AnnotatedBeanDefinition) {
			AnnotatedBeanDefinition annDef = (AnnotatedBeanDefinition) definition;
			//从注解Bean定义类的属性中查找属性为”Scope”的值,即@Scope注解的值
		    //annDef.getMetadata().getAnnotationAttributes()方法将Bean
		    //中所有的注解和注解的值存放在一个map集合中
			AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(
					annDef.getMetadata(), this.scopeAnnotationType);
			//将获取到的@Scope注解的值设置到要返回的对象中
			if (attributes != null) {
				metadata.setScopeName(attributes.getString("value"));
				//获取@Scope注解中的proxyMode属性值,在创建代理对象时会用到
				ScopedProxyMode proxyMode = attributes.getEnum("proxyMode");
				//如果@Scope的proxyMode属性为DEFAULT或者NO
				if (proxyMode == ScopedProxyMode.DEFAULT) {
					//设置proxyMode为NO
					proxyMode = this.defaultProxyMode;
				}
				//为返回的元数据设置proxyMode
				metadata.setScopedProxyMode(proxyMode);
			}
		}
		return metadata;
	}

初始化中的【scan(basePackages)】讲解完毕。 主要核心来说就是通过包路径加载所有的Class文件, 然后通过注解规则拦截器,把带有注解的需要交给Spring管理的类进行读取和解析元标签,然后构建成BeanDefinitionHolder注册到beanFactroy工厂。 这里面用到了容器构造时的资源读取器,解析器等。

org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.String…) 之refresh();

【refresh()】方法是Spring容器的核心,其它方法你都可以不懂,但是这个方法 笔者希望大家都可以懂。 核心就是生成bean对象,对bean进行增强,解决循环依赖等问题。

@Override
public void refresh() throws BeansException, IllegalStateException {
	    // private final Object startupShutdownMonitor = new Object();
	    // 通过synchronized进行上锁,所以是线程安全的 
	    // 因为Spring如果创建单例的bean那么是通过Map来保存bean实例来判断是否已经创建了
	    // 如果多线程就会创建多个bean实例了
		synchronized (this.startupShutdownMonitor) {
			StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

			// 刷新上下文
			// 1. 设置容器属性 为活跃状态
			// 2. 把所有的属性标记为可解析的
			// 3. 初始化earlyApplicationListeners属性 (监听)
			// 4. 初始化earlyApplicationEvents属性 (事件)
			prepareRefresh();

			// 刷新子类的工厂
			// 1. 调用 org.springframework.context.support.AbstractApplicationContext#refreshBeanFactory
			// 修改容器为活跃状态并且给容器一个序列化id,可以通过id 进行反序列化
			// 2. 调用org.springframework.context.support.AbstractApplicationContext#getBeanFactory
			// 返回当前容器
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// bean工厂准备 主要为了给beanFactory创建bean提供帮助
			// 这里会setBeanClassLoader、构建bean表达式策略 等等 下文进行详细讲解
			prepareBeanFactory(beanFactory);

			try {
				// 模板方法可由子类重写 进行beanFactory的处理, 扩展方法, 这里没有重写略过
				postProcessBeanFactory(beanFactory);

				StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
				
				// 实例化并调用BeanFactory后置处理器 下文详细讲解
				invokeBeanFactoryPostProcessors(beanFactory);

				// 注册bean的前置后置处理器。(tips:触发时机是bean实例化后,在bean初始化的前后。)
				// org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors 下文详细解释
				registerBeanPostProcessors(beanFactory);
				
				beanPostProcess.end();

				// 初始化国际化用到的资源  这里暂不做讲解
				initMessageSource();

				// 初始化事件监听多路广播器 下文进行详解
				// org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster
				initApplicationEventMulticaster();

				// 扩展方法 交给子类实现 去实例化特殊的bean. 这里未作实现
				onRefresh();

				// 注册事件监听器,发布需要提前广播的事件 下文详解
				registerListeners();

				// 实例化剩下未初始化并且非延迟加载的单例 下文详解
				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();
			}
		}
	}
  1. org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
		//设置类加载器:存在则直接设置/不存在则新建一个默认类加载
		beanFactory.setBeanClassLoader(getClassLoader());
		if (!shouldIgnoreSpel) {
			// 设置EL表达式解析器(Bean初始化完成后填充属性时会用到)
			beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
		}
		//设置属性注册解析器PropertyEdito
		beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
        
	    // 将当前的ApplicationContext对象交给ApplicationContextAwareProcessor类来处理,从而在Aware接口实现类中的注入applicationContext
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
		
		// 这里主要是忽略哪些不需要自动装配的接口,主要都是Spring 容器中的感知接口 可以参考Spring概览文章中的感知接口详解
		beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
		beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
		beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
		beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);

		
        //注册可以解析的自动装配   可以参考Spring概览文章中的感知接口详解
		beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);  
		beanFactory.registerResolvableDependency(ResourceLoader.class, this);
		beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
		beanFactory.registerResolvableDependency(ApplicationContext.class, this);

	    // 如果当前BeanFactory包含loadTimeWeaver Bean,说明存在类加载期织入AspectJ,则把当前BeanFactory交给类加载期BeanPostProcessor实现类LoadTimeWeaverAwareProcessor来处理,从而实现类加载期织入AspectJ目的。
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

		 // 注册当前容器环境environment组件Bean
		if (!NativeDetector.inNativeImage() && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			// Set a temporary ClassLoader for type matching.
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}

		// 注册当前容器环境environment组件Bean
		if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
			beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
		}
		
        //注册系统配置systemProperties组件Bean
		if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
			beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
		}
		
        //注册系统环境systemEnvironment组件Bean
		if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
			beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
		}
		// 这里是各个阶段的启动日志
		if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
			beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
		}
}
  1. org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        // getBeanFactoryPostProcessors()方法 就是返回beanFactoryPostProcessors 属性
        // 这里保存前面解析元数据后的beanFactoryPostProcessors定义信息
        // 然后调用org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List)
        // 传入参数 当前工厂,和所有的beanFactoryPostProcessors定义信息
        // 下文对其进行讲解
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

		// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
		// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
		if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
}

2.1 org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors()

public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
		
		// 保存BeanFactory后置处理器 例如:org.springframework.context.annotation.internalConfigurationAnnotationProcessor
		Set<String> processedBeans = new HashSet<>();

        // 判断beanFactory是否为BeanDefinitionRegistry 这边是默认的DefaultListableBeanFactory,所以为true
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			
			// BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor 
			// BeanFactoryPostProcessor beanFactory的后置处理器;   
			// 在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建时调用
			// BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口 可以对bean的定义进行控制, 后期单独详解
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
            
            // 遍历
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					// 直接执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					// 添加到链表最后执行 postProcessBeanFactory 方法
					registryProcessors.add(registryProcessor);
				} else {
					// 直接添加到链表最后执行 postProcessBeanFactory 方法
					regularPostProcessors.add(postProcessor);
				}
			}

            // 当前需要执行的BeanDefinitionRegistryPostProcessor的链表
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

            // 在当前容器中找到所有实现BeanDefinitionRegistryPostProcessor接口类的全限定名
			String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			
			// 这里是通过容器来创建BeanDefinitionRegistryPostProcessor的实现类
			for (String ppName : postProcessorNames) {
			    // 是否实现了PriorityOrdered接口
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				    // 这里getBean 会创建bean实例,后续笔者会进行每个组件详解,这里就理解 如果到容器中拿数据,没有就进行创建
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			// 进行排序(根据是否实现PriorityOrdered、Ordered接口和order值来排序), 是为了我们开发者控制执行流程
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			// 加入链表 最后进行链式执行
			registryProcessors.addAll(currentRegistryProcessors);
			// 遍历currentRegistryProcessors, 执行postProcessBeanDefinitionRegistry方法
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
			// 清除 便与GC 和 方便后续使用
			currentRegistryProcessors.clear();

            // 这里是进行二次查找 因为执行过程中 可能会生成新的BeanDefinitionRegistryPostProcessor
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
			    // 校验是否实现了Ordered接口,并且还未执行过
				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();

            // 调用所有剩下的BeanDefinitionRegistryPostProcessors 道理同上
			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);
						// 如果有新加的 则需要在重新查一遍看是否有新的BeanDefinitionRegistryPostProcessor 产生,所以设置为true。
						reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
				currentRegistryProcessors.clear();
			}
            
            // 调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法(BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor)
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			// 调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		} else {
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}


        // 上面处理入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor 。
        // 下面开始处理容器中的所有BeanFactoryPostProcessor 其实流程都大同小异。上面的懂了 下面也就好明白了。所以就不在注释

		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

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


		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
        
        // 这里清楚元数据缓存, 因为在上述处理过程中 可能修改了元数据。
		beanFactory.clearMetadataCache();
	}
  1. org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

3.1 org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors()
这个方法和上面的注册BeanFactoryPostProcessor的思想是一致的

  1. 获取容器里面所有的后置处理器名称
  2. getBean创建实例
  3. 排序
  4. 注册到容器链表中 供后续调用
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
        
        // 找出所有实现BeanPostProcessor接口的类全限定名
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

        // 计数
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		// BeanPostProcessorChecker 这个类主要用于记录数据, 也实现了eanPostProcessor。
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

        // 这里分为多个list 是为了区分实现不同的接口的BeanPostProcessor的实现类
        // 但是值得注意的是 注册到容器中的后置处理器链表时都是一个list 我个人理解这样对于排序和后续的遍历处理都比较方便,更优雅。
        // 实现PriorityOrdered接口
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		// Spring内部的BeanPostProcessor
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		// 实现Ordered接口的BeanPostProcessor的beanName
		List<String> orderedPostProcessorNames = new ArrayList<>();
		// 普通BeanPostProcessor的beanName
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
		    // 这里就是判断不同的BeanPostProcessor
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

        // priorityOrderedPostProcessors进行排序 然后注册到容器中
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

        // 非内置的这个时候还没有被初始化 所以需要getBean去创建。
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String ppName : orderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		// 排序并创建
		sortPostProcessors(orderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String ppName : nonOrderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			nonOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		// 注册常规的BeanPostProcessors 这种是开发人员没有进行排序的后置处理器 不是说不进行排序
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

        // 重新注册内置处理器, 为了移动到后置处理器链表尾部
		sortPostProcessors(internalPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

        // 重新注册 同上  因为注册时会先删除再add.
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
  1. org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster
    这里代码不是很复杂,主要是判断有没有自定义的ApplicationEventMulticaster,没有的话就注册一个。 spring监听器 后续笔者也会通过文章进行讲解。
protected void initApplicationEventMulticaster() {
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		// 判断容器中是否有名称为applicationEventMulticaster的bean定义信息。
		if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
			// 如果有就进行创建 然后赋值成员变量applicationEventMulticaster
			this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
			if (logger.isTraceEnabled()) {
				logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
			}
		} else {
		    // 如果没有,则默认采用SimpleApplicationEventMulticaster
			this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
			// 将该对象注入bean工厂 
			// beanName 映射等操作
			beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
			if (logger.isTraceEnabled()) {
				logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
						"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
			}
		}
}
  1. org.springframework.context.support.AbstractApplicationContext#registerListeners
protected void registerListeners() {
		// getApplicationListeners() 获取applicationListeners属性 
		// 保存所有实现ApplicationListener的类实例
		// 然后把实例通过org.springframework.context.event.AbstractApplicationEventMulticaster#addApplicationListener 添加到容器中进行保存
		for (ApplicationListener<?> listener : getApplicationListeners()) {
			getApplicationEventMulticaster().addApplicationListener(listener);
		}

		// 从容器注册表中获取获取未实例化的监听器 第三方jar 和我们自定义的
		// getBeanNamesForType该方法其实是把Class转换然后通过Spring容器的映射集合中获取beanName。
		String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
		for (String listenerBeanName : listenerBeanNames) {
		    // 注册 org.springframework.context.event.AbstractApplicationEventMulticaster.DefaultListenerRetriever#applicationListenerBeans 属性上,供后续使用。
			getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
		}


		// 这里会异步执行早期的广播事件,如果存在的话
		// 这里其实就是Spring容器中哪个阶段的事件进行执行
		Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
		// 只执行一次。其实这里还能反应一个代码技巧,就是提前把成员变量的属性置空。避免其它地方使用到,或者后续出现错误使用,改为局部变量使用。
		this.earlyApplicationEvents = null;
		if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
			for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
			    // 获取监听器注册表 然后调用 multicastEvent()方法
			    // org.springframework.context.event.SimpleApplicationEventMulticaster#multicastEvent(org.springframework.context.ApplicationEvent, org.springframework.core.ResolvableType)
			    // 这个方法会进行异步调用,然后获取所有当前事件(earlyEvent)关联的listener
			    // 然后遍历list调用每个监听器的onApplicationEvent()方法。
				getApplicationEventMulticaster().multicastEvent(earlyEvent);
			}
		}
}
  1. org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
    该方法是吧普通的bean定义信息,进行实例化和初始化,其实就是前期准备工作做完,然后开始干活了(创建bean 实现ioc)
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		// 初始化此上下文的转换服务
		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));
		}

	    // 如果beanFactory之前没有注册嵌入值解析器,则注册默认的嵌入值解析器:主要用于注解属性值的解析。
		if (!beanFactory.hasEmbeddedValueResolver()) {
			beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
		}

		// api https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/weaving/LoadTimeWeaverAware.html
		// 这里我理解就是为了感知加载时间的
		String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
		for (String weaverAwareName : weaverAwareNames) {
			getBean(weaverAwareName);
		}

		// Stop using the temporary ClassLoader for type matching.
		beanFactory.setTempClassLoader(null);

		// 冻结所有bean定义,注册的bean定义不会被修改或进一步后处理,因为马上要创建 Bean 实例对象了 相当于锁
		beanFactory.freezeConfiguration();

		// 实例剩下所有非懒加载bean
		beanFactory.preInstantiateSingletons();
}

6.1 org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons

当前方法会实例化所有的非懒加载的bean,
主要就是循环beanDefinitionNames
通过getBean进行实例化和初始化过程,从而进行ioc和aop增强。

public void preInstantiateSingletons() throws BeansException {
	
	    // 拿到所有的bean定义信息注册表中的所有bean名称(是在注册bean定义信息映射保存的beanName)
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		for (String beanName : beanNames) {
		    // 遍历 然后获取每一个bd (bean定义信息 下文简称bd)
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			// 这里对bean信息的判断,是构造bean定义信息时候设置的
			// 是否抽象bean。
			// 是否单例bean(非单例的需要在特定的场景进行初始化,比如原型bean每次getBean时候进行创建,requst 每次web请求时候创建, 不注册到容器中,使用完会被回收)
			// 是否懒加载 如果懒加载需要在使用的时候判断是否为null, 等于null然后进行创建, 单例的情况会注册到容器中。
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
			    // 是否FactoryBean 
				if (isFactoryBean(beanName)) {
				    // 如果是FactoryBean的话 这里需要创建两个bean
				    // 第一个是FactoryBean 实现类
				    // 在容器中会加上FACTORY_BEAN_PREFIX 前缀 也就是【&】
				    // 走getBean流程 进行创建,所以这里也可以依赖自己创建的其它普通bean
				    // 这里加前缀的beanName 和 beanName 是存放在不同的注册表中的
				    // FactoryBean 创建的单例bean是缓存在这个地方 org.springframework.beans.factory.support.FactoryBeanRegistrySupport#factoryBeanObjectCache
				    // 本身则缓存在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonObjects
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					// 严谨一些判断 确定创建出来的bean类型
					if (bean instanceof FactoryBean) {
						FactoryBean<?> factory = (FactoryBean<?>) bean;
						// 是否懒加载 这里主要判断是否需要是否立即加载这个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) {
						    // 这里立即创建
						    // 这里创建的bean是不带前缀的
						    // 就是 FactoryBean类 getObject()方法返回的bean实例, 下文详解
							getBean(beanName);
						}
					}
				}
				else {
				    // spring管理的普通bean, 进行初始化
					getBean(beanName);
				}
			}
		}

		// 所有bean的后置初始化回调
		for (String beanName : beanNames) {
			Object singletonInstance = getSingleton(beanName);
			// bean初始化成功后进行初始化方法调用 init 方法 @PostConstruct
			if (singletonInstance instanceof SmartInitializingSingleton) {
				StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
						.tag("beanName", beanName);
				SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}, getAccessControlContext());
				}
				else {
				    // bean初始化成功后进行初始化方法调用 init 方法 @PostConstruct 
					smartSingleton.afterSingletonsInstantiated();
				}
				smartInitialize.end();
			}
		}
	}

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

Spring容器创建bean的核心方法 流程是getBean -> doGetBean -> createBean -> doCreateBean.

这里将会进行依赖注入,AOP类增强, 解决循环依赖

@Override
public Object getBean(String name) throws BeansException {
    // 参数1beanName 
    // 参数2 doGetBean是返回泛型 我们在使用的时候可以 context.getBean(MyBean.class)
    // 参数3 构造实例bean 需要的参数
    // 参数4 是否需要类型检查 这里是不需要
	return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {

        // 如果包含【&】前缀就去除
        // 如果是别名就转换成类路径+类名称(全限定名)
		String beanName = transformedBeanName(name);
		Object beanInstance;
        
        // 缓存中是否存在 就是到缓存map里面拿已经实例化的bean
        // getSingleton() 这个方法会涉及到循环依赖问题,三级缓存进行解决,后续文章进行详细讲解
		Object sharedInstance = getSingleton(beanName);
		
		// 第一次sharedInstance一定是等于null的
		// 那么这里为啥会把sharedInstance != null放在前面呢?
		// 我觉得Spring作者很细节, 因为大多数情况下 我们使用容器getBean()时,大多数时候都进行创建了,这样可以更好的执行相对应的代码(个人理解),bean只会创建一次,读大于写。
		if (sharedInstance != null && args == null) {
			
			// 这里等于说非第一次创建
			// 【getObjectForBeanInstance】 判断当前Bean是不是FactoryBean
			// 如果是 就需要判断是想获取FactoryBean 还是调用 FactoryBean.getOBject() 方法
			// 这个时候就会判断传入的beanName,如果加上了【&】,就说明想要返回FactoryBean 那么这里就返回 FactoryBean
			// 如果没有 就先去看缓存里面有没有 org.springframework.beans.factory.support.FactoryBeanRegistrySupport#factoryBeanObjectCache
			// 如果没有再调用getObject();
			// 最终调用 org.springframework.beans.factory.support.FactoryBeanRegistrySupport#postProcessObjectFromFactoryBean 进行增强, 所以我们扩展第三方插件bean 就可以扩展这个
			beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		} else {
		
		    // 判断是否循环依赖
		    // 例如原型bean的循环依赖、单例bean 构造器参数循环依赖 。
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}

            // parentBeanFactory 属性 是否有父容器, 父容器是否包含 类似双亲委派
			BeanFactory parentBeanFactory = getParentBeanFactory();
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				// 这里的流程一样只是 走的是父容器
				String nameToLookup = originalBeanName(name);
				if (parentBeanFactory instanceof AbstractBeanFactory) {
					return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
							nameToLookup, requiredType, args, typeCheckOnly);
				}
				else if (args != null) {
					// 包含args参数时
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else if (requiredType != null) {
					// 非第一次创建时 其实这里理解为 父容器存储这些bean 就好了
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
				else {
					return (T) parentBeanFactory.getBean(nameToLookup);
				}
			}

            // 不需要检查类型时, 标记bean正在创建
			if (!typeCheckOnly) {
				markBeanAsCreated(beanName);
			}

			StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
					.tag("beanName", name);
			try {
				if (requiredType != null) {
					beanCreation.tag("beanType", requiredType::toString);
				}
				
				// 获取并合并bean定义信息
				//判断是否有parentBean,
				// 如果有的话,会根据parentBeanName再次调用getMergedBeanDefinition方法,
				// 如果所有的bean生产都在此方法中生产的话,这里是一次递归调用,也就是要生产bean,先生成他的父bean的BeanDefinition,
				// 注意,此处如果beanName和parentBeanName相同,会判断在DefaultListableBeanFactory时候设定的ParentBeanFactory是否ConfigurableBeanFactory的实例,
				// 如果是,采用它来生产父bean的配置,产生后将子bean的BeanDefinition通过overwriteForm到父bean,也就是覆盖了父bean相同的配置
				RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
				checkMergedBeanDefinition(mbd, beanName, args);

				// @dependsOn 当前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 + "'");
						}
						// 注册bean的依赖关系, 就是对于beanName的定义信息添加依赖的bean属性
						registerDependentBean(dep, beanName);
						try {
						    // 创建依赖的bean
							getBean(dep);
						}
						catch (NoSuchBeanDefinitionException ex) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
						}
					}
				}

				// 如果是单例 这里就开始创建了 核心方法
				if (mbd.isSingleton()) {
				    // 创建bean 入参函数式接口ObjectFactory
				    // 然后调用ObjectFactory的getObject()方法, 
				    //  getObject()方法的实现就是下面{}中的createBean()方法
					sharedInstance = getSingleton(beanName, () -> {
						try {
							return createBean(beanName, mbd, args);
						} catch (BeansException ex) {
							destroySingleton(beanName);
							throw ex;
						}
					});
					
					// 是否是FactoryBean同上讲解。
					beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}
                // 原型bean创建
				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);
					}
					beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
				}
                // 其它类型 比如session request。
				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);
							}
						});
						beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
					}
					catch (IllegalStateException ex) {
						throw new ScopeNotActiveException(beanName, scopeName, ex);
					}
				}
			}
			catch (BeansException ex) {
				beanCreation.tag("exception", ex.getClass().toString());
				beanCreation.tag("message", String.valueOf(ex.getMessage()));
				cleanupAfterBeanCreationFailure(beanName);
				throw ex;
			}
			finally {
				beanCreation.end();
			}
		}
        // 类型转换于检查
		return adaptBeanInstance(name, beanInstance, requiredType);
}

6.1.1.2 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton()

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(beanName, "Bean name must not be null");
		// 创建bean的时候进行锁定整个注册表
		synchronized (this.singletonObjects) {
		    // 是否已经创建
			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()) {
					logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
				}
				// 标记bean为创建状态, 如果已经是的 说明循环依赖
				// 抛出异常 Requested bean is currently in creation: Is there an unresolvable circular reference?
				beforeSingletonCreation(beanName);
				boolean newSingleton = false;
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = new LinkedHashSet<>();
				}
				try {
				    // 调用 核心createBean() 方法。
					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) {
				    // 这里对三级缓存进行处理
				    // 添加到最终的 singletonObjects
				    // 移除 singletonFactories、earlySingletonObjects
				    // 添加到registeredSingletons 
					addSingleton(beanName, singletonObject);
				}
			}
			return singletonObject;
		}
}

6.1.1.3 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean()

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

		if (logger.isTraceEnabled()) {
			logger.trace("Creating instance of bean '" + beanName + "'");
		}
		RootBeanDefinition mbdToUse = mbd;

	    // resolveBeanClass方法解析加载了mbd但是并没有生产Bean,它会生产一个特定的classLoad来加载mbd生成class
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
		// 判断了是否是动态解析的bean和是否是共享合并的bean,在这种情况下mbd是无法储存的解析出来class的,所以这里克隆一下mbd对象。
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
			mbdToUse = new RootBeanDefinition(mbd);
			mbdToUse.setBeanClass(resolvedClass);
		}

		// 准备覆盖的方法
		try {
			mbdToUse.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
		。。。。。
		}

		try {
			// 
			// 这里可以返回一个代理类 而不是返回实际对象
			// 如果有实现InstantiationAwareBeanPostProcessor的 postProcessBeforeInstantiation方法并且这个方法返回一个对象而不是空的情况下的话
			// 就会调用实现了BeanPostProcessor的实例类的后置方法postProcessAfterInitialization 进行类增强
			// 这是就是spring中著名的狸猫换太子!!!
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) {
				return bean;
			}
		}
		catch (Throwable ex) {
			。。。。。
		}

		try {
		    // 如果上面没有进行替换成功,那么就走真正的创建bean流程 下文详解
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			if (logger.isTraceEnabled()) {
				logger.trace("Finished creating instance of bean '" + beanName + "'");
			}
			return beanInstance;
		}
		catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
		。。。。。
		}
		catch (Throwable ex) {
		。。。。。
		}
}

6.1.1.3 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) {
		    // 开始创建 下文讲解
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		// 得到实际创建的bean.  
		Object bean = instanceWrapper.getWrappedInstance();
		Class<?> beanType = instanceWrapper.getWrappedClass();
		if (beanType != NullBean.class) {
		    // 将解析类型 设置 为 beanType
			mbd.resolvedTargetType = beanType;
		}

		// Allow post-processors to modify the merged bean definition.
		synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {
				try {
			        // 对bean定义修改,主要是实现了MergedBeanDefinitionPostProcessor接口的对象, 循环调用,然后修改bean定义信息,也可以自定义扩展
			        // spring 默认的实现会处理一些注解等 @Value、@Autowire
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(mbd.getResourceDescription(), beanName,
							"Post-processing of merged bean definition failed", ex);
				}
				mbd.postProcessed = true;
			}
		}

		//判断是否需要提前曝光, 这里可以参考一些网上讲的spring循环依赖如何解决的
		// 后续文章对循环依赖进行分析
		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			if (logger.isTraceEnabled()) {
				logger.trace("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
		}

		// bean 实例化成功, 下面开始进行初始化.
		Object exposedObject = bean;
		try {
		    // 对bean进行填充,将各个属性值注入,其中可能存在依赖于其他bean的属性,会递归初始化
			populateBean(beanName, mbd, instanceWrapper);
			
			// 第一步调用invokeAwareMethods(beanName, bean); 如果该bean实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware 则进行调用对应方法
			// 第二步循环调用是spring容器种BeanPostProcessor链表种实现类的postProcessBeforeInitialization方法
		    // 第三步invokeInitMethods(beanName, wrappedBean, mbd); 这里就是调用bean实例化后需要调用的init方法。比如是实现了 InitializingBean的bean
			// 最后循环调用是spring容器种BeanPostProcessor链表种实现类的postProcessAfterInitialization方法对类进行增强
			// AOP 就是这一步实现的 
			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);
			// earlySingletonReference 只有在检测到有循环依赖的情况下才会不为空
			if (earlySingletonReference != null) {
				if (exposedObject == bean) {
				    //如果exposedObject 没有在初始化方法中被改变,也就是没有被增强 就直接赋值缓存中的对象引用
					exposedObject = earlySingletonReference;
				}
				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);
						}
					}
					// actualDependentBeans依赖的对象
					// 如果这个时候还有依赖的对象未被创建,说明循环依赖或者其它问题,比如找不到类啥的。这个时候程序需要终止报错。
					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 {
		    // 注册到 disposableBeans 里面,便于后续销毁bean执行特定的方法
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
		。。。。
		}

		return exposedObject;
}
  1. org.springframework.context.support.AbstractApplicationContext#finishRefresh

这个时候容器已经启动成功了,执行容器启动后的一些操作

调用publishEvent(new ContextRefreshedEvent(this)),发出 ContextRefreshEvent 通知,

调用调用lifecycleProcessor的刷新方法,通知生命周期处理器 lifecycleProcessor 刷新过程。

protected void finishRefresh() {
		// 清除上下文级资源缓存(例如ASM元数据)。
		clearResourceCaches();

		// 实例化或初始化lifecycleProcessor 然后进行调用
		// 1. 先判断是否有名称为lifecycleProcessor的bean定义信息,有就走getBean创建
		// 2. 如果没有就创建默认的DefaultLifecycleProcessor 然后注册到容器中去
		initLifecycleProcessor();

		// 调用lifecycleProcessor的刷新方法
		getLifecycleProcessor().onRefresh();

		// 发布ContextRefreshedEvent事件,告诉其监听器,容器已经启动成功,可以做一些相关的操作
		publishEvent(new ContextRefreshedEvent(this));

		//  注册MBean,用于JMX管理 
		// 是否注册了运行是调用 判断方法 (System.getProperty("org.graalvm.nativeimage.imagecode") != null);
		if (!NativeDetector.inNativeImage()) {
			LiveBeansView.registerApplicationContext(this);
		}
}

【refresh()】小结:主要完成bean的创建 IOC、AOP、以及各个阶段事件的发布订阅。这块是Spring种最复杂的地方,里面还有很多方面没有分析到,后续划分成小模块进行分析。

这里笔者说下自己的理解: 在看spring源码过程中,你可以这样理解: 容器就好像一个数据库. 核心是bean定义信息和bean实例注册表,把这两个想象成两张表,然后同时需要保存各种关联表(各种list和Map)在需要的时候通过特定的方法进行读取和使用,然后就是分层去看源码,读取、创建、获取。

【总结】Spring容器初始化已经完成,笔者通过一条线尽可能把自己了解的进行讲解(这里对笔者也是很大的考验’虽然写的很不好’),但是Spring远远不止这些,希望大家多去研究,对源码有更深的研究,同时也能提升自己,在工作中更加得心应手。如果希望和笔者共同探讨Spring源码可以关注公众号【Code视角】


关注公众号【Code视角】深入学习Spring等Java相关知识。
Spring容器初始化源码全解析_第3张图片

你可能感兴趣的:(spring,java,容器,后端)