Spring-bean

概念

  1. 基本概念:Bean是由Spring IoC容器实例化、组装和管理的一个对象,它是Spring应用程序的基本构建块。
  2. 管理范围:Bean可以是Java对象、组件、服务,或者是应用程序中的任何一个被Spring容器管理的对象。

名词介绍

  • 实例化:Spring 容器负责实例化 Bean。当应用程序启动时,Spring 容器会根据配置信息或注解扫描的结果,找到并实例化所有被标记为 Bean 的类,并将它们加入容器中。实例化的过程由 Spring 的 IoC 容器负责。
  • 管理:一旦 Bean 被实例化,Spring 容器将负责管理 Bean 的生命周期和依赖关系。它会根据配置文件或注解的信息,自动解决 Bean 之间的依赖关系,确保在需要的时候正确的注入依赖。Spring 容器还会负责销毁不再需要的 Bean。
  • 依赖注入:依赖注入是 Spring 框架的一个重要特性,它允许通过自动或显式配置的方式将 Bean 的依赖项注入到其它 Bean 中。依赖注入可以通过构造函数注入、Setter 方法注入或字段注入的方式实现,其中最常见的是使用 ‘@Autowired’注解进行注入。
  • 作用域:Spring 框架提供了多种作用域(scope)来管理 Bean 的生命周期。常见的作用域包括单例(Singleton)、原型(Prototype)、会话(Session)、请求(Request)等。默认情况下,Bean 是单例的,即每个容器中只存在一个实例。但可以根据需要配置其它作用域。
  • 自动装配:Spring Boot 支持自动装配(Auto - wiring),它能够根据类型或名称自动解析和注入依赖关系。通过在需要注入的字段、构造函数或 Setter 方法上使用 ‘@Autowired’ 注解,Spring 容器会自动查找并注入对应的 Bean。

总的来说,Bean 是 Spring 框架中被实例化、管理和维护的对象。通过在类上使用 ‘@Component’ 注解或其派生注解,将一个类声明为 Bean,并将其交给 Spring 容器处理。Spring 容器负责实例化、管理和维护 Bean 的生命周期和依赖关系。通过依赖注入和自动装配,应用程序可以方便的使用和管理 Bean。

自动装配

概念

自动装配是指Spring框架通过一定的规则,在容器中自动为Bean之间建立依赖关系的过程。在使用自动装配时,开发者无需显式地指定Bean之间的依赖关系,Spring会根据一些配置信息自动将合适的Bean注入到目标Bean中。

Spring Boot 自动装配的实现

核心注解与自动配置机制

  1. @SpringBootApplication注解
    • 这是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个重要注解。
    • @SpringBootConfiguration:表明这是一个Spring Boot的配置类。
    • @EnableAutoConfiguration:启用Spring Boot的自动配置机制。
    • @ComponentScan:启用组件扫描,以便找到带有@Component、@Service、@Repository、@Controller等注解的Spring组件,并将它们注册为Spring Bean。
  2. @EnableAutoConfiguration注解
    • 触发自动配置机制。
    • Spring Boot会根据类路径中的依赖、属性文件中的配置以及其他环境变量来判断并自动配置应用所需的Bean。

二、spring.factories文件与自动配置类

  1. spring.factories文件
    • 位于META-INF目录下。
    • 列出了所有的自动配置类(Auto-Configuration Classes)。
    • 在Spring应用上下文初始化时,这些自动配置类会被加载,并根据条件自动配置相应的Bean。
  2. 自动配置类
    • 自动配置类通常使用条件注解(Conditional Annotations)来控制Bean的装配。
    • 常见的条件注解包括:
      • @ConditionalOnClass:只有在指定的类在类路径上存在时才会装配Bean。
      • @ConditionalOnMissingBean:只有在指定的Bean不存在时才会装配Bean。
      • @ConditionalOnProperty:只有在指定的属性存在并具有特定值时才会装配Bean。

三、组件扫描与Bean注册

  1. 组件扫描
    • 通过@ComponentScan注解启用组件扫描。
    • Spring会扫描指定包及其子包中的所有组件(带有@Component、@Service、@Repository、@Controller等注解的类),并将它们注册为Spring Bean。
  2. Bean注册
    • 在自动配置过程中,Spring Boot会根据检测到的依赖和条件注解来判断是否需要创建和注册Bean。
    • 如果满足条件,Spring Boot会创建对应的Bean,并将其注册到Spring应用程序上下文中,以供应用程序使用。

四、自定义自动配置

除了使用Spring Boot提供的自动配置外,开发者还可以自定义自己的自动配置:

  1. 创建一个配置类,并在类上添加@Configuration和@EnableConfigurationProperties注解。
  2. 在配置类中使用条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)指定自动配置的条件。
  3. 使用@ConfigurationProperties注解创建配置属性类,并在配置类中注入该属性类。
  4. 编写需要自动配置的Bean,并使用@Bean注解将Bean注册到容器中。

综上所述,Spring Boot通过核心注解、spring.factories文件、自动配置类、组件扫描与Bean注册以及自定义自动配置等机制和步骤实现了bean的自动装配。这使得开发者可以更加便捷地集成第三方组件和库,并在应用程序中使用它们,而无需手动配置大量的XML文件或Java配置类。

注入

注入是指将依赖对象(Bean)的引用或数值注入到目标对象(Bean)中的过程。Spring支持多种注入方式,包括构造器注入、Setter方法注入和字段注入。

  1. 构造器注入(Constructor Injection)
    • 通过构造方法将依赖对象注入到目标对象中。
    • 实现方式:在目标对象的构造方法中声明参数,Spring容器负责将依赖对象的实例传递给构造方法。
    • 优点:确保依赖对象在目标对象创建时即被注入,避免了后续注入可能带来的不确定性。
  2. Setter方法注入(Setter Injection)
    • 通过Setter方法将依赖对象注入到目标对象中。
    • 实现方式:在目标对象中提供一个Setter方法,Spring容器负责调用该方法并传递依赖对象的实例。
    • 优点:灵活性高,可以在目标对象创建后再进行依赖注入。
  3. 字段注入(Field Injection)
    • 通过字段直接将依赖对象注入到目标对象中。
    • 实现方式:在目标对象中声明一个字段,并使用@Autowired@Inject等注解标记该字段,Spring容器负责将依赖对象的实例注入该字段。
    • 优点:简洁明了,减少了代码量。但可能导致测试困难,因为依赖对象在字段声明时即被注入,不易于替换为模拟对象。

生命周期

概念

Spring Bean的生命周期是指从Bean的创建到销毁所经历的一系列过程。这个过程由Spring容器进行管理,确保了Bean的实例化和依赖注入等操作的正确执行。

Bean定义

  • 在Spring配置文件中或通过注解等方式定义Bean,包括Bean的类名、作用域、依赖关系等。
  • Spring容器在启动时扫描这些配置,并解析成内部的BeanDefinition对象,该对象包含了Bean的各种定义信息。

Bean实例化

  • 对于BeanFactory容器,当用户请求一个尚未初始化的Bean时,容器会调用createBean方法进行实例化。
  • 对于ApplicationContext容器,在容器启动时就会实例化所有非延迟加载的Bean。
  • 实例化过程仅仅是创建Bean的实例,并未进行依赖注入和初始化。

Bean属性赋值

  • Spring根据BeanDefinition中的信息,通过反射机制为Bean的属性赋值。
  • 例如@Autowired 等注解注入的对象、@Value 注入的值、setter方法或构造函数注入依赖和值、@Resource注入的各种资源。

Bean初始化

  1. Aware接口回调
    • 如果Bean实现了xxxAware接口(如BeanNameAware、BeanFactoryAware等),Spring容器会在Bean初始化前后调用相应的set方法,将相关的Aware实例注入给Bean。
  2. BeanPostProcessor前置处理
    • 在Bean初始化之前,Spring容器会调用实现了BeanPostProcessor接口的类的postProcessBeforeInitialization方法,对Bean进行前置处理。
  3. 初始化Bean
    • 如果Bean实现了InitializingBean接口,Spring容器会调用其afterPropertiesSet方法进行初始化。
    • 或者,如果Bean在配置中指定了init-method属性,Spring容器会调用该属性指定的方法进行初始化。
  4. BeanPostProcessor后置处理
    • 在Bean初始化之后,Spring容器会调用实现了BeanPostProcessor接口的类的postProcessAfterInitialization方法,对Bean进行后置处理。

Bean销毁

  • 对于单例作用域的Bean,Spring容器会负责其整个生命周期的管理。
  • 当容器关闭时,如果Bean实现了DisposableBean接口,Spring容器会调用其destroy方法进行销毁。
  • 或者,如果Bean在配置中指定了destroy-method属性,Spring容器会调用该属性指定的方法进行销毁。


Spring-bean
https://xichicheng.github.io/2024/11/21/bean/
作者
陈兮迟
发布于
2024年11月21日
许可协议