Spring容器时序图
2023-03-21 11:36:54 0 举报
Spring容器时序图
作者其他创作
大纲/内容
5.3.执行Bean的invokeInitMethods方法
AbstractApplicationEventMulticaster
registrySingleton()注册单例Bean
处理FactoryBean的逻辑比如Mybatis等
实现loadBeanDefinitions方法创建XmlBeanDefinitionReader
可配置Bean工厂接口
AbstractRefreshableApplicationContext
抽象事件发布器
从单例Bean容器中取到对象,判断是否是FactoryBean
6.1创建默认的事件发布器
如果XML中配置了context:component-scan,处理自动扫描的类
注册BeanDefinition到容器中
执行postProcessPropertyValues方法
1.createBeanInstance()根据实例化策略,创建Bean对象(反射)
getBeansOfType()从BeanDefinition容器中找到所有是BeanFactoryPostProcessor类型的Class
gentBean(String beanName)通过BeanName去找Bean对象
5.initializeBean执行Bean的初始化方法
从第一步中获取到Bean对象,即从单例Bean容器中取到对象,判断是否是FactoryBean
2.getBean()从单例容器中获取Bean,流程不在赘述了
new SimpleApplicationEventMulticaster()
应用抽象上下文类定义刷新容器的流程,也就是启动容器
BeanDefinition扫描注册类处理标记了@Compont的类,实现自动扫描注册
addBeanPostProcessor添加到容器中
BeanPostProcessor处理器
4.2获取到所有的BeanFactoryPostProcessor类
addBeanPostProcessor
Actor
创建ApplicationContextAware感知对象
实现postProcessPropertyValues方法处理注入的注解
SimpleApplicationEventMulticaster
5. registerBeanPostProcessor注册BeanPostProcessor类 到容器中
7.2.addApplicationListenerBean保存监听器到容器中
执行multicastEvent方法,广播事件
创建默认工厂
3.使用Bean调用Bean的方法
3. 添加ApplicationContextAwareProcessor
AbstractXmlRefreshableApplicationContext
可更新的应用上下文类1. 创建默认Bean工厂2. 定义加载BeanDefinition的方法
从第一步中没有获取到Bean对象,则需要创建Bean对象
抽象的XML文件上下文1. 创建XML文件读取器
2.调用getBean方法去创建Bean
创建ClassPathXmlApplicationContext
BeanPostProcessor处理器子类在Bean实例化后进行操作主要处理自动注入的注解,比如@Autowired、@Value
5.2. addBeanPostProcessor注册BeanPostProcessor到Bean工厂容器中
AbstractBeanFactory
3.1.执行postProcessPropertyValues方法
创建文件流读取类,获取xml文件的文件流,根据用户传入的路径判断是从ClassPath读取还是File读取等
AbstractBeanFactory子类实现Bean的具体创建
解决循环依赖的三级缓存就在此处分别从一级缓存、二级缓存、三级缓存中去查找
XmlBeanDefinitionReader
处理FactoryBean的逻辑
AbstractApplicationContext
解析XML,组装成BeanDinifition对象
5.3.1. 先执行InitializingBean的初始化方法
8.1. 调用preInstantiateSingletons
1.getSingleton先从单例Bean容器中去获取Bean对象
抽象工厂类,定义模板方法制定标准流程
AbstractAutowireCapableBeanFactory
5.2.在Bean初始化之前执行执行BeanPostProcessor的BeforeInitialization方法
2.调用loadBeanDefinitions抽象方法,加载BeanDefinition对象
4.applyPropertyValues给实例化的Bean填充属性(从BeanDefition中读取到属性值,填充到Bean对象属性中)
解析注解类,组装成BeanDifinition
4.处理FactoryObject逻辑
执行postProcessAfterInitialization
容器中默认的Bean工厂类定义BeanDefinitionfont color=\"#323232\
创建实例,把配置文件路径赋值到类变量中
addApplicationListener保存到容器中
6.initApplicationEventMulticaster初始化应用事件发布器
注册单例Bean
addBeanPostProcessor注册BeanPostProcessor类到容器中
1.调用refreshBeanFactory抽象方法,创建工厂对象
执行postProcessBeforeInitialization
InstantiationAwareBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
DefaultSingletonBeanRegistry
loadBeanDefinitions真正开始加载BeanDefinition
定义保存监听事件的容器Set<ApplicationListener<ApplicationEvent>>
默认单例Bean的注册类
执行afterPropertiesSet
完成了第一步,创建了默认Bean工厂,且解析XML组装为BeanDefinition,把BeanDefinition注册到容器中
FactoryBeanRegistrySupport
调用registryBeanDefinition
注册销毁方法到容器中
5.3.2. 再执行定义在XML中的初始化方法
6.在Bean初始化之后执行执行BeanPostProcessor的AfterInitialization方法
getSingleton先从单例Bean容器中去获取Bean对象
FactoryBean注册类
1.从BeanDefinition容器中获取所有BD
InitializingBean
DefaultListableBeanFactory
ApplicationContextAware感知对象由于不能在创建Bean时感知ApplicationContext属性,此时包装成BeanPostProcessor类
BeanPostProcessor
ConfigurableBeanFactory
3.调用createBean()
面向用户使用的上下文类
2. 创建ApplicationContextAware感知对象
4. invokeBeanFactoryPostProcessor执行BeanFactoryPostProcessor
ClassPathBeanDefinitionScanner
8.注册单例Bean的容器中
ClassPathXmlApplicationContext
BeanDefinitionRegistry
9.finishRefresh发布容器刷新完成(启动完成事件),也就是new ContextRefreshedEvent()事件广播出去
ApplicationContextAwareProcessor
5.1. getBeansOfType()根据class类型从容器中获取Bean,这里就是获取所有的BeanPostProcessor类流程同4.1
4.3循环调用执行BeanFactoryPostProcessor的postProcessBeanFactory()方法
添加到三级缓存中
创建
BeanDefinition注册接口DefaultListableBeanFactory实现了该类,也就是把BeanDefinition保存到Bean工厂容器中
XML文件读取器类1. 读取XML2. 解析XML组装为BeanDefinition对象
4.1. getBeansOfType()根据classl类型从容器中获取Bean,这里就是获取所有的BeanFactoryPostProcessor类
默认事件发布器
调用父类refresh()方法
7.registerListeners注册监听器
2.addSingtonObjectFactory如果单例对象,提前把创建的实例对象添加到三级缓存中(是个代理对象)PS:这里没有画代理对象的生成
6.2 注册事件发布器到单例Bean容器中
7.1. getBeansOfType()根据class类型从容器中获取Bean,这里就是获取所有的ApplicationListener类流程同4.1
7.注册Bean的销毁方法(单例对象)registerDisposableBeanIfNecessary
// 创建ClassPathXmlApplicationContextClassPathXmlApplicationContext cpxac = new ClassPathXmlApplicationContext(\"spring-scan.xml\");// 从容器中获取BeanIUserService userService = (IUserService) cpxac.getBean(\"userService\");// 调用Bean对象的方法String token = userService.queryUserToken();Assert.assertTrue(StrUtil.isNotEmpty(token));
定义BeanPostProcessor容器List<BeanPostProcessor>
8.preInstantiateSingletons提前实例化单例对象
BeanPostProcessor处理器子类在Bean实例化后进行操作
1. 实现refreshBeanFactory抽象方法,创建默认工厂
从单例Bean容器中去获取Bean对象
0 条评论
下一页