本文是Spring系列文章的一部分。其他相关文章见
本文逐句分析finishBeanFactoryInitialization方法。
文章目录
前言
为啥要先分析这个方法,是因为这几天还在看HuTool的源码,路小磊在B站有个课程讲HuTool的,其中有一课可认真的在讲转换器这一章,但是我对这部分理解不深,这里先占个位,后边我再研究一下转换器,再补充一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、为我们的bean工厂创建类型转化器 Convert
转换器用于注入属性时,将值转为对应类型。
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));
}
二、解析配置文件中属性
${} 这种符号的值是配置在配置文件中的,第二部分就是解析并填入值
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
使用方法
public class MainConfig implements EmbeddedValueResolverAware{
public void setEmbeddedValueResolver(StringValueResolver resolver) {
this.jdbcUrl = resolver.resolveStringValue("${ds.jdbcUrl}");
this.classDriver = resolver.resolveStringValue("${ds.classDriver}");
}
}
三、处理关于aspectj
weaver很熟悉吧,就是aop的织入
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
for (String weaverAwareName : weaverAwareNames) {
getBean(weaverAwareName);
}
四、停止使用临时类加载器
beanFactory.setTempClassLoader(null);
五、冻结所有的 bean 定义
冻结所有的 bean 定义 , 说明注册的 bean 定义将不被修改或任何进一步的处理
beanFactory.freezeConfiguration();
三、实例化剩余的单实例bean
beanFactory.preInstantiateSingletons();
总结
这部分不需要跟的太深,了解就好,需要串成主线的会有对应博文的。