spring构造器创建对象源码
时间: 2025-01-06 14:30:32 浏览: 5
### Spring 框架中通过构造器创建对象的源码解析
在 Spring 框架中,`DefaultListableBeanFactory` 类负责管理 Bean 的生命周期以及依赖注入。当应用程序请求某个特定类型的 Bean 实例时,Spring 容器会调用 `createBean` 方法来实例化该 Bean。
#### 创建 Bean 过程概述
`doCreateBean` 是整个过程的核心方法之一,在此期间容器不仅完成了 Bean 对象的实际构建工作,还会处理属性填充、初始化回调函数等一系列操作[^1]:
```java
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, @Nullable final Object[] args) throws BeanCreationException {
// ...
}
```
对于基于构造器的方式创建 Bean 来说,具体逻辑位于 `instantiateBean` 函数内:
```java
protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
try {
InstantiationStrategy strategy = getInstantiationStrategy();
if (System.getSecurityManager() != null && this.beanClassLoader.isInstance(ClassLoader.class)) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> null);
}
return strategy.instantiate(mbd, beanName, getBeanFactory());
} catch (Throwable var7) {
throw new BeansException("Failed to instantiate [" + mbd.getBeanClassName() + "]", var7);
}
}
```
这里使用了策略模式中的 `InstantiationStrategy` 接口来进行实际的对象实例化动作。默认情况下,Spring 使用的是 CGLIB 动态代理技术或者是标准 Java 反射机制完成这项任务。如果配置文件指定了具体的工厂方法,则会优先考虑这种方式去获取目标类的新实例。
#### 构造参数解析与设置
为了支持带参构造器注入,Spring 提供了一套完整的解析流程用于匹配并传递相应的构造参数给新生成的目标对象。这部分功能主要由 `ConstructorResolver` 组件承担,并最终体现在 `autowireConstructor` 方法里:
```java
protected void autowireConstructor(
final String beanName,
final RootBeanDefinition mbd,
Constructor<?>[] chosenCtors,
Object[] explicitArgs) {
// 解析构造器及其所需参数列表...
// 调用指定构造器创建新的 Bean 实例
beanInstance = instantiate(beanName, mbdToUse, ctorToUse, explicitArgs);
// 设置已解析好的属性值到新建对象上...
}
private Object instantiate(
String beanName,
RootBeanDefinition mbd,
Constructor<?> constructorToUse,
Object[] explicitArgs) {
// ...省略部分代码...
// 如果存在显式的构造参数则直接传入;否则尝试自动装配
if(explicitArgs!=null){
instance=ctor.newInstance(explicitArgs);
}else{
AutowiredAnnotationBeanPostProcessor.postProcessProperties(pdp.getPropertyDescriptors(),instance,beanName);
}
// 返回已经完全初始化完毕后的 Bean 实例
return exposedObject;
}
```
上述片段展示了如何利用反射 API (`Constructor<T>.newInstance`) 结合 DI 原理实现带有多个参数输入场景下的对象创建工作流。值得注意的是,除了基本的数据类型外,复杂类型的成员变量同样可以通过相似的方法获得其对应的运行期表示形式进而参与构造表达式求解过程[^2]。
阅读全文