Spring是什麼?
Spring發展至今,已經不是簡單的Spring Framework,它包括Spring Data、Spring Boot、Spring Cloud等等組成
不過這裏咱們僅討論Spring Framework,重點討論Spring的啓動過程及拓展應用java
web.xml配置web
Spring經過監聽器啓動是最多見的方式(後續文章會補上其它啓動方式,如用SpringBoot啓動等)refresh()
刪減了一些可有可無的代碼spring
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory)
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
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.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
}
}
複製代碼
容器refresh預準備工做 AbstractApplicationContextsession
initPropertySources() AbstractApplicationContext子類自定義屬性設置的方法app
getEnvironment().validateRequiredProperties() 校驗設置屬性ide
this.earlyApplicationEvents = new LinkedHashSet<>() 保存容器早期的事件post
獲取工廠測試
refreshBeanFactory執行完進入getBeanFactory()
直接返回改beanFactory 方法結束ui
在工廠設置類加載器、表達式解析器this
給工廠添加ApplicationContextAwareProcessor(processor先不解釋有什麼意思 後續會說明)
設置須要忽略的自動裝配的接口(EnvironmentAware、ApplicationContextAware等Aware)
給工廠添加 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this))
接着上面方法
最終調用 給容器註冊一些組件BeanFactory準備工做完成後 後置處理
空方法 子類自定義屬性設置的方法 這裏web環境 用的工廠是AbstractRefreshableWebApplicationContext
記住這裏只是web端拓展才有的實現
WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext)
spring自己只有singleton和prototype兩個,web環境加上了request、session、globalSession
這裏沒仔細看
執行BeanFactory後置處理器 執行這兩種處理器先獲取全部的BeanDefinitionRegistryPostProcessor
依次執行實現了PriorityOrdered、Ordered接口和沒有實現它們的 processor postProcessor.postProcessBeanDefinitionRegistry(registry)
在這裏我debug發現 spring內部有一個ConfigurationClassPostProcessor
它的做用是負責解析處理全部@Configuration標籤類,並將Bean定義(包括其它processor)註冊到BeanFactory中。
這裏註冊完以後 再次獲取全部BeanDefinitionRegistryPostProcessor,按順序執行 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry)
重點:其它的BeanDefinitionRegistryPostProcessor就是Spring提供給咱們註冊bean的通道
再執行postProcessor.postProcessBeanFactory(beanFactory)
獲取全部的BeanFactoryPostProcessor
分類執行 執行過的再也不執行
實踐出真知 這裏是用SpringBoot簡單搭起的一個demo,跟上面不同,不過不影響測試結果
執行結果: 結果在乎料之中 也就是說註冊Bean的後置處理器(跟上面的FactoryPostProcessor不同)
Bean的生命週期: Bean建立--初始化--銷燬
紅色部分:不一樣BeanPostProcessor功能都不同
BeanPostProcessor的實現子接口:
DestructionAwareBeanPostProcessor InstantiationAwareBeanPostProcessor MergedBeanDefinitionPostProcessor SmartInstantiationAwareBeanPostProcessor
BeanPostProcessor
初始化MessageSource組件(作國際化、消息綁定、消息解析)
有->this.applicationEventMulticaster beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class)
沒有->new DelegatingMessageSource() 註冊一個MessageSource組件
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource)
初始化事件派發器
和上面實現差很少有->this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class)
沒有->new SimpleApplicationEventMulticaster() beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster)
這個派發器在後續頗有用
子類自定義的方法 web環境下直接進入一個空方法
還不肯定什麼環境下會有執行 歡迎聯繫交流~
較爲複雜,單獨做爲一篇