前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >IOC容器加载-深度解析(全集)

IOC容器加载-深度解析(全集)

作者头像
冬天vs不冷
发布于 2025-01-20 13:47:43
发布于 2025-01-20 13:47:43
6400
代码可运行
举报
文章被收录于专栏:springbootspringboot
运行总次数:0
代码可运行

一、基本组件结构介绍

  1. xxxPostProcessor:后置处理器(各种组件可以bean实例化前后、初始化前后自定义执行操作)
  2. xxxAware:可以将spring容器中对应的对象注入进来
  3. xxxRegistry:对bean或beanDefinition的注册(添加、删除、是否存在等)

二、注解方式IOC容器加载

1、注解方法启动类

配置类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ComponentScan("com.xc.lifecycle.entity")
@Configuration
public class Config {
    @Bean()
    public Book book(){
        return new Book();
    }
}

启动类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
    public static void main(String[] args) {
        //创建注解容器,入参为配置类
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        //获取某个bean
        Book book = context.getBean("book", Book.class);
        System.out.println(book);
        //关闭容器
        context.close();
    }
}

2、AnnotationConfigApplicationContext 的构造方法

2.1、创建bean工厂-beanFactory

this();调用AnnotationConfigApplicationContext 的无参构造方法

调用当前类的无参构造,还会调用父类的无参构造,先看下父类无参构造做的事情。

接下来继续查看AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner的创建

2.1.1、注册默认后置处理器

调用AnnotatedBeanDefinitionReader的有参构造方法

注册默认后置处理器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
		BeanDefinitionRegistry registry, @Nullable Object source) {
	//获取之前创建好的DefaultListableBeanFactory对象,beanFactory实例
	DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
	//为beanFactory添加两属性
	if (beanFactory != null) {
		if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
			beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
		}
		if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
			beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
		}
	}
	//创建8长度集合
	Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
	//查询beanDefinitionMap是否有
	//internalConfigurationAnnotationProcessor =ConfigurationClassPostProcessor
	//(内部注解配置后置处理器)
	if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
		def.setSource(source);
		//注册到beanDefinitionMap中,并添加到beanDefs集合中
		beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
	}
	//注册internalAutowiredAnnotationProcessor = AutowiredAnnotationBeanPostProcessor
	//与上面一样
	if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
	}

	// JSR-250,是java定义的一些注解,spring支持这注解。大致有:@PostConstruct@PreDestroy@Resource
	//注册internalCommonAnnotationProcessor = CommonAnnotationBeanPostProcessor
	if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
		def.setSource(source);
		beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
	}

	// spring注册支持jpa注解的beanFactory后置处理器
	if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
		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));
	}
	//注册事件监听后置处理器
	//internalEventListenerProcessor = EventListenerMethodProcessor
	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));
	}
	//注册事件监听工厂
	//internalEventListenerFactory = DefaultEventListenerFactory
	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;
}

查看一共注册的beanDefinition

1. internalConfigurationAnnotationProcessor = ConfigurationClassPostProcessor 注解配置后置处理器 2. internalAutowiredAnnotationProcessor = AutowiredAnnotationBeanPostProcessor @Autowired注解后置处理器 3. internalCommonAnnotationProcessor = CommonAnnotationBeanPostProcessor java注解@Resource等注解后置处理器 4. internalEventListenerProcessor = EventListenerMethodProcessor 事件监听后置处理器 5. internalEventListenerFactory = DefaultEventListenerFactory 事件监听工厂

2.1.2、自定义扫描包功能

查看ClassPathBeanDefinitionScanner的构造函数 没太大用,主要为了扩展AnnotationConfigApplicationContext添加一个自助扫描的包的功能;一般用不到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
context.scan("com.xc.lifecycle.pojo");
2.2、注册配置类(Config.class)

register(componentClasses);

bean的注册:AnnotationConfigApplicationContext registry.registerBeanDefinition(…) 将bean添加到beanDefinitionMap中,若有别名,再用别名添加一个相同的对象

至此,配置类注册到beanDefinitionMap中了。

2.3、容器刷新
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// 1、刷新前预处理
		prepareRefresh();

		// 2、获取最新的bean工厂
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

		// 3、注册bean工厂的类加载器和部分后置处理器
		prepareBeanFactory(beanFactory);

		try {
			// 4、bean工厂的后置处理器(子类实现)
			postProcessBeanFactory(beanFactory);

			// 5、执行bean工厂的后置处理器
			invokeBeanFactoryPostProcessors(beanFactory);

			// 6、实例化并注册所有的后置处理器
			registerBeanPostProcessors(beanFactory);

			// 7、初始化国际化组件
			initMessageSource();

			// 8、初始化事件多播器(用来广播事件)
			initApplicationEventMulticaster();

			// 9、子类实现,扩展其他bean
			onRefresh();

			// 10、注册监听器
			registerListeners();

			// 11、实例化,初始化所有的非懒加载的单例bean
			finishBeanFactoryInitialization(beanFactory);

			// 12、最后刷新,发布相应事件
			finishRefresh();
		}

		catch (BeansException ex) {
			if (logger.isWarnEnabled()) {
				logger.warn("Exception encountered during context initialization - " +
						"cancelling refresh attempt: " + ex);
			}

			// 销毁已创建的单例bean
			destroyBeans();

			// 重置容器激活标签
			cancelRefresh(ex);

			// 抛异常
			throw ex;
		}

		finally {
			// Reset common introspection caches in Spring's core, since we
			// might not ever need metadata for singleton beans anymore...
			resetCommonCaches();
		}
	}
}
2.3.1、prepareRefresh();刷新前预处理

准备此上下文以进行刷新,设置其启动日期和活动标志,以及执行属性源的任何初始化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void prepareRefresh() {
	//设置启动时间
	this.startupDate = System.currentTimeMillis();
	//容器是否关闭
	this.closed.set(false);
	//容器是否激活
	this.active.set(true);
	//根据日志开启级别打印日志
	if (logger.isDebugEnabled()) {
		if (logger.isTraceEnabled()) {
			logger.trace("Refreshing " + this);
		}
		else {
			logger.debug("Refreshing " + getDisplayName());
		}
	}

	// 空实现,子类实现。AnnotationConfigApplicationContext容器的子容器初始化工作。
	initPropertySources();

	//校验必须的一些属性
	getEnvironment().validateRequiredProperties();

	// 保存容器预处理的事件
	if (this.earlyApplicationListeners == null) {
		this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
	}
	else {
		// Reset local application listeners to pre-refresh state.
		this.applicationListeners.clear();
		this.applicationListeners.addAll(this.earlyApplicationListeners);
	}

	// 设置早期事件(以前的事件)
	// 将在Multicast可用后发布
	this.earlyApplicationEvents = new LinkedHashSet<>();
}
2.3.2、obtainFreshBeanFactory();获取最新的bean工厂(beanFactory)
2.3.3、prepareBeanFactory(beanFactory);注册bean工厂的类加载器和部分后置处理器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	// 设置类加载器:存在则直接设置/不存在则新建一个默认类加载器
	beanFactory.setBeanClassLoader(getClassLoader());
	// 设置EL表达式解析器(Bean初始化完成后填充属性时会用到)
	beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
	// 设置属性注册解析器PropertyEditor
	beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

	// 将当前的ApplicationContext对象交给ApplicationContextAwareProcessor类来处理,
	// 从而在Aware接口实现类中的注入context
	beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
	//设置忽略自动装配的接口
	//因为在ApplicationContextAwareProcessor中已经完成了手动注入
	beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
	beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
	beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
	beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
	beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
	beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

	/**
	 * 注册几个自动装配相关的类和实例
	 * 在应用代码就可以通过类型自动装配把工厂实例和ApplicationContext实例设置到自定义bean的属性中
	 *
	 * 例如:这几个属性都会被自动设置,虽然没有在显示的在bean定义xml中注入它们
	 * @Autowired
	 * private BeanFactory beanFactory;
	 * @Autowired
	 * private ApplicationContext appContext;
	 */
	beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
	beanFactory.registerResolvableDependency(ResourceLoader.class, this);
	beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
	beanFactory.registerResolvableDependency(ApplicationContext.class, this);

	// 注册监听后置处理器
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
	
	// 添加编译时AspectJ的支持
	// 当容器检查到定义了名称为loadTimeWeaver的bean时
	// 会注册一个LoadTimeWeaverAwareProcessor到容器中
	// 这个后置处理器用来处理LoadTimeWeaverAware接口的
	if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
		beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
		beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
	}
	
	//将以下三个bean放入singletonObjects单例bean容器中
	// 注册当前容器环境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());
	}
}
2.3.4、postProcessBeanFactory(beanFactory);bean工厂的后置处理器(子类实现)

空实现

AbstractApplicationContext抽象类子类去实现。 查看子类:

2.3.5、invokeBeanFactoryPostProcessors(beanFactory);执行bean工厂的后置处理器

getBeanFactoryPostProcessors():返回bean工厂后置处理器列表,这里是个空集合

  • BeanFactoryPostProcessor(bean工厂后置处理器)通过postProcessBeanFactory()对bean工厂做一些操作
  • BeanFactoryPostProcessor子类BeanDefinitionRegistryPostProcessor(bean定义后置处理器),多定义了一个方法postProcessBeanDefinitionRegistry()对BeanDefinaition做一些增删改操作(故此子类优先执行)
  • 这些操作都在实例化前,实例化后就没有意义了

接下来回归正题,进入invokeBeanFactoryPostProcessors()方法,执行所有bean公共后置处理器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void invokeBeanFactoryPostProcessors(
		ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

	// 执行beans集合
	Set<String> processedBeans = new HashSet<>();

	//如果有BeanDefinitionRegistryPostProcessors-bean定义后置处理器,先执行。
	//(后执行BeanFactoryPostProcessor-bean工厂后置处理器)
	if (beanFactory instanceof BeanDefinitionRegistry) {
		BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
		// 用于存放入参bean定义后置处理器集合
		List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
		// 用于存放bean定义后置处理器集合
		List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
		//这里处理入参的bean定义后置处理器,入参的数据是自定义传入的,不怎么用,这里不说了
		for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
			if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
				BeanDefinitionRegistryPostProcessor registryProcessor =
						(BeanDefinitionRegistryPostProcessor) postProcessor;
				registryProcessor.postProcessBeanDefinitionRegistry(registry);
				registryProcessors.add(registryProcessor);
			}
			else {
				regularPostProcessors.add(postProcessor);
			}
		}

		// 用于保存本次要执行的bean定义后置处理器(当前bean定义后置处理器)
		List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

		// 首先,先执行实现了PriorityOrdered的bean定义后置处理器
		// 找出所有实现BeanDefinitionRegistryPostProcessor接口的Bean的beanName
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
		for (String ppName : postProcessorNames) {
			// 校验是否实现了PriorityOrdered接口
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				// 获取ppName对应的bean实例, 添加到currentRegistryProcessors中
				// beanFactory.getBean();获取bean,获取不到创建。后续单独将
				currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				//将要被执行的加入processedBeans,避免后续重复执行
				processedBeans.add(ppName);
			}
		}
		//进行排序(之前注册默认处理器时候,添加过排序策略属性 )
		// beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
		sortPostProcessors(currentRegistryProcessors, beanFactory);
		// 添加到bean定义后置处理器
		registryProcessors.addAll(currentRegistryProcessors);
		// 将所有bean定义后置处理器遍历执行它的方法 postProcessBeanDefinitionRegistry()
		// --对beanBefinition的增删改
		invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
		// 执行完毕后, 清空currentRegistryProcessors
		currentRegistryProcessors.clear();

		// 接下来,先执行实现了Ordered的bean定义后置处理器
		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);
		currentRegistryProcessors.clear();

		// 最后,执行剩下的bean定义后置处理器,什么排序接口都没有实现
		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);
					 // 如果有bean定义后置处理器被执行, 则有可能会产生新的bean定义后置处理器
	                // 因此这边将reiterate赋值为true, 代表需要再循环查找一次
					reiterate = true;
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();
		}

		// 现在统一执行bean定义后置处理器的postProcessBeanFactory方法
		//(BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor)
		invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
		// 现在统一执行入参bean定义后置处理器的postProcessBeanFactory方法
		invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
	}

	else {
		// 如果没有bean定义后置处理器,直接执行参数传入的bean定义后置处理器
		invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
	}


	// 到这里 , 入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor已经全部处理完毕,
	// 下面开始处理容器中的所有BeanFactoryPostProcessor
	String[] postProcessorNames =
			beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

	...与上面代码一模一样,下面总集说
}

总结:

  • 先遍历执行所有bean定义后置处理器,再执行bean工厂后置处理器
  • 后置处理器根据是否实现PriorityOrdered、Ordered接口和order值来排序决定先后执行
  • 每次执行,检查跳过之前执行过的后置处理器
2.3.6、registerBeanPostProcessors(beanFactory);实例化并注册所有后置处理器

处理流程方面和bean工厂后置处理器大致一样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 实例化所有的BeanPostProcessor并将其注册到BeanFactory中
public static void registerBeanPostProcessors(
      ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
   // 获取beanFactory中所有的BeanPostProcessor类型的bean的名字
   String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
   
   // 注册一个 BeanPostProcessorChecker,用来记录 bean 在 BeanPostProcessor 实例化时的信息。
   int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
   beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

   // 对所有的BeanPostProcessor根据实现不同的接口(PriorityOrdered,Ordered等)进行分离
   // 用于存放实现了PriorityOrdered.class的后处理器集合 
   List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
   // 用于存放实现了PriorityOrdered.class并且是MergedBeanDefinitionPostProcessor类型的后处理器集合
   List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
   // 用于存放实现了Ordered.class的后处理器集合 
   List<String> orderedPostProcessorNames = new ArrayList<>();
   // 用于存放其它情况的后处理器集合 
   List<String> nonOrderedPostProcessorNames = new ArrayList<>();
   for (String ppName : postProcessorNames) {
      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);
      }
   }
   // 首先,注册实现了ProorityOrdered.class接口的BeanPostProcessor 
   // 排序
   sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
   // 注册(将BeanPostProcessor加入到BeanFactory中beanFactory.addBeanPostProcessor(postProcessor)) 
   registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

   // 其次注册实现了Ordered.class接口的BeanPostProcessor 
   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);

   // 然后,注册剩余的所有普通的BeanPostProcessor
   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);
      }
   }
   registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

   // 最后,重新注册所有内部的BeanPostProcessor
   sortPostProcessors(internalPostProcessors, beanFactory);
   registerBeanPostProcessors(beanFactory, internalPostProcessors);

   //先删除再注册ApplicationListenerDetector(主要是为了移动到处理器链的末尾)
   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
2.3.7、initMessageSource();初始化MessageSource组件

可以做国际化功能,已经注入bean工厂。MESSAGE_SOURCE_BEAN_NAME = messageSource;

2.3.8、initApplicationEventMulticaster();初始化事件多播器(用来广播事件)
2.3.9、onRefresh();扩展方法,空实现

留给子容器或者AbstractApplicationContext子类重写这个方法,在容器刷新的时候可以自定义逻辑;

2.3.10、registerListeners();注册监听器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void registerListeners() {
    // 添加实现ApplicationListener作为侦听器的bean。
    // 不会影响其他侦听器,可以将它们添加为非bean。

    // 先注册静态指定的监听器
    for (ApplicationListener<?> listener : getApplicationListeners()) {
        getApplicationEventMulticaster().addApplicationListener(listener);
    }

    // 在事件多播器上添加监听 并没有执行
    String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
    for (String listenerBeanName : listenerBeanNames) {
        getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
    }

    // 发布早期的时间,并且将 earlyApplicationEvents 设置为空
    Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
    this.earlyApplicationEvents = null;
    if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
        for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
            getApplicationEventMulticaster().multicastEvent(earlyEvent);
        }
    }
}
2.3.11、finishBeanFactoryInitialization(beanFactory);实例化所有剩余的(非惰性)单例bean

拆分到第三、四、五章单讲

2.3.12、finishRefresh();最后一步:发布相应的事件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void finishRefresh() {
	// 清理缓存信息
	clearResourceCaches();

	// 初始化生命周期处理器
	initLifecycleProcessor();

	// 将刷新事件传播到生命周期处理器
	getLifecycleProcessor().onRefresh();

	// 发布容器刷新完毕事件到相应的监听器
	publishEvent(new ContextRefreshedEvent(this));

	// 略
	LiveBeansView.registerApplicationContext(this);
}
2.3.12.1、初始化生命周期处理器

Bean对象可以实现Lifecycle接口,以便这些Bean可以在容器自身的生命周期驱动下进行start和stop过程。

使用监听器
1、注册事件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyApplicationEvent extends ApplicationEvent {

	private static final long serialVersionUID = 5366526231219883438L;
	private String message;

	public MyApplicationEvent(Object source, String message) {
		super(source);
		this.message = message;
	}

	public String getMessage() {
		return message;
	}
}
2、注册监听器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {

	@Override
	public void onApplicationEvent(MyApplicationEvent event) {

		System.out.println("MyApplicationListener 收到消息: " + event.getMessage());

	}
}
3、发布事件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class MyAnnotationApplicationListener {

	@EventListener(classes = MyApplicationEvent.class)
	public void myApplicationEventListener(MyApplicationEvent event) {

		System.out.println("使用注解的方式, 收到事件: " + event.getMessage());
	}
}
4、使用

因为 AnnotationConfigApplicationContext 实现了 ApplicationContext , 而 ApplicationContext 实现了 ApplicationEventPublisher,所以这块可以传入当前 context。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
    public static void main(String[] args) {
        //创建注解容器,入参为配置类
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        MyApplicationEvent event = new MyApplicationEvent(context,"呼叫。。。");
        context.publishEvent(event);
        //关闭容器
        context.close();
    }
}

输出:

2.3.13、异常情况
2.3.13.1、destroyBeans();销毁单例bean
2.3.13.2、cancelRefresh(ex);设置容器激活状态为否

三、bean的加载准备工作

finishBeanFactoryInitialization(beanFactory);

1、完成bean工厂的初始化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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));
	}

	// 初始化所有LoadTimeWeaverAware Bean实例对象
	String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
	for (String weaverAwareName : weaverAwareNames) {
		getBean(weaverAwareName);
	}

	beanFactory.setTempClassLoader(null);

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

	// 实例化所有剩余(非懒加载)单例对象
	beanFactory.preInstantiateSingletons();
}

实例化前工作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public void preInstantiateSingletons() throws BeansException {
	if (logger.isTraceEnabled()) {
		logger.trace("Pre-instantiating singletons in " + this);
	}

	// 创建beanDefinitionNames的副本beanNames用于后续的遍历,以允许init等方法注册新的bean定义
	List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

	// 所有非懒加载单例bean的初始化
	for (String beanName : beanNames) {
		// 获取合并后的bean定义信息
		RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
		// bean定义对应的Bean实例:不是抽象类 && 是单例 && 不是懒加载
		if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
			// 判断beanName对应的bean是否为FactoryBean
			if (isFactoryBean(beanName)) {
				// 通过getBean(&beanName)拿到的是FactoryBean本身;
				// 通过getBean(beanName)拿到的是FactoryBean创建的Bean实例
				Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
				// 判断bean是否实现了FactoryBean
				if (bean instanceof FactoryBean) {
					final FactoryBean<?> factory = (FactoryBean<?>) bean;
					//判断是否需要立即创建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) {
						// 如果希望马上初始化,则通过beanName获取bean实例
						getBean(beanName);
					}
				}
			}
			else {
				// 如果beanName对应的bean不是FactoryBean,只是普通Bean,通过beanName获取bean实例
				getBean(beanName);
			}
		}
	}

	// 在所有bean实例化后,遍历所有beanName
	// 触发所有SmartInitializingSingleton实例化后后置处理器方法afterSingletonsInstantiated();
	for (String beanName : beanNames) {
		Object singletonInstance = getSingleton(beanName);
		if (singletonInstance instanceof SmartInitializingSingleton) {
			final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
			if (System.getSecurityManager() != null) {
				AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
					smartSingleton.afterSingletonsInstantiated();
					return null;
				}, getAccessControlContext());
			}
			else {
				smartSingleton.afterSingletonsInstantiated();
			}
		}
	}
}
1.1、getMergedLocalBeanDefinition(beanName);获取合并bean定义信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected RootBeanDefinition getMergedBeanDefinition(
		String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd)
		throws BeanDefinitionStoreException {

	synchronized (this.mergedBeanDefinitions) {
		RootBeanDefinition mbd = null;

		// 这里containingBd=null,所有,先从合并bean定义信息中获取
		if (containingBd == null) {
			mbd = this.mergedBeanDefinitions.get(beanName);
		}
		//获取不到
		if (mbd == null) {
			// 如果bd的parentName为空,代表bd没有父定义,无需与父定义进行合并操作,
			// 如果是RootBeanDefinition,则克隆一个;如果不是则new一个
			if (bd.getParentName() == null) {
				// Use copy of given root bean definition.
				if (bd instanceof RootBeanDefinition) {
					mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();
				}
				else {
					mbd = new RootBeanDefinition(bd);
				}
			}
			else {
				// 存在父定义,需要与父定义合并
				BeanDefinition pbd;
				try {
					// 获取父定义的beanName,可能是别名
					String parentBeanName = transformedBeanName(bd.getParentName());
					// 如果父定义的beanName与该bean的beanName不同
					if (!beanName.equals(parentBeanName)) {
						// 获取父定义的MergedBeanDefinition(因为父定义也可能有父定义,也就是bd的爷爷定义...)
						// 递归调用获取合并bean定义信息
						pbd = getMergedBeanDefinition(parentBeanName);
					}
					else {
						// 如果父定义的beanName与bd的beanName相同
						// 只有在存在父BeanFactory的情况下,才允许父定义beanName与自己相同,否则就是将自己设置为父定义
						BeanFactory parent = getParentBeanFactory();
						if (parent instanceof ConfigurableBeanFactory) {
							// 如果父BeanFactory是ConfigurableBeanFactory,
							// 则通过父BeanFactory获取父定义的MergedBeanDefinition
							pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName);
						}
						else {
							throw new NoSuchBeanDefinitionException(parentBeanName,
									"Parent name '" + parentBeanName + "' is equal to bean name '" + beanName +
									"': cannot be resolved without an AbstractBeanFactory parent");
						}
					}
				}
				catch (NoSuchBeanDefinitionException ex) {
					throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName,
							"Could not resolve parent bean definition '" + bd.getParentName() + "'", ex);
				}
				// 使用父定义pbd构建一个新的RootBeanDefinition对象
				mbd = new RootBeanDefinition(pbd);
				// 使用bd覆盖父定义
				mbd.overrideFrom(bd);
			}

			// 如果没有配置scope,则设置成默认的singleton
			if (!StringUtils.hasLength(mbd.getScope())) {
				mbd.setScope(RootBeanDefinition.SCOPE_SINGLETON);
			}

			// 这里 containingBd 为空
			if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) {
				mbd.setScope(containingBd.getScope());
			}

			// 将beanName与mbd放到mergedBeanDefinitions缓存,以便之后可以直接使用
			if (containingBd == null && isCacheBeanMetadata()) {
				this.mergedBeanDefinitions.put(beanName, mbd);
			}
		}

		return mbd;
	}
}
1.1.1、父BeanFactory

SpringMVC的beanFactory和Spring的beanFactory,通常情况下,Spring的beanFactory是父工厂,SpringMVC的beanFactory是子工厂,子工厂可以使用父工厂的BeanDefinition,因此,如果当前beanFactory中找不到,而又存在父工厂,则会去父工厂查找。

举个例子

两个bean,childBean和rootBean,childBean的父bean是rootBean。和继承有点像,子类如果没有赋值某个属性,会继承父类的,比如这里的name=张三。

1.2、isFactoryBean(beanName) 判断bean是否为FactoryBean
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException {
	// 获取真正的beanName(去掉&前缀、解析别名)
	String beanName = transformedBeanName(name);
	// 尝试从缓存中获取bean
	Object beanInstance = getSingleton(beanName, false);
	if (beanInstance != null) {
		//存在,则判断类型是否为FactoryBean;
		return (beanInstance instanceof FactoryBean);
	}
	// No singleton instance found -> check bean definition.
	if (!containsBeanDefinition(beanName) && getParentBeanFactory() instanceof ConfigurableBeanFactory) {
		// 如果缓存中不存在此beanName && 父beanFactory是ConfigurableBeanFactory,则调用父BeanFactory判断是否为FactoryBean
		return ((ConfigurableBeanFactory) getParentBeanFactory()).isFactoryBean(name);
	}
	//通过MergedBeanDefinition来检查beanName对应的Bean是否为FactoryBean
	return isFactoryBean(beanName, getMergedLocalBeanDefinition(beanName));
}

四、doGetBean();获取bean对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
		@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
	//解析beanName,主要是解析别名、去掉FactoryBean的前缀“&”
	final String beanName = transformedBeanName(name);
	Object bean;

	// 1、从缓存中获取beanName对应的实例
	Object sharedInstance = getSingleton(beanName);
	if (sharedInstance != null && args == null) {
		// 如果beanName的实例存在于缓存中
		if (logger.isTraceEnabled()) {
			if (isSingletonCurrentlyInCreation(beanName)) {
				logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
						"' that is not fully initialized yet - a consequence of a circular reference");
			}
			else {
				logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
			}
		}
		// 2、返回beanName对应的实例对象(主要用于FactoryBean的特殊处理,普通Bean会直接返回sharedInstance本身)
		bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
	}

	else {
        // scope为prototype的循环依赖校验:如果beanName已经正在创建Bean实例中,
        // 而此时我们又要再一次创建beanName的实例,则代表出现了循环依赖,需要抛出异常。
        // 例子:如果存在A中有B的属性,B中有A的属性,那么当依赖注入的时候,
        // 就会产生当A还未创建完的时候因为对于B的创建再次返回创建A,造成循环依赖
		if (isPrototypeCurrentlyInCreation(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}

		// 获取parentBeanFactory(父容器)
		BeanFactory parentBeanFactory = getParentBeanFactory();
		//如果parentBeanFactory存在,并且beanName在当前BeanFactory不存在Bean定义,
		//则尝试从parentBeanFactory中获取bean实例
		if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
			// 将别名解析成真正的beanName
			String nameToLookup = originalBeanName(name);
			if (parentBeanFactory instanceof AbstractBeanFactory) {
				return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
						nameToLookup, requiredType, args, typeCheckOnly);
			}
			// 尝试在parentBeanFactory中获取bean对象实例
			else if (args != null) {
				return (T) parentBeanFactory.getBean(nameToLookup, args);
			}
			else if (requiredType != null) {
				return parentBeanFactory.getBean(nameToLookup, requiredType);
			}
			else {
				return (T) parentBeanFactory.getBean(nameToLookup);
			}
		}

		if (!typeCheckOnly) {
			// 如果不是仅仅做类型检测,而是创建bean实例,
			// 这里要将beanName放到alreadyCreated缓存,做记录
			markBeanAsCreated(beanName);
		}

		try {
			//将bean和父bean合并
			final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
			//检查MergedBeanDefinition
			checkMergedBeanDefinition(mbd, beanName, args);

			// 拿到当前bean依赖的bean名称集合,在实例化自己之前,需要先实例化自己依赖的bean
			String[] dependsOn = mbd.getDependsOn();
			if (dependsOn != null) {
				//遍历当前bean依赖的bean名称集合
				for (String dep : dependsOn) {
					//3、检查dep是否依赖于beanName,即检查是否存在循环依赖
					if (isDependent(beanName, dep)) {
						//如果是循环依赖则抛异常
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
					}
					//4、将dep和beanName的依赖关系注册到缓存中
					registerDependentBean(dep, beanName);
					try {
						//获取dep对应的bean实例,如果dep还没有创建bean实例,则创建dep的bean实例
						getBean(dep);
					}
					catch (NoSuchBeanDefinitionException ex) {
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
					}
				}
			}

			// 针对不同的scope进行bean的创建
			if (mbd.isSingleton()) {
				//5、单例bean创建(新建了一个ObjectFactory,并且重写了getObject方法)
				sharedInstance = getSingleton(beanName, () -> {
					try {
						//3.5、创建Bean实例
						return createBean(beanName, mbd, args);
					}
					catch (BeansException ex) {
						// Explicitly remove instance from singleton cache: It might have been put there
						// eagerly by the creation process, to allow for circular reference resolution.
						// Also remove any beans that received a temporary reference to the bean.
						destroySingleton(beanName);
						throw ex;
					}
				});
				// 返回beanName对应的实例对象
				bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
			}

			else if (mbd.isPrototype()) {
				// 多例的bean创建
				Object prototypeInstance = null;
				try {
					// 6、创建实例前的操作(将beanName保存到prototypesCurrentlyInCreation缓存中)
					beforePrototypeCreation(beanName);
					// 创建Bean实例
					prototypeInstance = createBean(beanName, mbd, args);
				}
				finally {
					//创建实例后的操作(将创建完的beanName从prototypesCurrentlyInCreation缓存中移除)
					afterPrototypeCreation(beanName);
				}
				//beanName对应的实例对象
				bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
			}

			else {
				// 其他scope的bean创建,可能是request之类的
                // 根据scopeName,从缓存拿到scope实例
				String scopeName = mbd.getScope();
				final Scope scope = this.scopes.get(scopeName);
				if (scope == null) {
					throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
				}
				try {
					//其他scope的bean创建(新建了一个ObjectFactory,并且重写了getObject方法)
					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 BeanCreationException(beanName,
							"Scope '" + scopeName + "' is not active for the current thread; consider " +
							"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
							ex);
				}
			}
		}
		catch (BeansException ex) {
			cleanupAfterBeanCreationFailure(beanName);
			throw ex;
		}
	}

	// 检查所需类型是否与实际的bean对象的类型匹配
	if (requiredType != null && !requiredType.isInstance(bean)) {
		try {
			// 类型不对,则尝试转换bean类型
			T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
			if (convertedBean == null) {
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
			return convertedBean;
		}
		catch (TypeMismatchException ex) {
			if (logger.isTraceEnabled()) {
				logger.trace("Failed to convert bean '" + name + "' to required type '" +
						ClassUtils.getQualifiedName(requiredType) + "'", ex);
			}
			throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
		}
	}
	return (T) bean;
}

1、getSingleton()获取单例bean

提前引入4个重要缓存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//一级缓存(beanName->单例bean对象)单例对象的缓存
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
//二级缓存(beanName_>单例bean对象,对象还未进行属性填充、初始化)提前曝光的单例对象的缓存
//又称为早期单例对象,是因为earlySingletonObjects里的对象的都是通过提前曝光的ObjectFactory创建出来的,还未进行属性填充等操作
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
//三级缓存(beanName->ObjectFactory 通过beanName获取单例bean工厂)单例对象工厂的缓存
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
//当前正在创建单例bean对象的beanName集合
private final Set<String> singletonsCurrentlyInCreation =
		Collections.newSetFromMap(new ConcurrentHashMap<>(16));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
	//从一级缓存获取单例对象
	Object singletonObject = this.singletonObjects.get(beanName);
    //如果一级缓存没有,并且该beanName对应的单例bean正在创建中
	if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
		synchronized (this.singletonObjects) {
			//尝试从二级缓存获取
			singletonObject = this.earlySingletonObjects.get(beanName);
            // 如果二级缓存也没有,并且允许bean对象提前曝光
			if (singletonObject == null && allowEarlyReference) {
                // 从三级缓存中获取beanName的单例工厂
				ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
				if (singletonFactory != null) {
                    // 如果存在单例对象工厂,则通过工厂创建一个单例对象
					singletonObject = singletonFactory.getObject();
                    // 将通过单例对象工厂创建的单例对象,放到二级缓存中
					this.earlySingletonObjects.put(beanName, singletonObject);
					// 移除该beanName对应的单例对象工厂
					// 因为该单例工厂已经创建了一个实例对象,并且放到二级缓存中
                    // 所以,后续获取beanName的单例对象,
                    // 可以通过二级缓存拿到,不需要在用到该单例工厂
					this.singletonFactories.remove(beanName);
				}
			}
		}
	}
	return singletonObject; //返回对象
}

该段代码是 Spring 解决循环引用的核心代码

解决循环引用逻辑:使用构造函数创建一个 “不完整” 的 bean 实例(之所以说不完整,是因为此时该 bean 实例还未初始化),并且提前曝光该 bean 实例的 ObjectFactory(提前曝光就是将 ObjectFactory 放到 singletonFactories 缓存),通过 ObjectFactory 我们可以拿到该 bean 实例的引用,如果出现循环引用,我们可以通过缓存中的 ObjectFactory 来拿到 bean 实例,从而避免出现循环引用导致的死循环。这边通过缓存中的 ObjectFactory 拿到的 bean 实例虽然拿到的是 “不完整” 的 bean 实例,但是由于是单例,所以后续初始化完成后,该 bean 实例的引用地址并不会变,所以最终我们看到的还是完整 bean 实例。

2、getObjectForBeanInstance();返回bean真正的实例对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected Object getObjectForBeanInstance(
		Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {

	// 如果name以“&”为前缀,但是beanInstance不是FactoryBean,则抛异常
	if (BeanFactoryUtils.isFactoryDereference(name)) {
		if (beanInstance instanceof NullBean) {
			return beanInstance;
		}
		if (!(beanInstance instanceof FactoryBean)) {
			throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
		}
	}

	// 如果beanInstance不是FactoryBean(也就是普通bean),则直接返回beanInstance
	// 或者
    // 如果beanInstance是FactoryBean,并且name以“&”为前缀,
    // 则直接返回beanInstance(以“&”为前缀代表想获取的是FactoryBean本身)
	if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
		return beanInstance;
	}
	//走到这边,代表beanInstance是FactoryBean,但name不带有“&”前缀,
	//表示想要获取的是FactoryBean创建的对象实例
	Object object = null;
	if (mbd == null) {
		//这里mbd为空,则尝试从factoryBeanObjectCache缓存中获取该FactoryBean创建的对象实例
		object = getCachedObjectForFactoryBean(beanName);
	}
	if (object == null) {
		// 只有beanInstance是FactoryBean才能走到这边,因此直接强转
		FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
		// mbd为空,但是该bean的BeanDefinition在缓存中存在,则获取该bean的MergedBeanDefinition
		if (mbd == null && containsBeanDefinition(beanName)) {
			mbd = getMergedLocalBeanDefinition(beanName);
		}
		//mbd是否是合成的(这个字段比较复杂,mbd正常情况都不是合成的,也就是false
		boolean synthetic = (mbd != null && mbd.isSynthetic());
		//2.1、从FactoryBean获取对象实例
		object = getObjectFromFactoryBean(factory, beanName, !synthetic);
	}
	return object;
}

3、isDependent(beanName, dep);检查dep是否依赖于beanName

dep是bean依赖bean集合的一部分,如果dep也依赖bean,则是循环依赖,报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private boolean isDependent(String beanName, String dependentBeanName, @Nullable Set<String> alreadySeen) {
	// alreadySeen这里是空,跳过
	if (alreadySeen != null && alreadySeen.contains(beanName)) {
		return false;
	}
	// 将别名解析为真正的名称
	String canonicalName = canonicalName(beanName);
	//获取依赖beanName的set集合
	Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
	// 如果dependentBeans为空,则证明依赖beanName的为空,则dep不依赖bean,返回false
	if (dependentBeans == null) {
		return false;
	}
	// 如果依赖beanName的集合报告dep,则证明dep依赖beanName;则是循环依赖,返回true
	if (dependentBeans.contains(dependentBeanName)) {
		return true;
	}
	//循环检查,即检查依赖canonicalName的所有beanName是否存在被dependentBeanName依赖的(即隔层依赖)
	for (String transitiveDependency : dependentBeans) {
		if (alreadySeen == null) {
			alreadySeen = new HashSet<>();
		}
		//已经检查过的添加到alreadySeen,避免重复检查
		alreadySeen.add(beanName);
		if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) {
			return true;
		}
	}
	return false;
}

这里引入一个缓存:dependentBeanMap:beanName -> 所有依赖 beanName 对应的 bean 的 beanName 集合。 如:A依赖B,则key=B,value=A;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);

4、registerDependentBean();注册依赖关系到缓存中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
注意:beanName:依赖bean;dependentBeanName:注册bean
*/
public void registerDependentBean(String beanName, String dependentBeanName) {
	// 解析别名
	String canonicalName = canonicalName(beanName);

	synchronized (this.dependentBeanMap) {
		//创建一个dependentBeanMap缓存,key为这里的依赖bean:beanName
		Set<String> dependentBeans =
				this.dependentBeanMap.computeIfAbsent(canonicalName, k -> new LinkedHashSet<>(8));
		//set value如果失败,证明依赖关系已存在
		if (!dependentBeans.add(dependentBeanName)) {
			return;
		}
	}

	synchronized (this.dependenciesForBeanMap) {
		Set<String> dependenciesForBean =
				this.dependenciesForBeanMap.computeIfAbsent(dependentBeanName, k -> new LinkedHashSet<>(8));
		dependenciesForBean.add(canonicalName);
	}
}

这里引入一个缓存:dependenciesForBeanMap:beanName -> 所有beanName依赖对应的 bean 的 beanName 集合。 如:A依赖B,则key=A,value=B;和 dependentBeanMap 相反。

5、getSingleton(String beanName, ObjectFactory<?> singletonFactory);单例bean创建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
	Assert.notNull(beanName, "Bean name must not be null");
	// 加锁,避免重复创建单例对象
	synchronized (this.singletonObjects) {
		// 首先检查beanName对应的bean实例是否在缓存中存在,如果已经存在,则直接返回
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null) {
			if (this.singletonsCurrentlyInDestruction) {
				// 缓存中不存在,且bean工厂的单例处于destruction状态时,不允许进行单例bean创建,报错
				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 + "'");
			}
			// 5.1 创建单例前的操作
			beforeSingletonCreation(beanName);
			boolean newSingleton = false;
			// 用于记录异常相关信息
			boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
			if (recordSuppressedExceptions) {
				this.suppressedExceptions = new LinkedHashSet<>();
			}
			try {
				// 执行singletonFactory的getObject方法获取bean实例
				singletonObject = singletonFactory.getObject();
				// 标记为新的单例对象
				newSingleton = true;
			}
			catch (IllegalStateException ex) {
				//如果报错了,尝试从一级缓存中获取对象(已经不是新的单例对象了)
				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;
				}
				// 5.2、创建单例后的操作
				afterSingletonCreation(beanName);
			}
			if (newSingleton) {
				// 5.3、如果是新的单例对象,将beanName和对应的bean实例添加到缓存中
				addSingleton(beanName, singletonObject);
			}
		}
		return singletonObject;
	}
}
5.1、5.2、beforeSingletonCreation、afterSingletonCreation 创建单例前后操作
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void beforeSingletonCreation(String beanName) {
	// 先校验beanName是否为要在创建检查排除掉的(inCreationCheckExclusions缓存),如果不是,
	// 则将beanName加入到正在创建bean的缓存中(Set),如果beanName已经存在于该缓存,会返回false抛出异常(这种情况出现在构造器的循环依赖)
	if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
		throw new BeanCurrentlyInCreationException(beanName);
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void afterSingletonCreation(String beanName) {
	// 先校验beanName是否为要在创建检查排除掉的(inCreationCheckExclusions缓存),如果不是,
	// 则将beanName从正在创建bean的缓存中(Set)移除,如果beanName不存在于该缓存,会返回false抛出异常
	if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
		throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
	}
}
5.3、addSingleton 新创建对象,添加到缓存
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void addSingleton(String beanName, Object singletonObject) {
	synchronized (this.singletonObjects) {
		// 添加一级缓存(单例缓存对象)
		this.singletonObjects.put(beanName, singletonObject);
		// 删除三级缓存/单例工厂缓存(已经不需要)
		this.singletonFactories.remove(beanName);
		// 删除二级缓存/早期单例缓存,没有属性填充(已经不需要)
		this.earlySingletonObjects.remove(beanName);
		// 添加到已经注册的单例对象缓存
		this.registeredSingletons.add(beanName);
	}
}

6、beforePrototypeCreation、afterPrototypeCreation 多例对象创建前后操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void beforePrototypeCreation(String beanName) {
	// 获取当前线程中正在创建的prototype的bean的beanName集合
	Object curVal = this.prototypesCurrentlyInCreation.get();
	// 如果为空,则将ThreadLocal设置成当前的beanName
	if (curVal == null) {
		this.prototypesCurrentlyInCreation.set(beanName);
	}
	// 如果不为空,并且是String类型,则代表目前只有一个beanName,
	// 将之前和当前的一起封装成Set<String>,设置到ThreadLocal中
	else if (curVal instanceof String) {
		Set<String> beanNameSet = new HashSet<>(2);
		beanNameSet.add((String) curVal);
		beanNameSet.add(beanName);
		this.prototypesCurrentlyInCreation.set(beanNameSet);
	}
	else {
		// 如果不为空,并且不是String,则必然是Set<String>类型,将当前的beanName加到Set中去
		Set<String> beanNameSet = (Set<String>) curVal;
		beanNameSet.add(beanName);
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void afterPrototypeCreation(String beanName) {
	// 拿到当前线程中正在创建的prototype的bean的beanName集合
	Object curVal = this.prototypesCurrentlyInCreation.get();
	//如果是String类型,则代表目前只有一个beanName,则直接移除
	if (curVal instanceof String) {
		this.prototypesCurrentlyInCreation.remove();
	}
	else if (curVal instanceof Set) {
		// 如果是Set类型,则从Set从移除beanName
		Set<String> beanNameSet = (Set<String>) curVal;
		beanNameSet.remove(beanName);
		if (beanNameSet.isEmpty()) {
			this.prototypesCurrentlyInCreation.remove();
		}
	}
}

主要是在进行 多例 bean 实例的创建前,将 beanName 添加到 prototypesCurrentlyInCreation 缓存;bean 实例创建后,将 beanName 从 prototypesCurrentlyInCreation 缓存中移除。这边 prototypesCurrentlyInCreation 存放的类型为 Object,在只有一个 beanName 的时候,直接存该 beanName,也就是 String 类型;当有多个 beanName 时,转成 Set 来存放。

五、createBean();创建bean对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
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;

	// 解析beanName对应的Bean的类型
	Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
	if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
        // 如果resolvedClass存在,并且mdb的beanClass类型不是Class,并且mdb的beanClass不为空(则代表beanClass存的是Class的name),
        // 则使用mdb深拷贝一个新的RootBeanDefinition副本,并且将解析的Class赋值给拷贝的RootBeanDefinition副本的beanClass属性,
        // 该拷贝副本取代mdb用于后续的操作
		mbdToUse = new RootBeanDefinition(mbd);
		mbdToUse.setBeanClass(resolvedClass);
	}

	// 验证及准备覆盖的方法(对override属性进行标记及验证)
	try {
		mbdToUse.prepareMethodOverrides();
	}
	catch (BeanDefinitionValidationException ex) {
		throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
				beanName, "Validation of method overrides failed", ex);
	}

	try {
        // 1、实例化前的处理,给InstantiationAwareBeanPostProcessor一个机会返回代理对象来替代真正的bean实例,动态代理
		Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
		if (bean != null) {
			return bean;
		}
	}
	catch (Throwable ex) {
		throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
				"BeanPostProcessor before instantiation of bean failed", ex);
	}

	try {
		// 创建Bean实例(真正创建Bean的方法)
		Object beanInstance = doCreateBean(beanName, mbdToUse, args);
		if (logger.isTraceEnabled()) {
			logger.trace("Finished creating instance of bean '" + beanName + "'");
		}
		return beanInstance;
	}
	catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
		// A previously detected exception with proper bean creation context already,
		// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
		throw ex;
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
	}
}

1、resolveBeforeInstantiation 实例化前操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
	Object bean = null;
	if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
		// mbd不是合成的,并且BeanFactory中存在InstantiationAwareBeanPostProcessor(实例化前后后置处理器)
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			// 解析beanName对应的Bean实例的类型
			Class<?> targetType = determineTargetType(beanName, mbd);
			if (targetType != null) {
				// 1.1、实例化前的后置处理器应用(处理InstantiationAwareBeanPostProcessor)
				bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
				if (bean != null) {
					// 如果返回的bean不为空,会跳过Spring默认的实例化过程,
					// 所以只能在这里调用BeanPostProcessor实现类的postProcessAfterInitialization方法
					bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
				}
			}
		}
		// 如果bean不为空,则将beforeInstantiationResolved赋值为true,代表在实例化之前已经解析
		mbd.beforeInstantiationResolved = (bean != null);
	}
	return bean;
}
1.1、实例化前的后置处理器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Nullable
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
	// 遍历当前BeanFactory中所有的后置处理器
	for (BeanPostProcessor bp : getBeanPostProcessors()) {
		// 如果InstantiationAwareBeanPostProcessor或其子类
		if (bp instanceof InstantiationAwareBeanPostProcessor) {
			InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
			// 执行postProcessBeforeInstantiation方法,在Bean实例化前操作,
			Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
			if (result != null) {
				return result;
			}
		}
	}
	return null;
}
  • 如果返回null,则依次遍历所有的后置处理器,遍历完以后创建对象。。。
  • 如果返回不为空,则为实例bean,此时不会再执行后续的后置处理器和创建bean操作

2、doCreateBean 创建bean实例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
		throws BeanCreationException {

	// 新建Bean包装类
	BeanWrapper instanceWrapper = null;
	if (mbd.isSingleton()) {
		// 如果是FactoryBean,则需要先移除未完成的FactoryBean实例的缓存
		instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
	}
	if (instanceWrapper == null) {
		// 2.1、根据beanName、mbd、args,使用对应的策略创建Bean实例,并返回包装类BeanWrapper
		instanceWrapper = createBeanInstance(beanName, mbd, args);
	}
	// 拿到创建好的Bean实例
	final Object bean = instanceWrapper.getWrappedInstance();
	// 拿到Bean实例的类型
	Class<?> beanType = instanceWrapper.getWrappedClass();
	if (beanType != NullBean.class) {
		mbd.resolvedTargetType = beanType;
	}

	// 允许后置处理器修改合并bean的定义信息
	synchronized (mbd.postProcessingLock) {
		if (!mbd.postProcessed) {
			try {
				// 2.2、应用后置处理器MergedBeanDefinitionPostProcessor,允许修改MergedBeanDefinition,
				// Autowired注解正是通过此方法实现注入类型的预解析
				applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
			}
			catch (Throwable ex) {
				throw new BeanCreationException(mbd.getResourceDescription(), beanName,
						"Post-processing of merged bean definition failed", ex);
			}
			mbd.postProcessed = true;
		}
	}

	// 判断是否需要提早曝光实例:单例 && 允许循环依赖 && 当前bean正在创建中
	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");
		}
		// 2.3、提前曝光beanName的ObjectFactory,用于解决循环引用
		// 应用后置处理器SmartInstantiationAwareBeanPostProcessor,
		// 允许返回指定bean的早期引用,若没有则直接返回bean
		// 2.4、getEarlyBeanReference();获取对指定bean的早期访问的引用
		addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
	}

	// 初始化bean实例
	Object exposedObject = bean;
	try {
		// 2.5、对bean进行属性填充;其中,可能存在依赖于其他bean的属性,则会递归初始化依赖的bean实例
		populateBean(beanName, mbd, instanceWrapper);
		// 2.6、初始化beanName
		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只有在当前解析的bean存在循环依赖的情况下才会不为空
		if (earlySingletonReference != null) {
			if (exposedObject == bean) {
				// 如果exposedObject没有在initializeBean方法中被增强,则不影响之前的循环引用
				exposedObject = earlySingletonReference;
			}
			else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
                // 如果exposedObject在initializeBean方法中被增强 
                // && 不允许在循环引用的情况下使用注入原始bean实例
                // && 当前bean有被其他bean依赖

				// 拿到依赖当前bean的所有bean的beanName数组
				String[] dependentBeans = getDependentBeans(beanName);
				Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
				for (String dependentBean : dependentBeans) {
					// 尝试移除这些bean的实例,因为这些bean依赖的bean已经被增强了,他们依赖的bean相当于脏数据
					if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
						//移除失败的添加到 actualDependentBeans
						actualDependentBeans.add(dependentBean);
					}
				}
				if (!actualDependentBeans.isEmpty()) {
					// 如果存在移除失败的,则抛出异常,因为存在bean依赖了“脏数据”
					throw new BeanCurrentlyInCreationException(beanName,
							"Bean with name '" + beanName + "' has been injected into other beans [" +
							StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
							"] in its raw version as part of a circular reference, but has eventually been " +
							"wrapped. This means that said other beans do not use the final version of the " +
							"bean. This is often the result of over-eager type matching - consider using " +
							"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
				}
			}
		}
	}

	// Register bean as disposable.
	try {
	    //注册用于销毁的bean,执行销毁操作的有三种:
	    //自定义destroy方法、
	    //DisposableBean接口、
	    //DestructionAwareBeanPostProcessor
		registerDisposableBeanIfNecessary(beanName, bean, mbd);
	}
	catch (BeanDefinitionValidationException ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
	}
	// 完成创建并返回
	return exposedObject;
}
2.1、createBeanInstance 根据策略实例化bean
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
	// 解析bean的Class类型信息
	Class<?> beanClass = resolveBeanClass(mbd, beanName);
	// 确保class不为空,并且访问权限是public
	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());
	}
	// 2.1.1、通过Supplier实例化
	Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
	if (instanceSupplier != null) {
		return obtainFromSupplier(instanceSupplier, beanName);
	}

	// 2.1.2、通过工厂方法实例化
	if (mbd.getFactoryMethodName() != null) {
		return instantiateUsingFactoryMethod(beanName, mbd, args);
	}

	// 构造函数或工厂方法是否已经解析过标记
	boolean resolved = false;
	// 是否需要自动注入(即是否需要解析构造函数参数)
	boolean autowireNecessary = false;
	if (args == null) {
		synchronized (mbd.constructorArgumentLock) {
			if (mbd.resolvedConstructorOrFactoryMethod != null) {
				// 如果resolvedConstructorOrFactoryMethod缓存不为空,则将resolved标记为已解析
				resolved = true;
				// 根据constructorArgumentsResolved判断是否需要自动注入
				autowireNecessary = mbd.constructorArgumentsResolved;
			}
		}
	}
	// 如果已经解析过,则使用resolvedConstructorOrFactoryMethod缓存里解析好的构造函数方法
	if (resolved) {
		if (autowireNecessary) {
			// 2.1.3、需要自动注入,则执行构造函数自动注入
			return autowireConstructor(beanName, mbd, null, null);
		}
		else {
			// 2.1.4、否则使用默认的构造函数进行bean的实例化
			return instantiateBean(beanName, mbd);
		}
	}

	// 2.1.5、应用后置处理器SmartInstantiationAwareBeanPostProcessor,拿到bean的候选构造函数
	Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
	if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
			mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
		 //如果ctors不为空 || mbd的注入方式为AUTOWIRE_CONSTRUCTOR 
		 // || mdb定义了构造函数的参数值 || args不为空,则执行构造函数自动注入
		return autowireConstructor(beanName, mbd, ctors, args);
	}

	// 找出最合适的默认构造方法
	ctors = mbd.getPreferredConstructors();
	if (ctors != null) {
		 构造函数自动注入
		return autowireConstructor(beanName, mbd, ctors, null);
	}

	// 没有特殊处理,则使用默认的构造函数进行bean的实例化
	return instantiateBean(beanName, mbd);
}

实例化 bean的主要逻辑:

  • 如果存在 Supplier 回调,则调用 obtainFromSupplier() 进行初始化
  • 如果存在工厂方法,则使用工厂方法进行初始化
  • 首先判断缓存,如果缓存中存在,即已经解析过了,则直接使用已经解析了的,根据 constructorArgumentsResolved 参数来判断是使用构造函数自动注入还是默认构造函数
  • 如果缓存中没有,则需要先确定到底使用哪个构造函数来完成解析工作,因为一个类有多个构造函数,每个构造函数都有不同的构造参数,所以需要根据参数来锁定构造函数并完成初始化,如果存在参数则使用相应的带有参数的构造函数,否则使用默认构造函数。
2.1.1、obtainFromSupplier();通过Supplier实例化

如果RootBeanDefinition中存在Supplier接口实例,则使用Supplier接口回调来实例化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@FunctionalInterface
public interface Supplier<T> {
    T get();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 从supplier获取bean
protected BeanWrapper obtainFromSupplier(Supplier<?> instanceSupplier, String beanName) {
	Object instance;
	String outerBean = this.currentlyCreatedBean.get();
	this.currentlyCreatedBean.set(beanName);
	try {
		// 调用 Supplier 的 get(),返回一个对象
		instance = instanceSupplier.get();
	}
	finally {
		if (outerBean != null) {
			this.currentlyCreatedBean.set(outerBean);
		}
		else {
			this.currentlyCreatedBean.remove();
		}
	}

	if (instance == null) {
		instance = new NullBean();
	}
	// 根据对象构造 BeanWrapper 对象
	BeanWrapper bw = new BeanWrapperImpl(instance);
	// 初始化 BeanWrapper
	initBeanWrapper(bw);
	return bw;
}
2.1.2、instantiateUsingFactoryMethod();通过工厂方法实例化

如果RootBeanDefinition 中存在 factoryMethodName 属性,或者在配置文件中配置了factory-method,Spring会尝试使用 instantiateUsingFactoryMethod 方法,根据RootBeanDefinition 中的配置生成bean实例。不常用。

2.1.3、autowireConstructor();自动注入,构造函数

简单来说,就是根据传入的参数列表,来匹配到合适的构造函数进行bean 的创建。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public BeanWrapper autowireConstructor(String beanName, RootBeanDefinition mbd,
		@Nullable Constructor<?>[] chosenCtors, @Nullable Object[] explicitArgs) {
	// 实例化BeanWrapper。是包装bean的容器
	BeanWrapperImpl bw = new BeanWrapperImpl();
	this.beanFactory.initBeanWrapper(bw);

	Constructor<?> constructorToUse = null;
	ArgumentsHolder argsHolderToUse = null;
	Object[] argsToUse = null;

	// explicitArgs通过getBean方法传入
	// 如果getBean方法调用的时候指定方法参数那么直接使用
	if (explicitArgs != null) {
		argsToUse = explicitArgs;
	}
	else {
		// 如果在调用getBean方法的时候没有指定,则尝试从配置文件中解析
		Object[] argsToResolve = null;
		synchronized (mbd.constructorArgumentLock) {
			// 尝试从缓存中获取
			constructorToUse = (Constructor<?>) mbd.resolvedConstructorOrFactoryMethod;
			if (constructorToUse != null && mbd.constructorArgumentsResolved) {
				// Found a cached constructor...
				// 从缓存中找到了构造器,那么继续从缓存中寻找缓存的构造器参数
				argsToUse = mbd.resolvedConstructorArguments;
				if (argsToUse == null) {
					// 没有缓存的参数,就需要获取配置i文件中配置的参数
					argsToResolve = mbd.preparedConstructorArguments;
				}
			}
		}
		// 如果缓存中没有缓存的参数的话,即argsToResolve不为空,就需要解析配置的参数
		if (argsToResolve != null) {
			// 解析参数类型,比如将配置的String类型转换为list、boolean等类型
			argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse, argsToResolve, true);
		}
	}

	// 如果没有缓存,就需要从构造函数开始解析
	if (constructorToUse == null || argsToUse == null) {
		// Take specified constructors, if any.
		// 如果传入的构造器数组不为空,就使用传入的过后早期参数,否则通过反射获取class中定义的构造器
		Constructor<?>[] candidates = chosenCtors;
		if (candidates == null) {
			Class<?> beanClass = mbd.getBeanClass();
			try {
				// 使用public的构造器或者所有构造器
				candidates = (mbd.isNonPublicAccessAllowed() ?
						beanClass.getDeclaredConstructors() : beanClass.getConstructors());
			}
			catch (Throwable ex) {
				throw new BeanCreationException(mbd.getResourceDescription(), beanName,
						"Resolution of declared constructors on bean Class [" + beanClass.getName() +
						"] from ClassLoader [" + beanClass.getClassLoader() + "] failed", ex);
			}
		}

		if (candidates.length == 1 && explicitArgs == null && !mbd.hasConstructorArgumentValues()) {
			Constructor<?> uniqueCandidate = candidates[0];
			if (uniqueCandidate.getParameterCount() == 0) {
				synchronized (mbd.constructorArgumentLock) {
					mbd.resolvedConstructorOrFactoryMethod = uniqueCandidate;
					mbd.constructorArgumentsResolved = true;
					mbd.resolvedConstructorArguments = EMPTY_ARGS;
				}
				bw.setBeanInstance(instantiate(beanName, mbd, uniqueCandidate, EMPTY_ARGS));
				return bw;
			}
		}

		// Need to resolve the constructor.
		boolean autowiring = (chosenCtors != null ||
				mbd.getResolvedAutowireMode() == AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR);
		ConstructorArgumentValues resolvedValues = null;

		int minNrOfArgs;
		if (explicitArgs != null) {
			minNrOfArgs = explicitArgs.length;
		}
		else {
			// 提取配置文件中的配置的构造函数参数
			ConstructorArgumentValues cargs = mbd.getConstructorArgumentValues();
			// 用于承载解析后的构造函数参数的值
			resolvedValues = new ConstructorArgumentValues();
			// 能解析到的参数个数
			minNrOfArgs = resolveConstructorArguments(beanName, mbd, bw, cargs, resolvedValues);
		}

		// 排序给定的构造函数,public的构造函数优先,参数数量降序
		AutowireUtils.sortConstructors(candidates);
		int minTypeDiffWeight = Integer.MAX_VALUE;
		Set<Constructor<?>> ambiguousConstructors = null;
		LinkedList<UnsatisfiedDependencyException> causes = null;

		for (Constructor<?> candidate : candidates) {
			int parameterCount = candidate.getParameterCount();

			// 如果已经找到选用的构造函数或者需要的参数个数小于当前的构造函数参数个数则终止,前面已经经过了排序操作
			if (constructorToUse != null && argsToUse != null && argsToUse.length > parameterCount) {
				// Already found greedy constructor that can be satisfied ->
				// do not look any further, there are only less greedy constructors left.
				break;
			}
			if (parameterCount < minNrOfArgs) {
				// 参数个数不相等
				continue;
			}

			ArgumentsHolder argsHolder;
			Class<?>[] paramTypes = candidate.getParameterTypes();
			if (resolvedValues != null) {
				// 有参数则根据值构造对应参数类型的参数
				try {
					String[] paramNames = ConstructorPropertiesChecker.evaluate(candidate, parameterCount);
					if (paramNames == null) {
						// 获取参数名称探索器
						ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer();
						if (pnd != null) {
							// 获取指定构造函数的参数名称
							paramNames = pnd.getParameterNames(candidate);
						}
					}
					// 根据名称和数据类型创建参数持有者
					argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw, paramTypes, paramNames,
							getUserDeclaredConstructor(candidate), autowiring, candidates.length == 1);
				}
				catch (UnsatisfiedDependencyException ex) {
					if (logger.isTraceEnabled()) {
						logger.trace("Ignoring constructor [" + candidate + "] of bean '" + beanName + "': " + ex);
					}
					// Swallow and try next constructor.
					if (causes == null) {
						causes = new LinkedList<>();
					}
					causes.add(ex);
					continue;
				}
			}
			else {
				// Explicit arguments given -> arguments length must match exactly.
				if (parameterCount != explicitArgs.length) {
					continue;
				}
				// 构造函数没有参数的情况
				argsHolder = new ArgumentsHolder(explicitArgs);
			}

			// 探测是否有不确定性的构造函数存在,例如不同构造函数的参数为父子关系
			int typeDiffWeight = (mbd.isLenientConstructorResolution() ?
					argsHolder.getTypeDifferenceWeight(paramTypes) : argsHolder.getAssignabilityWeight(paramTypes));
			// Choose this constructor if it represents the closest match.
			// 如果它代表着当前最接近的匹配则选择作为构造函数
			if (typeDiffWeight < minTypeDiffWeight) {
				constructorToUse = candidate;
				argsHolderToUse = argsHolder;
				argsToUse = argsHolder.arguments;
				minTypeDiffWeight = typeDiffWeight;
				ambiguousConstructors = null;
			}
			else if (constructorToUse != null && typeDiffWeight == minTypeDiffWeight) {
				if (ambiguousConstructors == null) {
					ambiguousConstructors = new LinkedHashSet<>();
					ambiguousConstructors.add(constructorToUse);
				}
				ambiguousConstructors.add(candidate);
			}
		}

		if (constructorToUse == null) {
			if (causes != null) {
				UnsatisfiedDependencyException ex = causes.removeLast();
				for (Exception cause : causes) {
					this.beanFactory.onSuppressedException(cause);
				}
				throw ex;
			}
			throw new BeanCreationException(mbd.getResourceDescription(), beanName,
					"Could not resolve matching constructor " +
					"(hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)");
		}
		else if (ambiguousConstructors != null && !mbd.isLenientConstructorResolution()) {
			throw new BeanCreationException(mbd.getResourceDescription(), beanName,
					"Ambiguous constructor matches found in bean '" + beanName + "' " +
					"(hint: specify index/type/name arguments for simple parameters to avoid type ambiguities): " +
					ambiguousConstructors);
		}

		if (explicitArgs == null && argsHolderToUse != null) {
			// 将解析的构造函数加入缓存
			argsHolderToUse.storeCache(mbd, constructorToUse);
		}
	}

	Assert.state(argsToUse != null, "Unresolved constructor arguments");
	// 将构造的实例加入BeanWrapper中
	bw.setBeanInstance(instantiate(beanName, mbd, constructorToUse, argsToUse));
	return bw;
}
2.1.4、instantiateBean();默认构造函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
	try {
		Object beanInstance;
		final BeanFactory parent = this;
		if (System.getSecurityManager() != null) {
			beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
					getInstantiationStrategy().instantiate(mbd, beanName, parent),
					getAccessControlContext());
		}
		else {
			// 获取实例化策略并且进行实例化操作
			beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
		}
		// 包装成BeanWrapper
		BeanWrapper bw = new BeanWrapperImpl(beanInstance);
		initBeanWrapper(bw);
		return bw;
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
		// bd对象定义中,是否包含MethodOverride列表,
		// spring中有两个标签参数会产生MethodOverrides,分别是lookup-method,replaced-method
		// 没有MethodOverrides对象,可以直接实例化
	if (!bd.hasMethodOverrides()) {
		// 实例化对象的构造方法
		Constructor<?> constructorToUse;
		// 锁定对象,使获得实例化构造方法线程安全
		synchronized (bd.constructorArgumentLock) {
			// 查看bd对象里使用否含有构造方法
			constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
			if (constructorToUse == null) {
				// 从bd中获取beanClass
				final Class<?> clazz = bd.getBeanClass();
				// 如果要实例化的beanDefinition是一个接口,则直接抛出异常
				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中的属性
					bd.resolvedConstructorOrFactoryMethod = constructorToUse;
				}
				catch (Throwable ex) {
					throw new BeanInstantiationException(clazz, "No default constructor found", ex);
				}
			}
		}
		// 通过反射生成具体的实例化对象
		return BeanUtils.instantiateClass(constructorToUse);
	}
	else {
		// 生成cglib子类
		return instantiateWithMethodInjection(bd, beanName, owner);
	}
}
2.2、applyMergedBeanDefinitionPostProcessors();应用后置处理器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
	//获取BeanFactory中已注册的BeanPostProcessor
	for (BeanPostProcessor bp : getBeanPostProcessors()) {
		if (bp instanceof MergedBeanDefinitionPostProcessor) {
			// 调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法,
            // 对指定bean的给定MergedBeanDefinition进行后置处理,@Autowire注解在这边对元数据进行预解析
			MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
			bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
		}
	}
}
2.3、addSingletonFactory();提前曝光beanName的ObjectFactory,用于解决循环引用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
	Assert.notNull(singletonFactory, "Singleton factory must not be null");
	synchronized (this.singletonObjects) {
		// 如果beanName不存在于一级缓存(完整对象bean)
		if (!this.singletonObjects.containsKey(beanName)) {
			// 将beanName和singletonFactory
			// 注册到三级缓存(工厂bean缓存)
			this.singletonFactories.put(beanName, singletonFactory);
			// 移除二级缓存(没有属性填充bean)
			this.earlySingletonObjects.remove(beanName);
			// 将beanName注册到registeredSingletons缓存(已经注册的单例集合)
			this.registeredSingletons.add(beanName);
		}
	}
}
2.4、getEarlyBeanReference();获取对指定bean的早期访问的引用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
	Object exposedObject = bean;
	// 如果bean不为空 && mbd不是合成 && 存在InstantiationAwareBeanPostProcessors
	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			// 应用所有SmartInstantiationAwareBeanPostProcessor,调用getEarlyBeanReference方法
			if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
				// // 3.允许SmartInstantiationAwareBeanPostProcessor返回指定bean的早期引用
				SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
				exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
			}
		}
	}
	//返回要作为bean引用公开的对象,如果没有SmartInstantiationAwareBeanPostProcessor修改,
	//则返回的是入参的bean对象本身
	return exposedObject;
}
2.5、populateBean();属性填充
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
	// bw为空时的处理
	if (bw == null) {
		if (mbd.hasPropertyValues()) {
			// 如果bw为空,属性不为空,抛异常,无法将属性值应用于null实例
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
		}
		else {
			// 如果bw为空,属性也为空,则跳过
			return;
		}
	}

	// 用于标识是否继续之后的属性填充
	boolean continueWithPropertyPopulation = true;
	// 如果mbd不是合成的 && 存在InstantiationAwareBeanPostProcessor
	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			// 遍历处理InstantiationAwareBeanPostProcessor
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				// 在bean实例化后,属性填充之前被调用,允许修改bean的属性,如果返回false,则跳过之后的属性填充
				if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
					//如果返回false,将continueWithPropertyPopulation赋值为false,代表要跳过之后的属性填充
					continueWithPropertyPopulation = false;
					break;
				}
			}
		}
	}
	// 如果continueWithPropertyPopulation为false,则跳过之后的属性填充
	if (!continueWithPropertyPopulation) {
		return;
	}
	// 返回此bean的属性值
	PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

    // 解析自动装配模式为AUTOWIRE_BY_NAME和AUTOWIRE_BY_TYPE
	if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
		
		MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
		// 2.5.1、解析autowireByName的注入
		if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
			autowireByName(beanName, mbd, bw, newPvs);
		}
		// 2.5.2、解析autowireByType的注入
		if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
			autowireByType(beanName, mbd, bw, newPvs);
		}
		pvs = newPvs;
	}
	
	// BeanFactory是否注册过InstantiationAwareBeanPostProcessors
	boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
	// 是否需要依赖检查
	boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
	
	PropertyDescriptor[] filteredPds = null;
	// 注册过InstantiationAwareBeanPostProcessors
	if (hasInstAwareBpps) {
		if (pvs == null) {
			pvs = mbd.getPropertyValues();
		}
		// 应用后置处理器InstantiationAwareBeanPostProcessor
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
				if (pvsToUse == null) {
					if (filteredPds == null) {
						filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
					}
					// 应用后置处理器InstantiationAwareBeanPostProcessor的方法postProcessPropertyValues,
                    // 进行属性填充前的再次处理。例子:现在最常用的@Autowire属性注入就是这边注入依赖的bean实例对象
					pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
					if (pvsToUse == null) {
						return;
					}
				}
				pvs = pvsToUse;
			}
		}
	}
	if (needsDepCheck) {
		if (filteredPds == null) {
			filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
		}
		// 依赖检查,对应depends-on属性
		checkDependencies(beanName, mbd, filteredPds, pvs);
	}

	if (pvs != null) {
		// 5.2.3、 将所有PropertyValues中的属性填充到bean中
		applyPropertyValues(beanName, mbd, bw, pvs);
	}
}
2.5.1、autowireByName();根据名称注入
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void autowireByName(
		String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
	// 寻找bw中需要依赖注入的属性
	String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
	for (String propertyName : propertyNames) {
		// 校验是否存在beanName=propertyName的bean实例或者BeanDefinition
		if (containsBean(propertyName)) {
			// 获取propertyName的bean实例对象
			Object bean = getBean(propertyName);
			// 将属性名和属性值添加到pvs
			pvs.add(propertyName, bean);
			// 注册依赖关系到缓存(beanName依赖propertyName)
			registerDependentBean(propertyName, beanName);
			if (logger.isTraceEnabled()) {
				logger.trace("Added autowiring by name from bean name '" + beanName +
						"' via property '" + propertyName + "' to bean named '" + propertyName + "'");
			}
		}
		else {
			if (logger.isTraceEnabled()) {
				logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName +
						"' by name: no matching bean found");
			}
		}
	}
}
2.5.2、autowireByType();根据类型注入
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void autowireByType(
		String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {

	TypeConverter converter = getCustomTypeConverter();
	if (converter == null) {
		converter = bw;
	}

	Set<String> autowiredBeanNames = new LinkedHashSet<>(4);
	// 寻找bw中需要依赖注入的属性
	String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
	// 遍历所有需要依赖注入的属性
	for (String propertyName : propertyNames) {
		try {
			PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
			// Don't try autowiring by type for type Object: never makes sense,
			// even if it technically is a unsatisfied, non-simple property.
			if (Object.class != pd.getPropertyType()) {
				// 获取指定属性的set方法,封装成MethodParameter(必须有set方法才能通过属性来注入)
				MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
				// Do not allow eager init for type matching in case of a prioritized post-processor.
				boolean eager = !PriorityOrdered.class.isInstance(bw.getWrappedInstance());
				// 将MethodParameter的方法参数索引信息封装成DependencyDescriptor
				DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
				// 解析当前属性所匹配的bean实例,并把解析到的bean实例的beanName存储在autowiredBeanNames中
				Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);
				if (autowiredArgument != null) {
					// 如果找到了依赖的bean实例,将属性名和bean实例放到pvs中
					pvs.add(propertyName, autowiredArgument);
				}
				for (String autowiredBeanName : autowiredBeanNames) {
					// 注册依赖关系,beanName依赖autowiredBeanName
					registerDependentBean(autowiredBeanName, beanName);
					if (logger.isTraceEnabled()) {
						logger.trace("Autowiring by type from bean name '" + beanName + "' via property '" +
								propertyName + "' to bean named '" + autowiredBeanName + "'");
					}
				}
				autowiredBeanNames.clear();
			}
		}
		catch (BeansException ex) {
			throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
		}
	}
}
2.5.3、applyPropertyValues();将属性填充到bean中
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
	if (pvs.isEmpty()) {
		return;
	}

	if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
		((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
	}

	MutablePropertyValues mpvs = null;
	List<PropertyValue> original;
	// 获取属性值列表
	if (pvs instanceof MutablePropertyValues) {
		mpvs = (MutablePropertyValues) pvs;
		// 如果mpvs中的值已经被转换为对应的类型,那么可以直接设置到BeanWrapper中
		if (mpvs.isConverted()) {
			// Shortcut: use the pre-converted values as-is.
			try {
				bw.setPropertyValues(mpvs);
				return;
			}
			catch (BeansException ex) {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Error setting property values", ex);
			}
		}
		// 如果pvs并不是使用MutablePropertyValues封装的类型,那么直接使用原始的属性获取方法
		original = mpvs.getPropertyValueList();
	}
	else {
		original = Arrays.asList(pvs.getPropertyValues());
	}

	TypeConverter converter = getCustomTypeConverter();
	if (converter == null) {
		converter = bw;
	}
	// 获取对应的解析器
	BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);

	// 创建深层拷贝副本,用于存放解析后的属性值
	List<PropertyValue> deepCopy = new ArrayList<>(original.size());
	boolean resolveNecessary = false;
	// 遍历属性,将属性转换为对应类的对应属性的类型
	for (PropertyValue pv : original) {
		if (pv.isConverted()) {
			// 如果pv已经包含转换的值,则直接添加到deepCopy
			deepCopy.add(pv);
		}
		else {
            // 否则,进行转换
            // 拿到pv的原始属性名和属性值
			String propertyName = pv.getName();
			Object originalValue = pv.getValue();
			// 使用解析器解析原始属性值
			Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
			Object convertedValue = resolvedValue;
			// 判断该属性是否可转换
			boolean convertible = bw.isWritableProperty(propertyName) &&
					!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
			if (convertible) {
				// 如果可转换,则转换指定目标属性的给定值
				convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
			}
			// Possibly store converted value in merged bean definition,
			// 在合并的BeanDefinition中存储转换后的值,以避免为每个创建的bean实例重新转换
			if (resolvedValue == originalValue) {
				if (convertible) {
					pv.setConvertedValue(convertedValue);
				}
				deepCopy.add(pv);
			}
			else if (convertible && originalValue instanceof TypedStringValue &&
					!((TypedStringValue) originalValue).isDynamic() &&
					!(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
				pv.setConvertedValue(convertedValue);
				deepCopy.add(pv);
			}
			else {
				resolveNecessary = true;
				deepCopy.add(new PropertyValue(pv, convertedValue));
			}
		}
	}
	if (mpvs != null && !resolveNecessary) {
		mpvs.setConverted();
	}

	// Set our (possibly massaged) deep copy.
	try {
		// 设置bean的属性值为deepCopy
		bw.setPropertyValues(new MutablePropertyValues(deepCopy));
	}
	catch (BeansException ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Error setting property values", ex);
	}
}
2.6、initializeBean();初始化bean
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
	// 激活Aware方法
	if (System.getSecurityManager() != null) {
		AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
			// 2.6.1、执行Aware方法
			invokeAwareMethods(beanName, bean);
			return null;
		}, getAccessControlContext());
	}
	else {
		invokeAwareMethods(beanName, bean);
	}

	Object wrappedBean = bean;
	if (mbd == null || !mbd.isSynthetic()) {
		// 2.6.2、在初始化前应用BeanPostProcessor的postProcessBeforeInitialization方法,允许对bean实例进行包装
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}

	try {
		// 2.6.3、调用初始化方法
		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()) {
		// 2.6.4、在初始化后应用BeanPostProcessor的postProcessAfterInitialization方法,允许对bean实例进行包装
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}

	return wrappedBean;
}
2.6.1、invokeAwareMethods();执行Aware方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void invokeAwareMethods(final String beanName, final Object bean) {
    if (bean instanceof Aware) {
        // BeanNameAware: 实现此接口的类想要拿到beanName,因此我们在这边赋值给它
        if (bean instanceof BeanNameAware) {
            ((BeanNameAware) bean).setBeanName(beanName);
        }
        // BeanClassLoaderAware:实现此接口的类想要拿到beanClassLoader,因此我们在这边赋值给它
        if (bean instanceof BeanClassLoaderAware) {
            ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
        }
        // BeanFactoryAware: 实现此接口的类想要拿到 BeanFactory,因此我们在这边赋值给它
        if (bean instanceof BeanFactoryAware) {
            ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
        }
    }
}
2.6.2、applyBeanPostProcessorsBeforeInitialization();初始化前后置处理器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
        throws BeansException {
 
    Object result = existingBean;
    // 1.遍历所有注册的BeanPostProcessor实现类,调用postProcessBeforeInitialization方法
    for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
        // 2.在bean初始化方法执行前,调用postProcessBeforeInitialization方法
        result = beanProcessor.postProcessBeforeInitialization(result, beanName);
        if (result == null) {
            return result;
        }
    }
    return result;
}
2.6.3、invokeInitMethods();初始化方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
        throws Throwable {
 
    // 1.首先检查bean是否实现了InitializingBean接口,如果是的话调用afterPropertiesSet方法
    boolean isInitializingBean = (bean instanceof InitializingBean);
    if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
        if (logger.isDebugEnabled()) {
            logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
        }
        // 2.调用afterPropertiesSet方法
        if (System.getSecurityManager() != null) {
            try {
                AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
                    @Override
                    public Object run() throws Exception {
                        ((InitializingBean) bean).afterPropertiesSet();
                        return null;
                    }
                }, getAccessControlContext());
            } catch (PrivilegedActionException pae) {
                throw pae.getException();
            }
        } else {
            ((InitializingBean) bean).afterPropertiesSet();
        }
    }
 
    if (mbd != null) {
        String initMethodName = mbd.getInitMethodName();
        if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                !mbd.isExternallyManagedInitMethod(initMethodName)) {
            // 3.调用自定义初始化方法
            invokeCustomInitMethod(beanName, bean, mbd);
        }
    }
}
2.6.4、applyBeanPostProcessorsAfterInitialization();初始化后方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
        throws BeansException {
 
    Object result = existingBean;
    // 1.遍历所有注册的BeanPostProcessor实现类,调用postProcessAfterInitialization方法
    for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
        // 2.在bean初始化方法执行后,调用postProcessAfterInitialization方法
        result = beanProcessor.postProcessAfterInitialization(result, beanName);
        if (result == null) {
            return result;
        }
    }
    return result;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
这次彻底搞懂IoC容器依赖注入的源码
初始化的过程,主要完成的工作是在容器中建立 BeanDefinition 数据映射,并没有看到容器对Bean依赖关系进行注入。
JavaEdge
2021/10/18
4100
Spring源码分析(六)FactoryBean 接口解析
说道FactoryBean,不少人会拿它跟BeanFactory作比较,但是实际上他们没有多大关系;我们简单介绍一下两者
石臻臻的杂货铺[同名公众号]
2021/07/14
7760
【小家Spring】AbstractBeanFactory#getBean()、doGetBean完成Bean的初始化、实例化,以及BeanPostProcessor后置处理器源码级详细分析
这边博文,主要讲解我们Spring IOC容器的主菜:Bean的实例化、初始化。 通过之前跟踪Spring IOC刷新的源码,我们所有的剩余的单例Bean都是通过这一步:finishBeanFactoryInitialization(beanFactory);来进行初始化的。最重要的一个方法就为:DefaultListableBeanFactory#preInstantiateSingletons 其内部核心方法为:getBean --> doGetBean方法
YourBatman
2019/09/03
1.9K0
【小家Spring】AbstractBeanFactory#getBean()、doGetBean完成Bean的初始化、实例化,以及BeanPostProcessor后置处理器源码级详细分析
Spring核心原理之 IoC容器中那些鲜为人知的细节(3)
Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化、使用FactoryBean产生或者修饰Bean对象的生成、IoC容器在初始化Bean过程中使用BeanPostProcessor后置处理器对Bean声明周期事件进行管理等。
Tom弹架构
2021/12/27
3330
Spring之Bean容器源码理解,Spring4.3.12.RELEASE版本
1、Spring容器创建以及初始化过程。Spring容器的refresh(),是容器的创建以及刷新功能。整个容器就是通过refresh()方法运行完成以后,实现容器创建、以及将所有的bean创建对象、初始化完成。this();是做预处理操作,register(annotatedClasses);是做解析操作。
别先生
2020/01/02
6320
SpringIOC源码解析(下)
本篇文章是SpringIOC源码解析(上)的续集,上一篇文章介绍了使用XML的方式启动Spring,然后追踪了BeanFactory容器的创建、配置文件的解析、Bean的注册等,本篇文章继续分析Bean的初始化流程
Java学习录
2019/08/05
4520
Spring源码解析(五)Spring 加载bean 依赖注入
至此,我们分析过后,可以简单的归纳一下Spring IOC容器的过程 一、Resource定位过程 这个Resource定位指的的是BeanDefinition的资源定位,他由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一接口,对于这些BeanDefinition的存在形式,相信大家都不会感到陌生,比如,在类路径中的Bean定义信息可以使用FileSystemResouce来进行抽象;在类路径中的Bean定义信息可以使用前面提到的ClassPathResource来使用,等待;这个定位过程类似于容器寻找数据的过程,就像用水桶装水先要把水找到一样;
石臻臻的杂货铺[同名公众号]
2021/07/14
6270
Spring 容器的创建过程
Spring 容器首先会执行 org.springframework.context.annotation.AnnotationConfigApplicationContext 的一个方法:
wsuo
2020/07/31
1.2K0
Bean的生命周期流程-上
Spring拥有一套完善的Bean生命周期体系,而使得这套生命周期体系具有高扩展性的关键在于Bean生命周期回调接口,通过这些接口我们可以动态的插入Bean生命周期初始化的各个阶段,然后进行一系列动态代理,自动注入,属性校验的工作。
大忽悠爱学习
2022/12/27
3860
Bean的生命周期流程-上
Spring Ioc 之 Bean的加载(一)
当我们显示或者隐式地调用 BeanFactory#getBean(String name) 方法时,则会触发加载 Bean 阶段。代码如下:
周同学
2019/09/08
8210
深入理解-Spring-之源码剖析IOC(二)
我们刚刚创建了Bean工厂,并创建 BeanDefinitions 放进Map里,以beanName为key。那么我们现在有了Bean定义,但还没有实例,也没有构建Bean与Bean之间的依赖关系。
Bug开发工程师
2018/09/21
4300
深入理解-Spring-之源码剖析IOC(二)
这一次搞懂Spring的Bean实例化原理
前两篇文章分析了Spring XML和注解的解析原理,并将其封装为BeanDefinition对象存放到IOC容器中,而这些只是refresh方法中的其中一个步骤——obtainFreshBeanFactory,接下来就将围绕着这些BeanDefinition对象进行一系列的处理,如BeanDefinitionRegistryPostProcessor对象方法的调用、BeanFactoryPostProcessor对象方法的调用以及Bean实例的创建都离不开这些BeanDefinition对象。下面就来看看Spring是如何处理这些对象的。
夜勿语
2020/09/07
8940
Spring IoC容器的依赖注入1 getBean触发的依赖注入2. lazy-init属性和预实例化
初始化的过程,主要完成的工作是在容器中建立 BeanDefinition 数据映射,并没有看到容器对Bean依赖关系进行注入 假设当前IoC容器已经载入用户定义的Bean信息,依赖注入主要发生在两个阶段 正常情况下,由用户第一次向IoC容器索要Bean时触发 但我们可以在 BeanDefinition 信息中通过控制 lazy-init 属性来让容器完成对Bean的预实例化,即在初始化的过程中就完成某些Bean的依赖注入的过程 1 getBean触发的依赖注入 BeanFactory 是最原始的 ioc 容
JavaEdge
2018/05/16
1.2K0
Spring源码解析(四):单例bean的创建流程
冬天vs不冷
2025/01/21
2070
Spring源码解析(四):单例bean的创建流程
Spring源码解读:一个单例Bean的生命周期
在以前梳理SpringBean创建的源码的时候有说过,画一张其涉及的接口的流程图,现在补上这个坑。同时以前主要是重点关注Spring的代码逻辑(导致我自己现在去看也不是很能看下去)。在这个重读系列,我们从其的整体结构出发,如果不是特别的重要的逻辑,我们就不关注里面的一些细节逻辑。
Java程序猿阿谷
2021/01/20
3800
Spring源码解读:一个单例Bean的生命周期
Spring读源码系列05----bean的加载---中
大家在阅读本篇文章到populateBean部分的时候,可以先看一下本篇文章,不然可能会有些懵逼
大忽悠爱学习
2022/05/10
4630
Spring读源码系列05----bean的加载---中
Spring IOC 容器源码分析 - 创建原始 bean 对象
本篇文章是上一篇文章(创建单例 bean 的过程)的延续。在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程。本篇文章,我们就从战术的层面上,详细分析doCreateBean方法中的一个重要的调用,即createBeanInstance方法。在本篇文章中,你将看到三种不同的构造 bean 对象的方式。你也会了解到构造 bean 对象的两种策略。如果你对这些内容感兴趣,那么不妨继续往下读。我会在代码进行大量的注解,相信能帮助你理解代码逻辑。好了,其他的就不多说了,进入正题吧。
田小波
2018/06/06
8170
Spring IOC 容器源码分析 - 创建原始 bean 对象
Spring Ioc源码分析 之 Bean的加载(五):实例化Bean
在doCreateBean()代码 <2> 处,有一行代码instanceWrapper = createBeanInstance(beanName, mbd, args); 我们追踪进去看一下:
周同学
2019/09/18
1.5K0
Spring Ioc源码分析 之 Bean的加载(五):实例化Bean
Spring IOC 容器源码分析
Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。
yaphetsfang
2022/05/10
2710
Spring IOC 容器源码分析
Spring读源码系列04----bean的加载---上
spring 3.0版本,是将后置处理的代码放在了doGetObjectFromFactoryBean的return语句之前进行判断窒息的,但是现在最新版本放到了getObjectFromFactoryBean方法中
大忽悠爱学习
2022/05/10
4170
Spring读源码系列04----bean的加载---上
推荐阅读
相关推荐
这次彻底搞懂IoC容器依赖注入的源码
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 一、基本组件结构介绍
  • 二、注解方式IOC容器加载
    • 1、注解方法启动类
    • 2、AnnotationConfigApplicationContext 的构造方法
      • 2.1、创建bean工厂-beanFactory
      • 2.2、注册配置类(Config.class)
      • 2.3、容器刷新
  • 三、bean的加载准备工作
    • 1、完成bean工厂的初始化
      • 1.1、getMergedLocalBeanDefinition(beanName);获取合并bean定义信息
      • 1.2、isFactoryBean(beanName) 判断bean是否为FactoryBean
  • 四、doGetBean();获取bean对象
    • 1、getSingleton()获取单例bean
    • 2、getObjectForBeanInstance();返回bean真正的实例对象
    • 3、isDependent(beanName, dep);检查dep是否依赖于beanName
    • 4、registerDependentBean();注册依赖关系到缓存中
    • 5、getSingleton(String beanName, ObjectFactory<?> singletonFactory);单例bean创建
      • 5.1、5.2、beforeSingletonCreation、afterSingletonCreation 创建单例前后操作
      • 5.3、addSingleton 新创建对象,添加到缓存
    • 6、beforePrototypeCreation、afterPrototypeCreation 多例对象创建前后操作
  • 五、createBean();创建bean对象
    • 1、resolveBeforeInstantiation 实例化前操作
      • 1.1、实例化前的后置处理器
    • 2、doCreateBean 创建bean实例
      • 2.1、createBeanInstance 根据策略实例化bean
      • 2.2、applyMergedBeanDefinitionPostProcessors();应用后置处理器
      • 2.3、addSingletonFactory();提前曝光beanName的ObjectFactory,用于解决循环引用
      • 2.4、getEarlyBeanReference();获取对指定bean的早期访问的引用
      • 2.5、populateBean();属性填充
      • 2.6、initializeBean();初始化bean
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档