【知识库】--spring 创建bean的实例-createBeanInstance方法解析(240)
2017-06-24 20:06
661 查看
创建bean的实例
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args){
//解析class
Class beanClass = resolveBeanClass(mbd, beanName);
if(beanClass!=null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()){
throw new BeanCreationException(//" Bean class is not public ,and no-public access not allowed");
}
//如果工厂方法不为空则使用工厂方法初始化策略
if(mbd.getFactoryMethodName()!=null){//配置了factory-method
return instantiateUsingFactoryMethod(beanName,mbd,args);
}
// 短路操作 re-creating the same bean...
boolean resolved = false;
boolean autowireNecessary = false;
if(args == null){
synchronized(mbd.constructorArgumentLock){
//一个类有多个构造函数,每个构造函数有不同的参数,所以调用前先根据参数锁定构造函数或对应的工厂方法
if(mbd.resolvedConstructorOrFactoryMethod != null){//缓存
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
//如果已经解析过则使用解析好的构造函数方法不需要锁定
if(resolved){
if(autowireNecessary){//构造函数自动注入
return autowireConstructor(beanName,mbd,null,null);
}
else{//使用默认构造函数
return instantiateBean(beanName,mbd);
}
}
//需要根据参数解析构造函数
Constructor[] ctors = determineConstuctorsFromBeanPostProcessors(beanClass,beanName);
if(actors != null || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args) ){
return autowireConstructor(beanName,mbd,ctors,args);//构造函数自动注入
}
//使用默认构造函数构造
return instantiateBean(beanName,mbd);
}
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args){
//解析class
Class beanClass = resolveBeanClass(mbd, beanName);
if(beanClass!=null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()){
throw new BeanCreationException(//" Bean class is not public ,and no-public access not allowed");
}
//如果工厂方法不为空则使用工厂方法初始化策略
if(mbd.getFactoryMethodName()!=null){//配置了factory-method
return instantiateUsingFactoryMethod(beanName,mbd,args);
}
// 短路操作 re-creating the same bean...
boolean resolved = false;
boolean autowireNecessary = false;
if(args == null){
synchronized(mbd.constructorArgumentLock){
//一个类有多个构造函数,每个构造函数有不同的参数,所以调用前先根据参数锁定构造函数或对应的工厂方法
if(mbd.resolvedConstructorOrFactoryMethod != null){//缓存
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
//如果已经解析过则使用解析好的构造函数方法不需要锁定
if(resolved){
if(autowireNecessary){//构造函数自动注入
return autowireConstructor(beanName,mbd,null,null);
}
else{//使用默认构造函数
return instantiateBean(beanName,mbd);
}
}
//需要根据参数解析构造函数
Constructor[] ctors = determineConstuctorsFromBeanPostProcessors(beanClass,beanName);
if(actors != null || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args) ){
return autowireConstructor(beanName,mbd,ctors,args);//构造函数自动注入
}
//使用默认构造函数构造
return instantiateBean(beanName,mbd);
}
相关文章推荐
- Spring工厂方法创建(实例化)bean实例代码
- Spring学习--静态工厂方法、实例工厂方法创建 Bean
- Spring源码解析:Bean实例的创建与初始化
- spring MethodInvokingFactoryBean 的使用和了解,Spring 通过通过方法创建Bean的实例
- spring创建bean的三种方式-通过构造器,通过静态工厂方法,通过实例工厂方法
- 【知识库】--spring AbstractAutowireCapableBeanFactory 创建bean(240)
- Spring创建Bean实例的三种方法
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
- spring中FactoryBean中的getObject()方法实例解析
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- Spring使用实例工厂方法创建Bean(一)
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
- 【知识库】--spring 记录创建bean(单例)的ObjectFactory(240)
- Spring入门学习——调用一个实例工厂方法创建Bean
- 【spring NOTE】调用实例工厂方法创建Bean
- Spring4.3.x 容器中bean的创建过程(4)—— 执行bean的初始化方法
- Activator.CreateInstance 方法创建对象和Expression Tree创建对象性能的比较(构造函数含多参数的情况)
- spring笔记10---实例工厂方法配置bean
- 7.7.3: Bean实例的创建方式及依赖配置---调用实例工厂方法创建Bean
- Spring中创建bean的三种方法