系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
第一章学习spring的启动流程
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
spring启动流程
前言
提示:这里可以添加本文要记录的大概内容:
spring启动流程是需要掌握的
提示:以下是本篇文章正文内容,下面案例可供参考
一、核心代码分析
对以下三行代码进行初步的分析
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class);
context.refresh();
二、使用步骤
1.启动类分析
代码如下(示例):
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
- spring的执行流程,首先执行父类的构造方法,this.beanFactory = new DefaultListableBeanFactory();
- 然后对AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner进行初始化 AnnotatedBeanDefinitionReader()对象初始化,默认注册几个BeanDefinition。
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
RootBeanDefinition def = new RootBeanDefinition(PersistenceAnnotationBeanPostProcessor.class);
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
- ClassPathBeanDefinitionScanner()对象初始化
在List includeFilters 中添加new AnnotationTypeFilter(Component.class),后续会对他进行过滤
2.register分析
代码如下(示例):
context.register(AppConfig.class);
核心代码
private <T> void doRegisterBean(Class<T> beanClass, @Nullable String name,
@Nullable Class<? extends Annotation>[] qualifiers, @Nullable Supplier<T> supplier,
@Nullable BeanDefinitionCustomizer[] customizers) {
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
return;
}
abd.setInstanceSupplier(supplier);
// 解析@Scope注解的结果为ScopeMetadata
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
abd.setScope(scopeMetadata.getScopeName());
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
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 definitionHolder = new BeanDefinitionHolder(abd, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}
- 当前作用是
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。