在Spring Boot中,Bean的加载过程涉及到Spring框架的核心机制,主要包括Spring容器的启动和初始化过程。下面将详细介绍Spring Boot中Bean的加载过程:

1. 启动流程

Spring Boot应用启动时,主要通过SpringApplication类的run方法启动。例如: 

public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}

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。

例如,如果有一个类:

 
@Component
public class MyBean {
// ...
}

Spring Boot会在启动时自动检测到这个类,并将其注册为Bean。

b. @Configuration和@Bean

对于那些使用Java配置(例如通过@Configuration@Bean注解)的情况,这些配置类也会被扫描和注册。例如:

@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}

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:

 
 
@Component
public class MyDependentBean {
private MyBean myBean;
 
@Autowired
public MyDependentBean(MyBean myBean) {
this.myBean = myBean;
}
}

在上面的例子中,MyDependentBean的构造器会接收到一个MyBean的实例。

5. 初始化回调和启动应用逻辑

最后,Spring容器会调用所有实现了InitializingBean接口的afterPropertiesSet方法,或者执行了@PostConstruct注解的方法来进行初始化。同时,如果有实现了ApplicationListener<ContextRefreshedEvent>接口的类,它们也会在上下文刷新后被调用。这些步骤确保了所有的Bean都已正确初始化并且可以用于应用逻辑的执行。

6. 应用上下文刷新完成

当所有的Bean都被创建、配置和初始化后,Spring容器会触发一个事件(通常是ContextRefreshedEvent),标志着Spring应用上下文的初始化完成,此时应用可以开始对外提供服务。

通过以上步骤,Spring Boot确保了应用启动时所有需要的Bean都能被正确地加载、实例化和初始化。这使得开发者可以专注于业务逻辑的实现,而无需过多关注底层容器的配置和细节。

提示:AI自动生成,仅供参考
posted on 2025-07-01 17:30  colorfulworld  阅读(70)  评论(0)    收藏  举报