【Spring 源码】ApplicationContext 容器的加载原理(一)

【Spring 源码】ApplicationContext 容器的加载原理(一)



一、容器初始化位置

容器的初始化会包含许多操作,主要集中在 refresh() 方法中,其中等待容器初始化完毕以后,还会有其他功能的扩展,比如 AspectJ 或者 事件监听器等。

以及在容器初始化完成以后,会对非延迟初始化的 Bean 进行预实例化,等待用户通过 getBean() 方法获取并且注入数据。

1. ClassPathXmlApplicationContext 构造函数

// 新建 ApplicationContext 对象
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("MyBean.xml");

// ApplicationContext 初始化详情
public ClassPathXmlApplicationContext(  
	String[] configLocations, 
	boolean refresh, 
	@Nullable ApplicationContext parent
) throws BeansException {
     
    super(parent);  
    setConfigLocations(configLocations);  
    if (refresh) {
     
        refresh();  
    }  
}

2. 初始化流程

refresh() 中有许多方法,第一眼看上去不知道 Spring 具体在初始化什么,细细理清的话其实方法中一共有四大步:

  1. 对容器做初始化,并且从注册文件中读取 Bean 并提前实例化 Bean
  2. 注册并调用 BeanPostProcessors 和 BeanFactoryPostProcessors
  3. 初始化企业级功能
  4. 完成初始化
public void refresh() throws BeansException, IllegalStateException {
     
   synchronized (this.startupShutdownMonitor) {
     
      // 准备环境
      prepareRefresh();  
  
      // 初始化容器并且获取 xml 文件中定义的 Bean
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  
  
      // 容器功能扩展
      prepareBeanFactory(beanFactory);  
  
      try {
     
         // 注册 ServletContextAwareProcessor
         postProcessBeanFactory(beanFactory);  
  
         // 调用 BeanFactoryPostProcessors
         invokeBeanFactoryPostProcessors(beanFactory);  
  
         // 注册 BeanFactoryPostProcessors
         registerBeanPostProcessors(beanFactory);  
  
         // 初始化消息资源
         initMessageSource();  
  
         // 初始化事件传播
         initApplicationEventMulticaster();  
  
         // 用户可以重写此方法进行初始化过程中的方法调用
         onRefresh();  
  
         // 注册监听器
         registerListeners();  
  
         // 提前实例化非延迟初始化的 Bean
         finishBeanFactoryInitialization(beanFactory);  
  
         // 完成初始化容器
         finishRefresh();  
      }  
      catch (BeansException ex) {
     
          if (logger.isWarnEnabled()) {
     
              logger
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞎叨叨的一天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值