1.【Spring源码】- 02 Spring IoC容器启动之refresh方法
2.spring applicationcontextaware 为ä»ä¹è¦@lazy
3.Spring IoC源码深度剖析
【Spring源码】- 02 Spring IoC容器启动之refresh方法
在注册阶段,码笔AnnotationConfigApplicationContext构造方法中的码笔第一个方法被分析过。接下来,码笔我们关注第二个方法:register(componentClasses)。码笔在使用XML配置方式时,码笔通过new ClassPathXmlApplicationContext("classpath:spring.xml")来创建实例,码笔仓储网站源码其中需要指定xml配置文件路径。码笔使用注解方式时,码笔也需要为ApplicationContext提供起始配置源头,码笔这里使用配置类代替xml配置文件,码笔按照配置类中的码笔注解(如@ComponentScan、@Import、码笔@Bean)解析并注入Bean到IoC容器。码笔
通过配置类,码笔Spring解析注解实现Bean的码笔注入。使用@Configuration注解定义的配置类相当于xml配置文件,但目前Spring推荐使用注解方式,xml配置的使用概率正在降低。
register(componentClasses)方法的申请流程源码核心逻辑在AnnotatedBeanDefinitionReader#doRegisterBean中,将传入的配置类解析为BeanDefinition并注册到IoC容器。ConfigurationClassPostProcessor这个BeanFactory后置处理器在IoC初始化时,获取配置类的BeanDefinition集合,开始解析。
真正启动IoC容器的流程在refresh()方法中,这是了解IoC容器启动流程的关键步骤。refresh方法在AbstractApplicationContext中定义,采用模板模式,提供IoC初始化流程的html翻译源码基本实现,子类可以扩展。
下面分析refresh()方法的每个步骤,以了解IoC容器的启动流程。
prepareRefresh方法主要在refresh执行前进行准备工作,如设置Context的启动时间、状态,以及扩展系统属性相关。
initPropertySources()方法主要用于扩展配置来源,如网络、rrpn源码讲解物理文件、数据库等加载配置信息。StandardEnvironment默认只提供加载系统变量和应用变量的功能,用于子类扩展。
❝initPropertySources方法常见扩展场景包括:❞
getEnvironment().validateRequiredProperties()确保设置的必要属性在环境中存在,否则抛出异常终止应用。
BeanFactory是Spring的基本IoC容器,ApplicationContext包装了BeanFactory,提供更智能、wave源码公式更便捷的功能。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();获取的BeanFactory是IoC容器初始化工作的基础。
上面获取的BeanFactory还不能直接使用,需要填充必要的配置信息。至此,IoC容器的启动流程基本完成。
这里对IoC启动流程有个大致、直观的印象。主要步骤包括:准备阶段、配置来源扩展、初始化BeanFactory、填充配置、解析配置类、注册Bean、实例化BeanPostProcessor、初始化国际化和事件机制、以及创建内嵌Servlet容器(在SpringBoot中实现)。这些步骤确保了IoC容器顺利启动并管理Bean。
spring applicationcontextaware 为ä»ä¹è¦@lazy
å¨éWebåºç¨ä¸ï¼æå·¥å è½½SpringIoC容å¨ï¼ä¸è½ç¨ApplicationContextï¼è¦ç¨AbstractApplicationContextãç¨å®ä»¥åè¦è®°å¾è°ç¨ctx.close()å ³é容å¨ãå¦æä¸è®°å¾å ³é容å¨ï¼æå ¸åçé®é¢å°±æ¯æ°æ®åºè¿æ¥ä¸è½éæ¾
Spring IoC源码深度剖析
Spring IoC容器初始化深度剖析
Spring IoC容器是Spring的核心组件,主要负责对象管理和依赖关系管理。容器体系丰富多样,如BeanFactory作为顶层容器,它定义了所有IoC容器的基本原则,而ApplicationContext及其子类如ClassPathXmlApplicationContext和AnnotationConfigApplicationContext则提供了额外功能。Spring IoC容器的初始化流程关键在AbstractApplicationContext的refresh方法中。 1.1 初始化关键点 通过创建特定类LagouBean并设置断点,我们发现Bean的创建在未设置延迟加载时,发生在容器初始化过程中。构造函数调用、InitializingBean的afterPropertiesSet方法以及BeanFactoryPostProcessor和BeanPostProcessor的初始化和调用,都在refresh方法的不同步骤中发生。 1.2 主体流程概览 Spring IoC容器初始化的主体流程主要集中在AbstractApplicationContext的refresh方法,涉及Bean对象创建、构造函数调用、初始化方法执行和处理器调用等步骤。 1.3 深度剖析 分析发现,延迟加载机制使得懒加载的bean在第一次调用getBean时才进行初始化。而对于非懒加载bean,它们在容器初始化阶段已经完成并缓存。Spring处理循环依赖的方法依赖于构造器调用的顺序规则,不支持原型bean的循环依赖,而对单例bean则通过setXxx或@Autowired方法提前暴露对象来避免循环依赖。