每天一点点,Spring根据找到的构造方法创建bean

Spring得到构造函数之后执行实例化

1、如果是默认空参构造
1.1、当所有的候选构造函数都为null的时候,会使用空参构造

// 如果此处得到的候选构造函数为null
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
//if null == ctors 会执行 AbstractAutowireCapableBeanFactory#instantiateBean
return instantiateBean(beanName, mbd);

1.1.1、得到实例化策略

//得到实例化策略执行实例化,默认CglibSubclassingInstantiationStrategy();
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);

1.1.2、实例化SimpleInstantiationStrategy#instantiate(RootBeanDefinition, String, BeanFactory)
1.1.2.1、判断当前BeanDefinition 是否存在方法需要被覆盖

//方法包含@Lookup注解或xml中定义了replace-method
boolean flag = bd.hasMethodOverrides()

1.1.2.2、如果不存在 flag = false 直接得到默认构造函数执行创建

constructorToUse = clazz.getDeclaredConstructor();
return BeanUtils.instantiateClass(constructorToUse);

1.1.2.3、否则flag = true,创建CGLIB代理对象

// Must generate CGLIB subclass.
return instantiateWithMethodInjection(bd, beanName, owner);

2、如果候选的构造方法存在(逻辑跟上面基本一样)
执行 ConstructorResolver#instantiate(String, RootBeanDefinition, Constructor<?>, Object[])
2.1、得到默认的处理策略

// CglibSubclassingInstantiationStrategy
InstantiationStrategy strategy = this.beanFactory.getInstantiationStrategy();
// 创建
return strategy.instantiate(mbd, beanName, this.beanFactory, constructorToUse, argsToUse);

2.2、执行创建SimpleInstantiationStrategy#instantiate(RootBeanDefinition, String, BeanFactory, Constructor<?>, Object…)

if (!bd.hasMethodOverrides()) {
	//使用制定传入的构造方法和参数执行创建
	return BeanUtils.instantiateClass(ctor, args);
}else {
	//CglibSubclassingInstantiationStrategy#instantiateWithMethodInjection
	return instantiateWithMethodInjection(bd, beanName, owner, ctor, args);
}
	

版权声明:本文为whiteGu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。