“Bean instantiation via constructor failed”, ex);
}
}
逻辑如下
-
根据beanFactory去获取实例化策略
-
使用实例化策略去进行创建bean
实例化策略
实例化过程需要使用实例化策略,那么实例化策略是用来做什么的呢?
经过前面一系列的步骤,我们已经得到了足以实例化的所有信息,完全可以使用最简单的反射方法来直接反射来构造实例对象,但是Spring并不是直接这么做,因为这还涉及一个动态代理问题,而是让策略去做,也就是使用策略模式去进行实例化Bean
可以看到,这个InstantiationStrategy是一个接口,并且有两个实现类
-
SimpleInstantiationStrategy:简单的实例化策略
-
CglibSubclassingInstantiationStrategy:扩展了SimpleInstantiationStrategy,默认的策略就是这个
而调用的instantiate只有SimpleInstantiationStrategy实现了
源码如下
@Override
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,
final Constructor<?> ctor, Object… args) {
//判断RootBeanDefinition是否有覆盖方法
if (!bd.hasMethodOverrides()) {
if (System.getSecurityManager() != null) {
// use own privileged to change accessibility (when security is on)
AccessController.doPrivileged((PrivilegedAction) () -> {
ReflectionUtils.makeAccessible(ctor);
return null;
});
}
//没有动态代理,使用beanUtils去实例化
return BeanUtils.instantiateClass(ctor, args);
}
else {
//如果有覆盖方法ÿ