spring的初始化過程

spring是什麼?爲什麼需要spring?

spring是一個容器框架,bean的創建和管理都交給spring來管理。spring中幾個核心概念。

  • IOC(Inversion of Control):控制反轉
    傳統的代碼中對象之間的耦合性太強,通過將對象交於spring容器管理,由容器來控制程序之前的依賴關係。其還有一個名字:DI(依賴
    注入),即如果對象之間存在依賴關係,又spring容器將依賴的對象注入進去。

  • AOP(Aspect Oriented Programming):面向切面編程
    提供一些通用的組件,通過切面的方式注入調用點處,不需要破壞原來的代碼結構。不僅降低了耦合性,同時能夠使一些組件達到複用性。

spring的初始化過程

  1. 定義一個啓動入口點
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        People people = context.getBean(People.class);
        people.say();
    }
}

當new一個ClassPahtXmlApplicationContext時候,內部會調用AbstractApplicationContext類中的refresh方法,通過這個方法,
會完成上線文的初始化工作,通過配置文件,會完成bean定義結構的轉換。對於單例模式,且不是懶加載的類,會完成bean自身的實例化。

refresh方法的內部實現如下:

// 採用的是模板設計模式,其中的一些方法提供了實現,一些方法子類可以重寫
public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
      // 主要是進行一些初始化工作,設置當前上下文被激活,執行一些property源文件的初始化工作
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
      // 這個方法很重要,獲取工廠類,這個階段會加載所有類的bean定義,同時完成一些
      //額外的相關工作
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
      // 爲生成的bean工廠做一些基本的工作,比如設置bean表達式的解析器,設置一些bean的後處理器
      // 設置一些依賴忽略的接口,一些依賴需要解析的接口等等。
      // beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this))這個
      //方法就添加一個後過濾解析器,可以爲實現*Aware接口的類做一些額外的事情。
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
        // 目前是一個空時間,可以重寫在bean工廠類中注入新的後處理器
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
        // 主要是調用bean工廠類的後處理器,做一些事情
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
        // 在bean實例的創建過程中,注入一些後處理器,可以在bean創建過程中
        //做一些額外的事情。
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
        // 初始化MessageSource,可以用來支持消息的參數化和國際化等等。
				initMessageSource();

				// Initialize event multicaster for this context.
        // 初始化事件的多播(沒用過,也不清楚什麼意思)
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
        // 默認是空實現
				onRefresh();

				// Check for listener beans and register them.
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
        // 主要是完成一些非懶加載bean的實例化操作。
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}

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

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}

			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}

當完成了refresh操作後,就會完成上下文的初始化工作。之後就會基於這個上下文進行後續的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章