Spring(十三):创建Bean——使用构造方法创建Bean

“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 {

//如果有覆盖方法ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值