Spring Bean的生命周期,《Spring 实战》书中的官方说法
2019-11-06 16:56
学习spring源码主框架,从源码角度开发学习Spring bean的生命周期。
spring创建bean方法
org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String, java.lang.Class)
public T getBean(String name, Class requiredType) throws BeansException {
//doGetBean是获取bean的真实方法
return doGetBean(name, requiredType, null, false);
}
真正执行spring创建bean方法doGetBean
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
protected T doGetBean(
final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly)
throws BeansException {
//获取的beanname可能是重命名后的,这个获取原始的beanname,这里做别名解析
final String beanName = transformedBeanName(name);
Object bean;
//先从spring缓存池中获取bean,这里是解决循环依赖的根本
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
if (logger.isDebugEnabled()) {
if (isSingletonCurrentlyInCreation(beanName)) {
logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
"' that is not fully initialized yet - a consequence of a circular reference");
}
else {
logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
}
}
//如果从缓存中获取到bean,进行后续处理。
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
else {
//判断当前创建的bean是不是原型的,如果存在循环依赖,则抛异常
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
//获取父工厂
BeanFactory parentBeanFactory = getParentBeanFactory();
//判断父工厂是否为空,以及当前容器中是否包含bean定义
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
// Not found -> check parent.
String nameToLookup = originalBeanName(name);
//根据构造函数是否有参数,来创建不同的bean
if (args != null) {
// Delegation to parent with explicit args.
return (T) parentBeanFactory.getBean(nameToLookup, args);
}
else {
// No args -> delegate to standard getBean method.
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
}
if (!typeCheckOnly) {
markBeanAsCreated(beanName);
}
try {
//合并bean定义,存在抽象父bean定义,专门给子bean做继承的
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
//检查bean定义的是否为抽象的,如果是则抛出异常
checkMergedBeanDefinition(mbd, beanName, args);
//获取bean初始化的前置依赖beanname
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 + "'");
}
//解析以来的bean,并注册依赖的bean
registerDependentBean(dep, beanName);
try {
//递归调用获取依赖bean
getBean(dep);
}
catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
}
}
}
// 创建bean的实例
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, new ObjectFactory