目录
2:执行实现了InstantiationAwareBeanPostProcessor的后置处理器
4:将 MergedBeanDefinitionPostProcessors 应用于指定的 bean 定义(后置处理器调用)
1:注册销毁方法 registerDisposableBeanIfNecessary
一、创建bean之初
spring调用 beanFactory.preInstantiateSingletons()此方法完成整个bean生产以及依赖注入,那么在生成bean之前,spring做了哪些事呢?
1.判断bean定义是否是bean工厂
遍历所有beandefinition 非懒加载以及非抽象bean,单例,去执行AbstractBeanFactory.isFactoryBean(beanName) 方法判断是否是重写 SmartFactoryBean接口的isEagerInit方法为true,若设置为true,就会先去创建bean实例
public void preInstantiateSingletons() throws BeansException {
......
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged(
(PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}
......
}
2.获取规范的bean name
调用 transformedBeanName 返回实际的 bean 名称,去掉工厂取消引用前缀(如果有,也去掉重复的工厂前缀)。
public static String transformedBeanName(String name) {
Assert.notNull(name, "'name' must not be null");
if (!name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {
return name;
}
return transformedBeanNameCache.computeIfAbsent(name, beanName -> {
do {
beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
}
while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));
return beanName;
});
}
3.合并bean定义
调用 AbstractBeanFactory.getMergedBeanDefinition 方法 如果给定bean的定义是子bean定义,则通过与父bean合并,返回另外给定bean的RootBeanDefinition。使用递归处理继承父bean定义,子bean的属性覆盖父bean的属性,并将当前bean的属性保存到缓存mergedBeanDefinitions中
protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
// 一次性bean实例:一次性实例的bean名称。
RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
if (mbd != null && !mbd.stale) {
return mbd;
}
return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
}
4:检查合并的bean定义
检查是否是设置了抽象bean的属性 在xml的配置bean可以设置抽象bean
protected void checkMergedBeanDefinition(RootBeanDefinition mbd, String beanName, @Nullable Object[] args)
throws BeanDefinitionStoreException {
if (mbd.isAbstract()) {
throw new BeanIsAbstractException(beanName);
}
}
5:获取所有@DependsOn注解的依赖bean
调用方法 mbd.getDependsOn() 获取在创建bean定义时已设置的依赖bean,并提前生成bean实例。
缓存到dependentBeanMap中便于下次使用直接返回。
// 保证初始化当前bean所依赖的bean。(循环依赖问题)
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
if (isDependent(beanName, dep)) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
}
registerDependentBean(dep, beanName);
try {
//创建依赖bean
getBean(dep);
}
catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
}
}
}
6:确定bean是否是单例或者多例
单例则会调用 getSingleton 方法实现缓存(三级缓存)解决循环依赖问题,再调用钩子方法 调用createBean方法执行创建bean。
非单例bean,会直接调用createBean方法执行创建bean
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
} else if (mbd.isPrototype()) {
Object prototypeInstance = null;
try {
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
}
f