栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

IOC容器加载-深度解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

IOC容器加载-深度解析

文章目录
  • 一、基本组件结构介绍
  • 二、注解方式IOC容器加载源码解析
    • 1、注解方法启动类
    • 2、AnnotationConfigApplicationContext 的构造方法
      • 2.1、创建bean工厂-beanFactory
        • 2.1.1、注册默认后置处理器
        • 2.1.2、自定义扫描包功能
      • 2.2、注册配置类(Config.class)
      • 2.3、容器刷新
        • 2.3.1、prepareRefresh();刷新前预处理
        • 2.3.2、obtainFreshBeanFactory();获取最新的bean工厂(beanFactory)
        • 2.3.3、prepareBeanFactory(beanFactory);注册bean工厂的类加载器和部分后置处理器
        • 2.3.4、postProcessBeanFactory(beanFactory);bean工厂的后置处理器(子类实现)
        • 2.3.5、invokeBeanFactoryPostProcessors(beanFactory);执行bean工厂的后置处理器
        • 2.3.6、registerBeanPostProcessors(beanFactory);实例化并注册所有后置处理器
        • 2.3.7、initMessageSource();初始化MessageSource组件
        • 2.3.8、initApplicationEventMulticaster();初始化事件多播器(用来广播事件)
        • 2.3.9、onRefresh();扩展方法,空实现
        • 2.3.10、registerListeners();注册监听器
        • 2.3.11、finishBeanFactoryInitialization(beanFactory);实例化所有剩余的(非惰性)单例bean
        • 2.3.12、finishRefresh();最后一步:发布相应的事件
          • 2.3.12.1、初始化生命周期处理器
        • 使用监听器
          • 1、注册事件
          • 2、注册监听器
          • 3、发布事件
          • 4、使用
        • 2.3.13、异常情况
          • 2.3.13.1、destroyBeans();销毁单例bean
          • 2.3.13.2、cancelRefresh(ex);设置容器激活状态为否
  • 三、bean的加载源码解析
    • 1、完成bean工厂的初始化
    • 2、实例化所有剩余(非懒加载)单例对象
      • 2.1、getMergedLocalBeanDefinition(beanName);获取合并bean定义信息
      • 2.2、getSingleton()获取单例bean
    • 3、getBean(beanName);获取bean对象

一、基本组件结构介绍
  1. xxxPostProcessor:后置处理器(各种组件可以bean实例化前后初始化前后自定义执行操作)
  2. xxxAware:可以将spring容器中对应的对象注入进来
  3. xxxRegistry:对bean或beanDefinition的注册(添加、删除、是否存在等)
二、注解方式IOC容器加载源码解析 1、注解方法启动类

配置类

@ComponentScan("com.xc.lifecycle.entity")
@Configuration
public class Config {
    @Bean()
    public Book book(){
        return new Book();
    }
}

启动类

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的有参构造方法



注册默认后置处理器

public static Set 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 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添加一个自助扫描的包的功能;一般用不到

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、容器刷新 2.3.1、prepareRefresh();刷新前预处理

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

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工厂的类加载器和部分后置处理器
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));
	//跳过以下6个属性的自动注入
	//因为在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);

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

	// 注册当前容器环境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公共后置处理器
public static void invokeBeanFactoryPostProcessors(
		ConfigurableListableBeanFactory beanFactory, List beanFactoryPostProcessors) {

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

	//如果有BeanDefinitionRegistryPostProcessors-bean定义后置处理器,先执行。
	//(后执行BeanFactoryPostProcessor-bean工厂后置处理器)
	if (beanFactory instanceof BeanDefinitionRegistry) {
		BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
		// 用于存放入参bean定义后置处理器集合
		List regularPostProcessors = new ArrayList<>();
		// 用于存放bean定义后置处理器集合
		List 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 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工厂后置处理器大致一样

// 实例化所有的BeanPostProcessor并将其注册到BeanFactory中
public static void registerBeanPostProcessors(
      ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
   // 获取beanFactory中所有的BeanPostProcessor类型的bean的名字,此处为空
   String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
   
   // 当BeanPostProcessor实例化过程中有bean被创建,则注册一个BeanPostProcessorChecker记录信息 
   // 也就是说一个bean没有资格被所有的BeanPostProcessor处理
   int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
   beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

   // 对所有的BeanPostProcessor根据实现不同的接口(PriorityOrdered,Ordered等)进行分离
   // 用于存放实现了PriorityOrdered.class的后处理器集合 
   List priorityOrderedPostProcessors = new ArrayList<>();
   // 用于存放实现了PriorityOrdered.class并且是MergedBeanDefinitionPostProcessor类型的后处理器集合
   List internalPostProcessors = new ArrayList<>();
   // 用于存放实现了Ordered.class的后处理器集合 
   List orderedPostProcessorNames = new ArrayList<>();
   // 用于存放其它情况的后处理器集合 
   List 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 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 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();注册监听器
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 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();最后一步:发布相应的事件
protected void finishRefresh() {
	// 清理缓存信息
	clearResourceCaches();

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

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

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

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

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

使用监听器 1、注册事件
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、注册监听器
@Component
public class MyApplicationListener implements ApplicationListener {

	@Override
	public void onApplicationEvent(MyApplicationEvent event) {

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

	}
}

3、发布事件
@Component
public class MyAnnotationApplicationListener {

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

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

4、使用

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

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);实例化所有剩余的(非惰性)单例bean

1、完成bean工厂的初始化
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();
}
2、实例化所有剩余(非懒加载)单例对象
@Override
public void preInstantiateSingletons() throws BeansException {
	if (logger.isTraceEnabled()) {
		logger.trace("Pre-instantiating singletons in " + this);
	}

	// 创建beanDefinitionNames的副本beanNames用于后续的遍历,以允许init等方法注册新的bean定义
	List 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是否希望急切的初始化
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
						isEagerInit = AccessController.doPrivileged((PrivilegedAction)
										((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) () -> {
					smartSingleton.afterSingletonsInstantiated();
					return null;
				}, getAccessControlContext());
			}
			else {
				smartSingleton.afterSingletonsInstantiated();
			}
		}
	}
}
 
2.1、getMergedLocalBeanDefinition(beanName);获取合并bean定义信息 


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

举个例子



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

2.2、getSingleton()获取单例bean

@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
	//从单例对象缓存中获取beanName对应的单例对象
	Object singletonObject = this.singletonObjects.get(beanName);
    //如果单例对象缓存中没有,并且该beanName对应的单例bean正在创建中
	if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
		synchronized (this.singletonObjects) {
            // 从早期单例对象缓存中获取单例对象(之所称成为早期单例对象,是因为earlySingletonObjects里
            // 的对象的都是通过提前曝光的ObjectFactory创建出来的,还未进行属性填充等操作)
			singletonObject = this.earlySingletonObjects.get(beanName);
            // 如果在早期单例对象缓存中也没有,并且允许创建早期单例对象引用
			if (singletonObject == null && allowEarlyReference) {
                // 从单例工厂缓存中获取beanName的单例工厂
				ObjectFactory singletonFactory = this.singletonFactories.get(beanName);
				if (singletonFactory != null) {
                    // 如果存在单例对象工厂,则通过工厂创建一个单例对象
					singletonObject = singletonFactory.getObject();
                    // 将通过单例对象工厂创建的单例对象,放到早期单例对象缓存中
					this.earlySingletonObjects.put(beanName, singletonObject);
					// 移除该beanName对应的单例对象工厂,
					// 因为该单例工厂已经创建了一个实例对象,并且放到earlySingletonObjects缓存了
                    // 所以,后续获取beanName的单例对象,
                    // 可以通过earlySingletonObjects缓存拿到,不需要在用到该单例工厂
					this.singletonFactories.remove(beanName);
				}
			}
		}
	}
	return singletonObject; //返回对象
}


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

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

另外引入4个重要缓存:

  • singletonObjects 缓存:beanName -> 单例 bean 对象。
  • earlySingletonObjects 缓存:beanName -> 单例 bean 对象,该缓存存放的是早期单例 bean 对象,可以理解成还未进行属性填充、初始化。
  • singletonFactories 缓存:beanName -> ObjectFactory。
  • singletonsCurrentlyInCreation 缓存:当前正在创建单例 bean 对象的 beanName 集合。
3、getBean(beanName);获取bean对象

protected  T doGetBean(final String name, @Nullable final Class requiredType,
		@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
	//解析beanName,主要是解析别名、去掉FactoryBean的前缀“&”
	final String beanName = transformedBeanName(name);
	Object bean;

	// 从缓存中获取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 + "'");
			}
		}
		// 返回beanName对应的实例对象(主要用于FactoryBean的特殊处理,普通Bean会直接返回sharedInstance本身)
		bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
	}

	else {
        // 4.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)) {
			// Not found -> check parent.
			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.2、检查dep是否依赖于beanName,即检查是否存在循环依赖
					if (isDependent(beanName, dep)) {
						//如果是循环依赖则抛异常
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
					}
					//3.3、将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()) {
				//3.4、单例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;
					}
				});
				// 3.6、返回beanName对应的实例对象
				bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
			}

			else if (mbd.isPrototype()) {
				// 多例的bean创建
				Object prototypeInstance = null;
				try {
					// 创建实例前的操作(将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;
}

…未完待续

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号