在Spring Boot中,Bean的加载过程涉及到Spring框架的核心机制,主要包括Spring容器的启动和初始化过程。下面将详细介绍Spring Boot中Bean的加载过程:
1. 启动流程
Spring Boot应用启动时,主要通过SpringApplication类的run方法启动。例如:
2. 创建ApplicationContext
在SpringApplication.run方法内部,首先会创建一个ApplicationContext的实例,这是Spring容器的基础。ApplicationContext有多种实现,例如AnnotationConfigApplicationContext,它用于处理基于注解的配置。
3. IOC容器初始化过程/注册Bean定义
Spring Boot应用会扫描和注册Bean。这个过程主要由以下几个步骤组成:
3.1 资源定位扫描 @ComponentScan
通过@SpringBootApplication注解(它包含了@ComponentScan),Spring Boot会扫描指定的包以及子包中的所有@Component、@Service、@Repository、@Controller等注解标注的类,并将它们注册为Bean。
例如,如果有一个类:
Spring Boot会在启动时自动检测到这个类,并将其注册为Bean。
b. @Configuration和@Bean
对于那些使用Java配置(例如通过@Configuration和@Bean注解)的情况,这些配置类也会被扫描和注册。例如:
3.2 BeanDefinition载入与分析
将上一步中配置资源转化为内部数据结构BeanDefinition --BeanDefinition载入和解析
3.3 BeanDefinition注册
将BeanDefinition注册到BeanDefinitionRegistery中,并保存在ConcurrentHashMap里,为bean名称,值为BeanDefinition对象 --Beandefinition注册
4. Bean的实例化与依赖注入
一旦Bean的定义被注册,Spring容器接下来会实例化这些Bean,并且在需要的时候进行依赖注入。这主要通过以下几个步骤完成:
a. 实例化
对于每一个注册的Bean,Spring容器会根据其定义来创建对象实例。例如,对于上面的MyBean,Spring会创建一个MyBean的实例。
b. 属性填充(依赖注入)
在对象实例化之后,Spring会通过setter方法或者构造器注入(如果定义了)来填充依赖项。例如,如果一个Bean依赖于另一个Bean:
在上面的例子中,MyDependentBean的构造器会接收到一个MyBean的实例。
5. 初始化回调和启动应用逻辑
最后,Spring容器会调用所有实现了InitializingBean接口的afterPropertiesSet方法,或者执行了@PostConstruct注解的方法来进行初始化。同时,如果有实现了ApplicationListener<ContextRefreshedEvent>接口的类,它们也会在上下文刷新后被调用。这些步骤确保了所有的Bean都已正确初始化并且可以用于应用逻辑的执行。
6. 应用上下文刷新完成
当所有的Bean都被创建、配置和初始化后,Spring容器会触发一个事件(通常是ContextRefreshedEvent),标志着Spring应用上下文的初始化完成,此时应用可以开始对外提供服务。
通过以上步骤,Spring Boot确保了应用启动时所有需要的Bean都能被正确地加载、实例化和初始化。这使得开发者可以专注于业务逻辑的实现,而无需过多关注底层容器的配置和细节。
浙公网安备 33010602011771号