AnnotationConfigApplicationContext的注册和刷新

spring ioc

//容器的注册和刷新
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
   this();
   register(annotatedClasses);
   refresh();
}
  1. prepareRefresh():刷新前的预刷新

    • initPropertySources():初始化一些属性设置;子类自定义个性化属性设置方法
    • getEnvironment().validateRequiredProperties():检验属性的合法性
    • this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中的一些早期的事件
  2. obtainFreshBeanFactory():获取beanFactory实例

    • refreshBeanFactory():刷新或创建beanFactory【DefaultListAbleBeanFactory】
    • getBeanFactory():将刚生成的GenericApplicationContext创建的beanFactory返回
    • 将创建的BeanFactory【DefaultListAbleBeanFactory】返回
  3. prepareBeanFactory(beanFactory):beanFactory预准备工作,(以上创建的beanFactory好多属性并没有值,只有一些默认的值)。

    • beanFactory.setBeanClassLoader(getClassLoader()):设置BeanFactory的类加载器

    • 添加BeanExpressionResolver【StandardBeanExpressionResolver】:支持相关的表达式语言的解析

    • 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】

    • ignoreDependencyInterface:设置忽略的自动装配接口:EnvironmentAware等

    • registerResolvableDependency:注册可以解析的自动装配:我们能直接在任何组件中自动注入BeanFactory ApplicationContext等

    • 添加BeanPostProcessor【ApplicationListenerDetector】:Register early post-processor for detecting inner beans as ApplicationListeners.添加监听检测的处理器

    • 添加编译时的AspectJ

    • 给BeanFactory中注册一些能用的组件:environment【ConfigurableEnvironment】等

  4. postProcessBeanFactory(beanFactory):BeanFactory准备工作完成后进行的后置处理工作。

    • 子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的处理
  5. invokeBeanFactoryPostProcessors:BeanFactory标准初始化之后执行的。
    主要有2个接口:BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor

    • BeanFactoryPostProcessors的方法:
      • 先执行BeanDefinitionRegistryPostProcessor 获取实现PriorityOrdered的优先处理
      • 获取bean
      • invokeBeanFactoryPostProcessors 执行内部的BeanFactory处理器
    • BeanFactoryPostProcessors同理
  6. 注册普通的registerBeanPostProcessors(基本同上)

  7. initMessageSource初始化MessageSource资源国际化处理,消息解析绑定。messageSource:判断容器中是否有id未messageSource,如果没有的话自己创建一个new DelegatingMessageSource并注册到singletonObject Map

  8. initApplicationEventMulticaster() 初始化事件派发器/广播器SimpleApplicationEventMulticaster

  9. onRefresh();子类可以重新这个方法,在容器刷新的时候自定义逻辑

  10. registerListeners()

    • 注册事件监听getApplicationEventMulticaster().addApplicationListener(listener)
    • 派发早期事件getApplicationEventMulticaster().multicastEvent(earlyEvent);
  11. finishBeanFactoryInitialization()//初始化容器中所有的单实例bean(非懒加载)

    • beanFactory.preInstantiateSingletons(); // Instantiate all remaining (non-lazy-init) singletons.
      • getMergedLocalBeanDefinition(beanName); 获取bean的定义信息,依次进行创建和初始化
      • doGetBean
      • getSingleton(beanName); 先获取我们map缓存中保存的实例bean,如果这个bean第二次来拿,就直接从缓存map中拿到
      • markBeanAsCreated(beanName); 标记当前bean已经或正在被创建,!this.alreadyCreated.contains(beanName),进行标记
      • 获取当前bean依赖的其他的bean,如果存在的话使用getBean从容器中拿出来。
      • resolveBeforeInstantiation(beanName, mbdToUse); // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.尝试返回一个代理bean
      • Object beanInstance = doCreateBean(beanName, mbdToUse, args); 开始创建bean实例
      • populateBean(beanName, mbd, instanceWrapper) 属性赋值
      • initializeBean(beanName, exposedObject, mbd) bean前后处理器执行地方,AOP动态代理增强的入口
  12. finishRefresh(); Last step: publish corresponding event.

protected void finishRefresh() {
		// Clear context-level resource caches (such as ASM metadata from scanning).
		clearResourceCaches();

		// Initialize lifecycle processor for this context.
		initLifecycleProcessor(); //bean生命周期

		// Propagate refresh to lifecycle processor first.
		getLifecycleProcessor().onRefresh();

		// Publish the final event.
		publishEvent(new ContextRefreshedEvent(this));

		// Participate in LiveBeansView MBean, if active.
		LiveBeansView.registerApplicationContext(this);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值