文章目录
- 一、AnnotationConfigApplicationContext构造方法
-
- 1.1 this()
- 1.2 register()
- 1.3 refresh()
- 二、容器启动生命周期
-
- 2.1 prepareRefresh()
- 2.2 obtainFreshBeanFactory()
-
- 2.2.1 refreshBeanFactory()
- 2.2.2 getBeanFactory()
- 2.3 prepareBeanFactory(beanFactory)
- 2.4 postProcessBeanFactory()
- 三、容器启动过程下
一、AnnotationConfigApplicationContext构造方法 启动一个注解配置的容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
进入构造方法
文章图片
1.1 this() 先看下this(),执行之前会先执行父类的构造方法,完成beanFactory赋值
文章图片
接着进入子类的构造方法
文章图片
这块初始化了两个重要的对象,reader用于注册指定的类(无需Component注解)到容器,scanner用于注册指定路径下的类(带有Component/Repository/Service/Controller),这两个对象实例化时传入的是this,说明AnnotationConfigApplicationContext就是容器本身
1.2 register() 再往下,进入register(componentClasses);
文章图片
使用reader将componentClass注册进容器,执行完之后
文章图片
bean已经被添加进beanFactory的beanDefinitionMap。AnnotationConfigApplicationContext也是实现了BeanFactory接口,他的父类GenericApplicationContext持有了DefaultListableBeanFactory,看下GenericApplicationContext
文章图片
明显这块使用了装饰器模式,增强了beanFactory。同时GenericApplicationContext又实现了BeanDefinitionRegistry,具有了读取注册bean的功能,又使用了适配器模式
1.3 refresh() AbstractApplicationContext.refresh()方法将刷新启动容器
文章图片
refresh方法启动容器调用了12个方法
- prepareRefresh();
- obtainFreshBeanFactory();
- prepareBeanFactory(beanFactory);
- postProcessBeanFactory(beanFactory);
- invokeBeanFactoryPostProcessors(beanFactory);
- registerBeanPostProcessors(beanFactory);
- initMessageSource();
- initApplicationEventMulticaster();
- onRefresh();
- registerListeners();
- finishBeanFactoryInitialization(beanFactory);
- finishRefresh();
二、容器启动生命周期 2.1 prepareRefresh() prepareRefresh做的是容器刷新前的一些准备工作
- 设置容器的启动时间
- 设置活跃状态active为true
- 设置关闭状态为false
- 处理Environment对象
- 准备监听器和事件的集合,默认为空
文章图片
看注释,意思是准备容器更新,设置启动时间和激活标志以及执行所有属性源的初始化。后半句其实是执行initPropertySources();
文章图片
在上下文环境中初始化任何占位符属性源,这是一个模板方法,提供给子类扩展使用。如果有带占位符的属性源,可以重写这个方法。例如在applicationContext.xml文件中有sping.test.username=${username},可以在重写的 initPropertySources(); 方法中加上getEnvironment().getSystemProperties().put(“sping.test.username”,“java”); 达到重新赋值的目的。
getEnvironment().validateRequiredProperties(); 创建环境对象,加载系统属性变量到环境对象中,并验证是否含有必要的属性
2.2 obtainFreshBeanFactory() 该方法用于获得一个新的 BeanFactory
文章图片
2.2.1 refreshBeanFactory()
文章图片
GenericApplicationContext的refreshBeanFactory()方法,不支持多次刷新,只调用一次refresh方法。给beanFactory设置一个唯一ID
2.2.2 getBeanFactory()
文章图片
直接返回GenericApplicationContext持有的单例beanFactory。
2.3 prepareBeanFactory(beanFactory)
文章图片
注释是说配置容器标志特征属性,如类加载器、后置增强等。主要完成一下设置:
- beanFactory.addBeanPostProcessor:
注册了一堆BeanPostProcessor到AbstractBeanFactory的beanPostProcessors中,以便bean在初始化前后调用BeanPostProcessor的方法。这些BeanPostProcessor需要传入ApplicationContext,在做增强时能用上。 - beanFactory.ignoreDependencyInterface:
设置各种Aware接口的实现类为忽略自动装配,放入ignoredDependencyInterfaces(Set类型) - beanFactory.registerResolvableDependency:
设置自动装配的类(BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext)。放入resolvableDependencies(Map类型),可以根据类型被注入 - beanFactory.registerSingleton:
注册各种可用组件(environment,systemProperties,systemEnvironment)
文章图片
自己扩展一个MyAnnotationConfigApplicationContext,就可以利用这个方法来修改beanFactory的属性,或者做一些其他操作
三、容器启动过程下 容器启动过程下
推荐阅读
- spring|Spring的BeanPostProcessor使用
- spring|Spring 原理
- spring boot app
- Spring|Spring Boot——初识Spring Boot以及什么是微服务
- java精品项目下载|java项目-第37期基于springboot+layui实现的医院His系统
- Java毕业设计项目实战篇|Java项目:中小医院信息管理系统(java+Springboot+ssm+mysql+maven+jsp)
- Java毕业设计项目实战篇|Java项目:医院管理系统(java+Springboot+ssm+mysql+maven)
- spring|spring boot访问接口报500
- JAVA人生|外包干了五年,废了...