spring是什麼?爲什麼需要spring?
spring是一個容器框架,bean的創建和管理都交給spring來管理。spring中幾個核心概念。
-
IOC(Inversion of Control):控制反轉
傳統的代碼中對象之間的耦合性太強,通過將對象交於spring容器管理,由容器來控制程序之前的依賴關係。其還有一個名字:DI(依賴
注入),即如果對象之間存在依賴關係,又spring容器將依賴的對象注入進去。 -
AOP(Aspect Oriented Programming):面向切面編程
提供一些通用的組件,通過切面的方式注入調用點處,不需要破壞原來的代碼結構。不僅降低了耦合性,同時能夠使一些組件達到複用性。
spring的初始化過程
- 定義一個啓動入口點
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操作後,就會完成上下文的初始化工作。之後就會基於這個上下文進行後續的操作。