getBean
AbstractBeanFactory#getBean的入参基本上两种
- Bean的Class对象
- Bean的name
可以看到,它们最终都调用一个方法
doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
doGetBean
参考链接:开启 Bean 的加载
resolveBeanClass 解析BeanClass
如果mbd中有就直接返回Class
protected Class<?> resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class<?>... typesToMatch) throws CannotLoadBeanClassException {
try {
if (mbd.hasBeanClass()) {
return mbd.getBeanClass();
} else {
return System.getSecurityManager() != null ? (Class)AccessController.doPrivileged(new PrivilegedExceptionAction<Class<?>>() {
public Class<?> run() throws Exception {
return AbstractBeanFactory.this.doResolveBeanClass(mbd, typesToMatch);
}
}, this.getAccessControlContext()) : this.doResolveBeanClass(mbd, typesToMatch);
}
} catch (PrivilegedActionException var6) {
ClassNotFoundException ex = (ClassNotFoundException)var6.getException();
throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
} catch (ClassNotFoundException var7) {
throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), var7);
} catch (LinkageError var8) {
throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), var8);
}
}
doResolveBeanClass
private Class<?> doResolveBeanClass(RootBeanDefinition mbd, Class<?>... typesToMatch) throws ClassNotFoundException {
ClassLoader beanClassLoader = this.getBeanClassLoader();
ClassLoader classLoaderToUse = beanClassLoader;
if (!ObjectUtils.isEmpty(typesToMatch)) {
ClassLoader tempClassLoader = this.getTempClassLoader();
if (tempClassLoader != null) {
classLoaderToUse = tempClassLoader;
if (tempClassLoader instanceof DecoratingClassLoader) {
DecoratingClassLoader dcl = (DecoratingClassLoader)tempClassLoader;
Class[] var7 = typesToMatch;
int var8 = typesToMatch.length;
for(int var9 = 0; var9 < var8; ++var9) {
Class<?> typeToMatch = var7[var9];
dcl.excludeClass(typeToMatch.getName());
}
}
}
}
String className = mbd.getBeanClassName();
if (className != null) {
Object evaluated = this.evaluateBeanDefinitionString(className, mbd);
if (!className.equals(evaluated)) {
if (evaluated instanceof Class) {
return (Class)evaluated;
}
if (evaluated instanceof String) {
return ClassUtils.forName((String)evaluated, classLoaderToUse);
}
throw new IllegalStateException("Invalid class name expression result: " + evaluated);
}
if (classLoaderToUse != beanClassLoader) {
return ClassUtils.forName(className, classLoaderToUse);
}
}
return mbd.resolveBeanClass(beanClassLoader);
}
getObjectForBeanInstance
getMergedLocalBeanDefinition
getMergedBeanDefinition(String,BeanDefinition)
getMergedBeanDefinition(String)
return (BeanDefinition)(!this.containsBeanDefinition(beanName) && this.getParentBeanFactory() instanceof ConfigurableBeanFactory ? ((ConfigurableBeanFactory)this.getParentBeanFactory()).getMergedBeanDefinition(beanName) : this.getMergedLocalBeanDefinition(beanName));
//如果BeanDefinitionMap中不包括该Bean并且当前BeanFactory具有ConfigurableBeanFactory 类型的父BeanFactory则从父BeanFactory进行处理。不满足,则执行当前BeanFactory的getMergedLocalBeanDefinition,一般不满足
}
markBeanAsCreated
- 将BeanDefinition设置为不新鲜的
- 将Bean的name放入已创建的缓存中