Spring容器启动流程解析
lookup注解源码分析核心功能概述lookup注解用于解决原型(prototype)作用域Bean在单例Bean中的依赖注入问题每次调用带有lookup注解的方法时都会从Spring容器中获取一个新的Bean实例。实现原理Spring在创建Bean的过程中会检查方法是否标注Lookup。若存在该注解则生成一个代理对象该代理对象在执行Lookup标注的方法时会通过BeanFactory.getBean()获取新的实例。实际上是利用CGLIB动态代理或JDK动态代理生成代理类并重写方法以达到每次获取新实例的目的。与AOP的区别lookup注解的代理机制与AOP不同它不涉及切面逻辑仅用于控制Bean的获取方式。Spring启动流程概述Spring容器创建阶段创建默认的DefaultListableBeanFactory作为Bean工厂。创建BeanDefinitionReader和ClassPathBeanDefinitionScanner用于读取和扫描Bean定义。注册一些基础BeanPostProcessor和BeanFactoryPostProcessor。refresh()方法详解refresh()方法是Spring启动的核心入口包含多个关键子步骤prepareRefresh()设置环境变量、验证必要属性。obtainFreshBeanFactory()创建或刷新BeanFactory。prepareBeanFactory()为BeanFactory设置类加载器、表达式解析器、类型转换器等。postProcessBeanFactory()子类可扩展的钩子方法。invokeBeanFactoryPostProcessors()调用所有BeanFactoryPostProcessor对BeanFactory进行定制。registerBeanPostProcessors()注册BeanPostProcessor。initMessageSource()初始化国际化消息资源。initApplicationEventMulticaster()初始化事件广播器。onRefresh()模板方法供子类扩展。registerListeners()注册事件监听器。finishBeanFactoryInitialization()完成非懒加载单例Bean的初始化。finishRefresh()完成刷新发布上下文刷新事件。BeanFactory的创建与初始化BeanFactory的创建在AbstractApplicationContext的构造方法中调用父类构造器最终创建DefaultListableBeanFactory。DefaultListableBeanFactory继承自AbstractAutowireCapableBeanFactory并实现了ListableBeanFactory接口。BeanFactory的初始化内容设置比较器AnnotationAwareOrderComparator。设置泛型解析器GenericTypeResolver。设置依赖描述解析器AutowiredAnnotationBeanPostProcessor。注册ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor等核心后置处理器。BeanDefinition的注册与扫描注册主配置类使用BeanDefinitionReader将传入的主配置类封装为BeanDefinition并注册到BeanFactory中。扫描机制ClassPathBeanDefinitionScanner负责扫描指定包路径下的类将其转换为BeanDefinition。默认扫描带有Component、Service、Repository等注解的类。BeanFactoryPostProcessor的应用概念说明BeanFactoryPostProcessor是对BeanFactory的后置处理接口在BeanDefinition加载完成后、Bean实例化之前被调用。典型应用ConfigurationClassPostProcessor负责处理Configuration、ComponentScan、Import等注解。解析配置类触发组件扫描注册导入的Bean。调用时机在invokeBeanFactoryPostProcessors()方法中调用所有已注册的BeanFactoryPostProcessor。BeanPostProcessor的注册注册机制通过扫描发现用户自定义的BeanPostProcessor类。将其封装为BeanDefinition并注册到容器中。在registerBeanPostProcessors()方法中按顺序注册到BeanFactory的beanPostProcessors列表中。核心BeanPostProcessorAutowiredAnnotationBeanPostProcessor处理Autowired、Value等注解。CommonAnnotationBeanPostProcessor处理Resource、PostConstruct等注解。ApplicationListenerDetector检测并收集ApplicationListener类型的Bean。国际化支持初始化MessageSource的初始化查看容器中是否有自定义的MessageSourceBean。若没有则创建默认的DelegatingMessageSource。将其赋值给AbstractApplicationContext.messageSource属性。用途支持多语言消息的获取常用于国际化场景。事件广播器初始化ApplicationEventMulticaster的初始化查看容器中是否存在名为applicationEventMulticaster的Bean。若无则创建默认的SimpleApplicationEventMulticaster。注册到容器中并赋值给AbstractApplicationContext.applicationEventMulticaster。事件广播机制事件通过publishEvent()方法发布。广播器遍历所有监听器依次调用其onApplicationEvent()方法。支持同步/异步方式执行监听器逻辑。事件监听器的注册监听器来源用户自定义的ApplicationListenerBean。使用EventListener注解标注的方法。注册流程扫描出所有ApplicationListener类型的Bean。通过registerListeners()方法添加至事件广播器中。注解监听器适配使用EventListenerMethodProcessor处理EventListener注解。将方法封装为ApplicationListenerMethodAdapter并注册为监听器。单例Bean的实例化核心方法finishBeanFactoryInitialization()遍历所有非懒加载的单例Bean逐个进行实例化。按照依赖关系排序后创建确保依赖项先于目标Bean创建。实例化流程推断构造方法。实例化Bean。填充属性依赖注入。设置Aware接口回调。初始化前后的BeanPostProcessor处理。初始化方法调用如InitializingBean.afterPropertiesSet。注册销毁逻辑如DisposableBean.destroy。生命周期处理器与容器关闭事件SmartLifecycle接口的实现实现start()和stop()方法分别在容器启动和关闭时被调用。start()方法在finishRefresh()中调用。stop()方法在close()中调用。容器关闭事件发布调用doClose()方法发布ContextClosedEvent。清除缓存、关闭BeanFactory、销毁单例Bean。事件发布机制详解事件发布器结构SimpleApplicationEventMulticaster为核心实现类。内部维护一个ApplicationListener集合。事件监听器分类显式注册的ApplicationListener直接实现ApplicationListener接口由ApplicationListenerDetector识别并注册。EventListener注解方法通过EventListenerMethodProcessor适配为ApplicationListener。事件广播流程调用publishEvent()发布事件。将事件包装为ApplicationEvent。遍历所有监听器匹配事件类型后执行监听逻辑。支持线程池异步执行监听器。BeanFactoryPostProcessor与BeanPostProcessor对比BeanFactoryPostProcessor作用对象BeanFactory。应用时机BeanDefinition加载之后、Bean实例化之前。典型用途修改BeanDefinition元信息、注册新的BeanDefinition。BeanPostProcessor作用对象Bean实例。应用时机Bean实例化前后。典型用途依赖注入、属性填充、代理增强等。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431299.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!