今天这节内容我们一起来研究下,spring的bean的创建,我们一步步看着源码往下分析.下面的方法就会带我们进入bean的创建
完成bean工厂初始化
finishBeanFactoryInitialization(beanFactory);
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
// 初始化类型转换器,这一部分的内容,就是说,当前端传过来的数据类型后台不好解析,可以通过这个实现这个接口来实现类类型转换
//最典型的应用就是data转换
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));
}
//如果之前没有任何bean后处理器(例如PropertyPlaceholderConfigurer Bean)之前进行过注册,请注册默认的嵌入式值解析器,
//主要用于注释属性值的解析
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
// 初始化 LoadTimeWeaverAwareBean 用于织入第三方模块,在 class 文件载入 JVM 的时候动态织入
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
for (String weaverAwareName : weaverAwareNames) {
getBean(weaverAwareName);
}
//将临时类加载器设置为null
beanFactory.setTempClassLoader(null);
// 在初始化单例bean的过程中,先暂停bean的注册,解析加载等等
beanFactory.freezeConfiguration();
//初始化非懒加载的bean
beanFactory.preInstantiateSingletons();
}
其他方法都比较简单,咱们就直接从最后一个方法分析吧,这里干货满满哈
#DefaultListableBeanFactory
@Override
public void preInstantiateSingletons() throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
//将所有的bean定义名称添加到beanNames集合中
List beanNames = new ArrayList<>(this.beanDefinitionNames);
// 遍历所有的费懒加载的bean
for (String beanName : beanNames) {
//对bean定义进行合并,比如bean中引入属性parent这一步就是来处理这个属性的
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
//如果bean不是抽象的,不是懒加载的,并且是单例的,执行以下步骤
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
//判断是否是工厂bean
if (isFactoryBean(beanName)) {
//如果是工厂bean,调用的时候再bean的名称前面添加前缀符号&
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
//再次判断bean是否是factoryBean
if (bean instanceof FactoryBean) {
final FactoryBean factory = (FactoryBean) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged((PrivilegedAction)
((SmartFactoryBean) factory)::isEagerInit,
getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}
}
}
else {
getBean(beanName);
}
}
}
//再次遍历beanNames,对实现了SmartInitializingSingleton接口的类实现处理,这里也就是说,他的功能类似于InitzationBean合格接口
//在单例bean加载完成后,做一些事情
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction