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版权协议,转载请附上原文出处链接和本声明。