spring 容器的启动流程
2021-12-09 10:37:46 0 举报
spring 容器的启动流程
作者其他创作
大纲/内容
finishRefresh();
针对 factoryBean 这种类型的类做了特殊处理如果传入的名称包含& 则返回这个factoryBean对象如果传入的名称不包含& 且根据这个名称查询的实例是factoryBean 类型的那么调用此实例的 getObject() 方法放入缓存 返回返回这个对象
构造函数会调用父类的构造函数context 继承了GenericApplicationContextpublic GenericApplicationContext() { this.beanFactory = new DefaultListableBeanFactory(); }这个factory来放置我们的bean 相关信息然后调用自己的构造函数public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); }reader 是扫描我们的bean定义的类 注解方式scanner 则是类路径扫描(不太熟悉 未用到)
初始化 ApplicationEventMulticaster。 * 如果上下文中没有定义,则使用 SimpleApplicationEventMulticaster。
把容器中的监听器添加到广播器中
registerBeanPostProcessors(beanFactory);
准备刷新容器(子类可自定义实现 默认为啥都不做)springboot 的context在这一步回开启web处理器
给实现了InstantiationAwareBeanPostProcessor 后置处理器一个机会:能够直接返回一个对象
initApplicationEventMulticaster();
真正创建对象
准备容器prepareRefresh()
Object sharedInstance = getSingleton(beanName);
invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)实例化并调用所有已注册的 BeanFactoryPostProcessor bean,* 尊重显式顺序(如果给定)。这一步会先初始注册的 BeanDefinitionRegistryPostProcessor然后调用 非常重要的ConfigurationClassPostProcessor 在这一步会根据我们的启动类 来扫描项目 加入项目中的bean信息进入容器首先,调用实现 PriorityOrdered 的 BeanDefinitionRegistryPostProcessors。接下来,调用实现 Ordered 的 BeanDefinitionRegistryPostProcessors。 最后,调用所有其他 BeanDefinitionRegistryPostProcessor,直到不再出现其他 BeanDefinitionRegistryPostProcessor。
initMessageSource();
preInstantiateSingletons()遍历 beanFactory 的beanDefintion 然后初始化当 类不是懒加载 非抽象 是单列的情况下当类为factoryBean 时先获得这个类
spring 程序的创建过程
创建context ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Config.class);
后置处理器没有提前生成对象
实例化,初始化,增强容器中的类超级重点
获取不到 开始创建
onRefresh();
给beanfactory赋值一些默认的参数 prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)
createBean
注册拦截 bean 创建的 bean 处理器。
初始化消息源。 * 如果在此上下文中没有定义,则使用父级。
postProcessBeanFactory给个机会对工厂处理
注册启动类 register(annotatedClasses);这一步是为了在后面根据它继而来扫描整个项目埋下基础
拿到beanFactory
往beanfactory注册框架默认的处理器类AnnotationAwareOrderComparator(排序)ConfigurationClassPostProcessor(扫描注册bean)AutowiredAnnotationBeanPostProcessor(处理依赖)RequiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor(公共注解处理 例如 @Resource)EventListenerMethodProcessorDefaultEventListenerFactory
完成容器的加载会通过广播发送容器刷新完成的时间
registerListeners();
doGetBean(name)<----getBean(name)
refresh 容器
finishBeanFactoryInitialization(beanFactory);
收藏
0 条评论
回复 删除
下一页