在Spring容器启动的时候,Spring会把你在application.xml中配置好的bean都初始化,需要调用的时 候,把初始化的Bean分配给你要调用的类,不用去手工创建一个对象的实例
一、 Bean的创建和获取
getBean-->处理BeanName-->从缓存中获取
有-->getObjectForBeanInstance-->是否工厂类getObjectFromFactoryBean-->返回Bean
没有-->进入创建bean逻辑-->加入缓存-->类型检测-->返回Bean
- AnnotationConfigApplicationContext 配置类初始化spring容器
-->register(componentClasses) 注册配置类
-->this.reader.register(componentClasses); 读取
-->registerBean(componentClass);注册bean
-->doRegisterBean(beanClass, null, null, null, null); 参数注入
-->AnnotatedBeanDefinitionReader.doRegisterBean
·1. 通过读取@Configuration获取 new AnnotatedGenericBeanDefinition(beanClass);
·2. 判断是否跳过解析
if(this.conditionEvaluator.shouldSkip(abd.getMetadata())) { return; }
abd.setInstanceSupplier(supplier);
·3. 得到作用域默认singleton
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd)
·4. 将类的作用域添加到数据结构中 ???
abd.setScope(scopeMetadata.getScopeName());
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry))
·5. 处理类当中的通用注解分析源码可以知道他主要处理 Lazy DependOn Primary Role等注解 处理完后 processCommonDefinitionAnnotations 依然是把他添加到数据结构当中去 ????
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
if (qualifiers != null) {
for (Class<? extends Annotation> qualifier : qualifiers) {
if (Primary.class == qualifier) {
abd.setPrimary(true);
} else if (Lazy.class == qualifier) { abd.setLazyInit(true);
} else {
abd.addQualifier(new AutowireCandidateQualifier(qualifier));
}
}
}
//自定义注解
if (customizers != null) {
for (BeanDefinitionCustomizer customizer : customizers) {
customizer.customize(abd);
}
}
/**
* 这个BeanDefinitionHolder也是一个数据结构
* 存放BeanDefinition
*/
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd,beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
/**
* 把上述这个数据结构注册给registry
* registry就是AnnotationConfigApplicationContext
*
* */
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}
-
getBean获取bean
1.getBeanFactory().getBean(name)
2.doGetBean(name, ...) 判断是否&符号开头,是就用原生的,不是就用自定义
判断是是不是singleton,多例,每次进来创建一个bean
3.获取到bean的名字,从缓存获取,没有则创建
BeanFactory parenBeanFactory = getParentBeanFactory();创建BeanFactory
4.先判断有没有父容器,必免重复创建
5.根据名字获取Bean的定义
RootBeanDedidnition mbd = getMergedLocalBeanDefifnition(beanName)
6.checkMergeBeanDefinition(mbd, beanName,args) 初始化bean 的参数
7.判断是否singleton
createBean(beanName, mbd, args) -
CreateBean创建bean
1.doCreateBean()
2.BeanWrapper相当于代理器进行属性填充,属性注入依赖注入都通过它来完成
3.GreateBeanInstance(beanName, mbd, args)获取bean的实例,通过反射获取
4.初始化
GenericBeanDefinition extends AbstractBeanDefinition
是标准bean定义的一站式服务。像任何bean定义一样,它允许指定一个可选的类构造函数参数值和属性值。此外,由可以通过“parentName”属性灵活配置父bean定义。
网友评论