protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating instance of bean '" + beanName + "'");
}
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// 检测lookup-method标签配置的方法是否存在
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
// 为某个特定的bean定义执行InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法
// 如果方法返回不为空,那么将不会继续执行剩下的Spring初始化流程
// 如果方法返回不为空,执行BeanPostProcessor的postProcessAfterInitialization方法
// bean创建结束
// 如: ScriptFactoryPostProcessor
// <bean id="groovyMessenger" class="org.springframework.scripting.groovy.GroovyScriptFactory">
// <constructor-arg value="classpath:mypackage/Messenger.groovy"/>
// <property name="message" value="Hello World!"/>
// </bean>
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}