目錄:
1、搞清楚ApplicationContext實例化Bean的過程
2、搞清楚這個過程當中涉及的核心類
3、搞清楚IOC容器提供的擴展點有哪些,學會擴展
4、學會IOC容器這裏使用的設計模式
5、搞清楚不一樣建立方式的bean的建立過程git
AnnotationConfigApplicationContext context4 = new AnnotationConfigApplicationContext("com.study.leesmall.spring.service");
/** * Create a new AnnotationConfigApplicationContext, scanning for bean definitions * in the given packages and automatically refreshing the context. * @param basePackages the packages to check for annotated classes */ public AnnotationConfigApplicationContext(String... basePackages) { this(); scan(basePackages); refresh(); }
org.springframework.context.support.AbstractApplicationContext.refresh()方法就是入口了github
@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(); } 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(); } } }
1)準備context爲了刷新spring
// Prepare this context for refreshing. prepareRefresh();
2)從子類獲取BeanFactory實例設計模式
// Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
3)準備BeanFactory爲了使用contextapp
// Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory);
/** * Configure the factory's standard context characteristics, * such as the context's ClassLoader and post-processors. * @param beanFactory the BeanFactory to configure */ protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // Tell the internal bean factory to use the context's class loader etc. beanFactory.setBeanClassLoader(getClassLoader()); beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); // Configure the bean factory with context callbacks. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); beanFactory.ignoreDependencyInterface(EnvironmentAware.class); beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class); beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class); beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class); beanFactory.ignoreDependencyInterface(MessageSourceAware.class); beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); // BeanFactory interface not registered as resolvable type in a plain factory. // MessageSource registered (and found for autowiring) as a bean. beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); // Register early post-processor for detecting inner beans as ApplicationListeners. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)); // Detect a LoadTimeWeaver and prepare for weaving, if found. if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); // Set a temporary ClassLoader for type matching. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } // Register default environment beans. if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); } }
重要1:ide
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)) 這段代碼很重要:函數
若是你的bean實例裏面須要ApplicationContext,你就須要實現ApplicationContextAwareProcessor這個接口,接口就會把ApplicationContext給到你的bean實例
也能夠經過autowired註解去獲取,由於下面的這段代碼:post
beanFactory.registerResolvableDependency(ApplicationContext.class, this);this
重要2:url
註解方式加載配置
package com.study.leesmall.spring.ext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.ReloadableResourceBundleMessageSource; @Configuration @PropertySource("classpath:/application.properties") public class MyConfiguration { @Bean("messageSource") public ReloadableResourceBundleMessageSource getReloadableResourceBundleMessageSource() { ReloadableResourceBundleMessageSource rms = new ReloadableResourceBundleMessageSource(); rms.setBasename("message"); return rms; } }
重要3:
參數配置的優先級:命令參數 > 環境變量 > properties 文件
// Register default environment beans. if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); }
命令參數配置方式:進入要運行的類——run as——run configurations——彈出以下界面——選擇——Arguments——添加參數
環境變量參數配置方式:進入要運行的類——run as——run configurations——彈出以下界面——選擇——Environment——添加參數
properties 文件參數配置方式:直接在Resource目錄下加入properties文件裏面加入參數——在application.xml配置加載properties文件便可
參數:
# jdbc properties jdbc.driverClassName=xxxx jdbc.url=xxxx jdbc.username=xxxx jdbc.password=xxxx
在application.xml配置加載properties文件
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations" value="classpath:application.properties"/> </bean>
4)對BeanFactory進行預處理
// Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory);
說明:這裏用了模板方法設計模式,須要子類去實現的
5)調用執行BeanFactoryPostProcessor (這是一個很重要的擴展點,若是你想在Bean實例化前對BeanFactory進行處理的話,你就能夠實現BeanFactoryPostProcessor接口及其子類如BeanDefinitionRegistryPostProcessor,示例以下面的排序優先級代碼)
// Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory);
/** * Instantiate and invoke all registered BeanFactoryPostProcessor beans, * respecting explicit order if given. * <p>Must be called before singleton instantiation. */ protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor) if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } }
委託給PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())執行
這裏要注意一下Spring裏面有不少相似這樣的委託處理
代碼詳細解讀:
說明:
BeanFactoryPostProcessor在實例化bean以前對BeanFactory進行處理的
BeanPostProcessor在bean實例化後,對bean進行處理的
這兩個類用了觀察者模式
AbstractApplicationContextrefresh模板方法模式
執行優先級:priorityOrded>orded
執行順序示例:
優先排序的:
package com.study.leesmall.spring.ext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.core.PriorityOrdered; import org.springframework.stereotype.Component; @Component public class MyBeanDefinitonRegistryPostProcessor3 implements BeanDefinitionRegistryPostProcessor, PriorityOrdered { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("--- MyBeanDefinitonRegistryPostProcessor3.postProcessBeanFactory 被執行了。"); } @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { System.out.println("--- MyBeanDefinitonRegistryPostProcessor3.postProcessBeanDefinitionRegistry 被執行了。"); } @Override public int getOrder() { return 1; } }
普通排序的:
package com.study.leesmall.spring.ext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; @Component public class MyBeanDefinitonRegistryPostProcessor2 implements BeanDefinitionRegistryPostProcessor, Ordered { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("--- MyBeanDefinitonRegistryPostProcessor2.postProcessBeanFactory 被執行了。"); } @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { System.out.println("--- MyBeanDefinitonRegistryPostProcessor2.postProcessBeanDefinitionRegistry 被執行了。"); } @Override public int getOrder() { return 0; } }
沒有排序的:
package com.study.leesmall.spring.ext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.stereotype.Component; @Component public class MyBeanDefinitonRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("--- MyBeanDefinitonRegistryPostProcessor.postProcessBeanFactory 被執行了。"); } @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { System.out.println("--- MyBeanDefinitonRegistryPostProcessor.postProcessBeanDefinitionRegistry 被執行了。"); } }
運行結果:
--- MyBeanDefinitonRegistryPostProcessor3.postProcessBeanDefinitionRegistry 被執行了。 --- MyBeanDefinitonRegistryPostProcessor2.postProcessBeanDefinitionRegistry 被執行了。 --- MyBeanDefinitonRegistryPostProcessor.postProcessBeanDefinitionRegistry 被執行了。 --- MyBeanDefinitonRegistryPostProcessor3.postProcessBeanFactory 被執行了。 --- MyBeanDefinitonRegistryPostProcessor2.postProcessBeanFactory 被執行了。 --- MyBeanDefinitonRegistryPostProcessor.postProcessBeanFactory 被執行了。
6)向BeanFactory註冊BeanPostProcessor(這是一個很重要的擴展點,若是你想在Bean實例化後對Bean進行處理的話)
registerBeanPostProcessors(beanFactory)
得到用戶註冊的BeanPostProcessor的bean定義,建立他們的實例,註冊到BeanFactory,對bean實例化後進行處理
7)initMessageSource();初始化國際化資源文件
示例:
package com.study.leesmall.spring.ext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.ReloadableResourceBundleMessageSource; //國際化 給入messageSource的bean實例到bean工廠 @Configuration @PropertySource("classpath:/application.properties") public class MyConfiguration { @Bean("messageSource") public ReloadableResourceBundleMessageSource getReloadableResourceBundleMessageSource() { ReloadableResourceBundleMessageSource rms = new ReloadableResourceBundleMessageSource(); rms.setBasename("message"); return rms; } }
8)initApplicationEventMulticaster 瞭解便可
初始化Application Event廣播器,把全部事件廣播出去
9)執行onRefresh(); 由子類來提供實現
10)registerListeners() (這是一個很重要的擴展點,若是你想對容器工做過程當中發生的節點事件進行一些處理,好比容器要刷新、容器要關閉了,那麼你就能夠實現ApplicationListener)
註冊ApplicationListener:得到用戶註冊的ApplicationListener的bean定義,建立他們的實例註冊到第8步初始化的廣播器上
示例代碼:
package com.study.leesmall.spring.ext; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; //若是你想對容器工做過程當中發生的節點事件進行一些處理,好比容器要刷新、容器要關閉了,那麼你就能夠實現ApplicationListener @Component public class MyApplicationListener implements ApplicationListener<ApplicationEvent> { @Override public void onApplicationEvent(ApplicationEvent event) { System.out.println("-----收到應用事件:" + event); } }
11)finishBeanFactoryInitialization(beanFactory); 完成剩餘的單例bean的實例化,爲了提早實例化,後面不用getBean去建立實例
a)何時實例化bean?
單例bean能夠在啓動時實例化好,這樣能提升使用時的效率
原型bean在getBean(beanName)的時候實例化
b)單例bean和原型bean實例化的過程有區別嗎?
沒有區別的
c)Spring中支持的bean實例建立的方式有幾種?分別如何配置的,如何來獲取Bean實例的?
建立bean實例的方式:構造函數方式、工廠方式(靜態工廠方式、非靜態工廠方式)、實現FactoryBean的方式
工廠方式建立bean實例示例代碼:
package com.study.leesmall.spring.sample.factory; import com.study.leesmall.spring.service.CombatService; import com.study.leesmall.spring.service.LoveService; import com.study.leesmall.spring.service.LoveServiceImpl; //工廠方式建立bean實例 public class LoveServiceFactory { //靜態工廠方式建立bean實例 public static LoveService getLoveServiceFromStaticFactoryMethod() { return new LoveServiceImpl(); } //非靜態工廠方式建立bean實例 public CombatService getCombatServiceFromMemberFactoryMethod(int time) { return new CombatService(time); } }
實現FactoryBean的方式建立bean實例示例代碼:
package com.study.leesmall.spring.sample.factory; import org.springframework.beans.factory.FactoryBean; import com.study.leesmall.spring.service.LoveService; import com.study.leesmall.spring.service.LoveServiceImpl; //實現FactoryBean的方式建立bean實例 public class LoveServiceFactoryBean implements FactoryBean<LoveService> { @Override public LoveService getObject() throws Exception { return new LoveServiceImpl(); } @Override public Class<?> getObjectType() { return LoveService.class; } }
那麼上面的建立bean實例的方式怎麼在xm裏面配置呢:
<!--靜態工廠方式的配置 --> <bean id="loveService" class="com.study.leesmall.spring.sample.factory.LoveServiceFactory" factory-method="getLoveServiceFromStaticFactoryMethod"> <property name="combatService" ref="combatService"></property> </bean> <!--非靜態工廠方式的配置 --> <bean id="loveServiceFactory" class="com.study.leesmall.spring.sample.factory.LoveServiceFactory"> </bean> <bean id="combatService" factory-bean="loveServiceFactory" factory-method="getCombatServiceFromMemberFactoryMethod"> <constructor-arg type="int" value="60" /> </bean> <!--實現FactoryBean的方式的配置 --> <bean name="loveService2" class="com.study.leesmall.spring.sample.factory.LoveServiceFactoryBean"></bean>
那麼註解方式又怎麼配置呢:
工廠方式建立bean實例註解配置:
import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import com.study.leesmall.spring.service.CombatService; import com.study.leesmall.spring.service.LoveService; import com.study.leesmall.spring.service.LoveServiceImpl; //工廠方式建立bean實例 @Component public class LoveServiceFactory { //靜態工廠方式建立bean實例 @Bean public static LoveService getLoveServiceFromStaticFactoryMethod() { return new LoveServiceImpl(); } //非靜態工廠方式建立bean實例 @Bean public CombatService getCombatServiceFromMemberFactoryMethod(int time) { return new CombatService(time); } }
實現FactoryBean的方式建立bean實例註解配置:
import org.springframework.beans.factory.FactoryBean; import org.springframework.stereotype.Component; import com.study.leesmall.spring.service.LoveService; import com.study.leesmall.spring.service.LoveServiceImpl; //實現FactoryBean的方式建立bean實例 @Component public class LoveServiceFactoryBean implements FactoryBean<LoveService> { @Override public LoveService getObject() throws Exception { return new LoveServiceImpl(); } @Override public Class<?> getObjectType() { return LoveService.class; } }
代碼跟蹤:
入口:org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(ConfigurableListableBeanFactory)
數據類型的轉換:
// Initialize conversion service for this context. if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) && beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) { beanFactory.setConversionService( beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)); }
數據類型的轉換對應在xml配置裏面的寫法:
<bean id="combatService" class="com.study.leesmall.spring.service.CombatService"> <constructor-arg type="int" value="60" /> </bean>
初始化內嵌值的解析器,如properties文件裏面配置的值就須要這種解析器:
// Register a default embedded value resolver if no bean post-processor // (such as a PropertyPlaceholderConfigurer bean) registered any before: // at this point, primarily for resolution in annotation attribute values. if (!beanFactory.hasEmbeddedValueResolver()) { beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal)); }
AOP:bean實例初始化後,在進行代理加強,不建立原始bean實例,直接建立代理子類的實例
// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early. String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); for (String weaverAwareName : weaverAwareNames) { getBean(weaverAwareName); }
提早實例化剩餘的全部單例bean:
// Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons();
說明:看子類的實現,過程是找到單例bean的名稱,而後getBean(beanName)拿到單例bean的實例
d)beanfactory中getBean()時的建立實例流程
代碼跟蹤:
入口:
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(String) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(String, Class<T>, Object[], boolean)
下面來看一下真正建立bean實例的方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[]):
看一下org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[])裏面的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(String, RootBeanDefinition)
方法:
而後看一下上面調用的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(Class<?>, String)方法:
注意:
這裏又是一個擴展點, InstantiationAwareBeanPostProcessor 能夠在 Bean 實例建立前、後進行加強處理
若是你想在bean實例建立先後進行處理能夠繼承InstantiationAwareBeanPostProcessor的子類InstantiationAwareBeanPostProcessorAdaper,而後覆寫裏面你須要實現的方法,建立前處理就實現建立前處理的方法
對比:
BeanPostProcessor能夠在bean實例初始化前和初始化後進行處理
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[])
->
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(String, RootBeanDefinition, Object[])
看一下org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(String, RootBeanDefinition, BeanWrapper)方法:
繼續看一下建立bean實例的代碼塊:
if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); }
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(String, RootBeanDefinition, Object[])
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(String, RootBeanDefinition, Constructor<?>[], Object[])
->
org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(String, RootBeanDefinition, Constructor<?>[], Object[])
說明:
explicitArgs:當你調用getBean的時候給定的造參數 spring在getbean的時候是能夠本身傳入構造參數的,能夠不用bean定義裏面指定或者xml裏面配置的構造參數,示例以下:
getbean(「loveService」, .....)
拓展:
工廠Bean和Bean工廠的區別:
工廠Bean實現了FactoryBean接口的Bean
Bean工廠BeanFactory IOC容器
12)finishRefresh() 發佈事件
1. 擴展點:如第一個大標題
中
的5)、6)、10)步均爲擴展點
5)調用執行BeanFactoryPostProcessor (這是一個很重要的擴展點,若是你想在Bean實例化前對BeanFactory進行處理的話,你就能夠實現BeanFactoryPostProcessor接口及其子類如BeanDefinitionRegistryPostProcessor,示例以下面的排序優先級代碼)
6)向BeanFactory註冊BeanPostProcessor(這是一個很重要的擴展點,若是你想在Bean實例化後對Bean進行處理的話)
10)registerListeners() (這是一個很重要的擴展點,若是你想對容器工做過程當中發生的節點事件進行一些處理,好比容器要刷新、容器要關閉了,那麼你就能夠實現ApplicationListener)
註冊ApplicationListener:得到用戶註冊的ApplicationListener的bean定義,建立他們的實例註冊到第8步初始化的廣播器上
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
BeanPostProcessorr
ApplicationListener
11)finishBeanFactoryInitialization(beanFactory); 完成剩餘的單例bean的實例化,爲了提早實例化,後面不用getBean去建立實例的
而後看一下上面調用的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(Class<?>, String)方法的講解
注意:
這裏又是一個擴展點, InstantiationAwareBeanPostProcessor 能夠在 Bean 實例建立前、後進行加強處理
若是你想在bean實例建立先後進行處理能夠繼承InstantiationAwareBeanPostProcessor的子類InstantiationAwareBeanPostProcessorAdaper,而後覆寫裏面你須要實現的方法,建立前處理就實現建立前處理的方法
對比:
BeanPostProcessor能夠在bean實例初始化前和初始化後進行處理
2. Spring容器啓動時完成了哪幾件核心事情:
1)Bean定義的得到(解析xml或者掃描註解)
2)環境的初始化 env
3)BeanDefinitionRegistryPostProcessor的自動發現與執行
4)BeanFactoryPostProcessor的自動發現與執行
5)BeanPostProcessorr的自動發現與註冊
6)國際化資源初始化
7)事件廣播器的初始化
8)ApplicationListener的自動發現與註冊
9)實例化單例bean
模板方法設計模式、觀察者模式(主要是這兩個)、策略模式、工廠模式
搞清楚不一樣建立方式的bean的建立過程
完整代碼獲取地址:https://github.com/leeSmall/FrameSourceCodeStudy/tree/master/spring-source-study