當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02
生活随笔
收集整理的這篇文章主要介紹了
Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- Pre
- 通俗流程
- finishBeanFactoryInitialization
Pre
Spring5源碼 - 06 Spring Bean 生命周期流程 概述 01
接上文
通俗流程
下面說個比較常見的主干流程
連Autowired注解都是沒有解析的;
上下文中,直到被銷毀;
聲明了銷毀方法也會被調(diào)用。
finishBeanFactoryInitialization
完成Bean的初始化
/*** Finish the initialization of this context's bean factory,* initializing all remaining singleton beans.*/protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// bean工廠創(chuàng)建類型轉(zhuǎn)化器 Convert/*** public class String2DateConversionService implements Converter<String,Date> {public Date convert(String source) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {return sdf.parse(source);} catch (ParseException e) {return null;}}}@Beanpublic ConversionServiceFactoryBean conversionService() {ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean();Set<Converter> converterSet = new HashSet<Converter>();converterSet.add(new String2DateConversionService());factoryBean.setConverters(converterSet);return factoryBean;}ConversionServiceFactoryBean conversionServiceFactoryBean = (ConversionServiceFactoryBean) ctx.getBean(ConversionServiceFactoryBean.class);conversionServiceFactoryBean.getObject().convert("2019-06-03 12:00:00",Date.class)*/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));}/*** public class MainConfig implements EmbeddedValueResolverAware{** public void setEmbeddedValueResolver(StringValueResolver resolver) {this.jdbcUrl = resolver.resolveStringValue("${ds.jdbcUrl}");this.classDriver = resolver.resolveStringValue("${ds.classDriver}");}}*/if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));}// 處理aspectjString[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.beanFactory.setTempClassLoader(null);//凍結(jié)所有的 bean 定義 , 說明注冊的 bean 定義將不被修改或任何進一步的處理beanFactory.freezeConfiguration();//實例化剩余的單實例beanbeanFactory.preInstantiateSingletons();}繼續(xù)
beanFactory.preInstantiateSingletons(); @Overridepublic void preInstantiateSingletons() throws BeansException {if (logger.isDebugEnabled()) {logger.debug("Pre-instantiating singletons in " + this);}//獲取我們?nèi)萜髦兴衎ean定義的名稱List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);//循環(huán)我們所有的bean定義名稱for (String beanName : beanNames) {//合并我們的bean定義RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);/*** 根據(jù)bean定義判斷是不是抽象的&& 不是單例的 &&不是懶加載的*/if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {//是不是工廠beanif (isFactoryBean(beanName)) {//是的話 給beanName+前綴&符號Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {final FactoryBean<?> factory = (FactoryBean<?>) bean;boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}//調(diào)用真正的getBean的流程if (isEagerInit) {getBean(beanName);}}}else {//非工廠Bean 就是普通的beangetBean(beanName);}}}//或有的bean的名稱 ...........到這里所有的單實例的bean已經(jīng)記載到單實例bean到緩存中for (String beanName : beanNames) {//從單例緩存池中獲取所有的對象Object singletonInstance = getSingleton(beanName);//判斷當前的bean是否實現(xiàn)了SmartInitializingSingleton接口if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {//觸發(fā)實例化之后的方法afterSingletonsInstantiatedsmartSingleton.afterSingletonsInstantiated();}}}}重點方法肯定是 getBean(beanName);咯
總結(jié)
以上是生活随笔為你收集整理的Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring5源码 - 06 Sprin
- 下一篇: Spring5源码 - 08 BeanF