点进去
1.this()
2.注册配置类
3.refresh()
Spring会将所有交由Spring管理的类,扫描其class文件,将其解析成BeanDefinition,在BeanDefinition中会描述类的信息,例如:这个类是否是单例的,Bean的类型,是否是懒加载,依赖哪些类,自动装配的模型。Spring创建对象时,就是根据BeanDefinition中的信息来创建Bean。
文章目录
- 1.this()
- 1.1 reader
- 1.2 scanner
- 2.register()
- 3.refresh()
1.this()
1.1 reader
reader 用于读取 BeanDefinition
registerAnnotationConfigProcessors(): 注册一个注解配置处理器
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, @Nullable Object source) {
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
if (beanFactory != null) {
if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
}
if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
}
}
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition();
try {
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
AnnotationConfigUtils.class.getClassLoader()));
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
}
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
return beanDefs;
}
- 给工厂加入基础组件, 各种解析器
- 给工厂注册核心组件
internalConfigurationAnnotationProcessor: 底层的配置文件处理器
internalAutowiredAnnotationProcessor: 底层的自动装配处理器
internalCommonAnnotationProcessor: 支持@PostConstruct @PreDestry注解
PersistenceAnnotationBeanPostProcessor: jpa的后置处理器
internalPersistenceAnnotationProcessor
internalEventListenerProcessor: 事件功能处理器
internalEventListenerFactory: 事件工厂功能处理器
1.2 scanner
scanner 扫描器: 准备了环境变量等信息和resourceLoader
2.register()
注册主配置类, 调用reader.register
-
拿到主配置类的定义信息BeanDefinition
-
完善主配置类定义信息: processCommonDefinitionAnnotations()
查看是否有@Lazy注解, @Primary, @Role, @DependsOn, @Description -
注册主配置类
Spring启动时候会注册主配置类和加入核心后置处理器组件
3.refresh()
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
// 1. 刷新前的预处理
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
// 2. 获取 beanFactory,即前面创建的【DefaultListableBeanFactory】
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
// 3. 预处理 beanFactory,向容器中添加一些组件
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
// 4. 子类通过重写这个方法可以在 BeanFactory 创建并与准备完成以后做进一步的设置
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
// 5. 执行 BeanFactoryPostProcessor 方法,beanFactory 后置处理器
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
// 6. 注册 BeanPostProcessors,bean 后置处理器
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
// 7. 初始化 MessageSource 组件(做国际化功能;消息绑定,消息解析)
initMessageSource();
// Initialize event multicaster for this context.
// 8. 初始化事件派发器,在注册监听器时会用到
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
// 9. 留给子容器(子类),子类重写这个方法,在容器刷新的时候可以自定义逻辑,web 场景下会使用
onRefresh();
// Check for listener beans and register them.
// 10. 注册监听器,派发之前步骤产生的一些事件(可能没有)
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
// 11. 初始化所有的非单实例 bean
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
// 12. 发布容器刷新完成事件
finishRefresh();
}
}
}
- prepareRefresh()刷新前的预处理:
- initPropertySources():初始化一些属性设置,子类自定义个性化的属性设置方法;
- getEnvironment().validateRequiredProperties():检验属性的合法性
- earlyApplicationEvents = new LinkedHashSet():保存容器中的一些早期的事件;
- obtainFreshBeanFactory():获取在容器初始化时创建的BeanFactory:
- refreshBeanFactory():刷新BeanFactory,设置序列化ID;
- getBeanFactory():返回初始化中的GenericApplicationContext创建的BeanFactory对象,即【DefaultListableBeanFactory】类型
- prepareBeanFactory(beanFactory):BeanFactory的预处理工作,向容器中添加一些组件:
- 设置BeanFactory的类加载器、设置表达式解析器等等
- 添加BeanPostProcessor【ApplicationContextAwareProcessor】
- 设置忽略自动装配的接口:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware;
- 注册可以解析的自动装配类,即可以在任意组件中通过注解自动注入:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
- 添加BeanPostProcessor【ApplicationListenerDetector】
- 添加编译时的AspectJ;
- 给BeanFactory中注册的3个组件:environment【ConfigurableEnvironment】、systemProperties【Map<String, Object>】、systemEnvironment【Map<String, Object>】
- postProcessBeanFactory(beanFactory):子类重写该方法,可以实现在BeanFactory创建并预处理完成以后做进一步的设置。
- invokeBeanFactoryPostProcessors(beanFactory):在BeanFactory标准初始化之后执行 BeanFactoryPostProcessor的方法,即BeanFactory的后置处理器:
- 先执行BeanDefinitionRegistryPostProcessor: postProcessor.postProcessBeanDefinitionRegistry(registry)
- 获取所有的实现了BeanDefinitionRegistryPostProcessor接口类型的集合
- 先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor
- 再执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor
- 最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors
- 再执行BeanFactoryPostProcessor的方法:postProcessor.postProcessBeanFactory(beanFactory)
- 获取所有的实现了BeanFactoryPostProcessor接口类型的集合
- 先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor
- 再执行实现了Ordered顺序接口的BeanFactoryPostProcessor
- 最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor
- 先执行BeanDefinitionRegistryPostProcessor: postProcessor.postProcessBeanDefinitionRegistry(registry)
- registerBeanPostProcessors(beanFactory):向容器中注册Bean的后置处理器BeanPostProcessor,它的主要作用是干预Spring初始化bean的流程,从而完成代理、自动注入、循环依赖等功能
- 获取所有实现了BeanPostProcessor接口类型的集合:
- 先注册实现了PriorityOrdered优先级接口的BeanPostProcessor;
- 再注册实现了Ordered优先级接口的BeanPostProcessor;
- 最后注册没有实现任何优先级接口的BeanPostProcessor;
- 最终注册MergedBeanDefinitionPostProcessor类型的BeanPostProcessor:beanFactory.addBeanPostProcessor(postProcessor);
- 给容器注册一个ApplicationListenerDetector:用于在Bean创建完成后检查是否是ApplicationListener,如果是,就把Bean放到容器中保存起来:applicationContext.addApplicationListener((ApplicationListener<?>) bean);此时容器中默认有6个默认的BeanProcessor(无任何代理模式下)
- initMessageSource():初始化MessageSource组件,主要用于做国际化功能,消息绑定与消息解析:
- initApplicationEventMulticaster():初始化事件派发器,在注册监听器时会用到
- 看BeanFactory容器中是否存在自定义的ApplicationEventMulticaster:如果有,直接从容器中获取;如果没有,则创建一个SimpleApplicationEventMulticaster
- 将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件就可以直接自动注入。
- onRefresh():留给子容器、子类重写这个方法,在容器刷新的时候可以自定义逻辑。
- registerListeners():注册监听器:将容器中所有的ApplicationListener注册到事件派发器中,并派发之前步骤产生的事件:
- finishBeanFactoryInitialization(beanFactory):初始化所有剩下的单实例bean,核心方法是preInstantiateSingletons(),会调用getBean()方法创建对象;
- 获取容器中的所有beanDefinitionName,依次进行初始化和创建对象
- 获取Bean的定义信息RootBeanDefinition,它表示自己的BeanDefinition和可能存在父类的BeanDefinition合并后的对象
- 如果Bean满足这三个条件:非抽象的,单实例,非懒加载,则执行单例Bean创建流程:
- 所有Bean都利用getBean()创建完成以后,检查所有的Bean是否为SmartInitializingSingleton接口的,如果是;就执行afterSingletonsInstantiated();
- finishRefresh():发布BeanFactory容器刷新完成事件:
prepareRefresh
obtainFreshBeanFactory
获取之前this()new出来的工厂
prepareBeanFactory