Spring-bean
概念
- 基本概念:Bean是由Spring IoC容器实例化、组装和管理的一个对象,它是Spring应用程序的基本构建块。
- 管理范围: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 自动装配的实现
核心注解与自动配置机制
- @SpringBootApplication注解:
- 这是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个重要注解。
- @SpringBootConfiguration:表明这是一个Spring Boot的配置类。
- @EnableAutoConfiguration:启用Spring Boot的自动配置机制。
- @ComponentScan:启用组件扫描,以便找到带有@Component、@Service、@Repository、@Controller等注解的Spring组件,并将它们注册为Spring Bean。
- @EnableAutoConfiguration注解:
- 触发自动配置机制。
- Spring Boot会根据类路径中的依赖、属性文件中的配置以及其他环境变量来判断并自动配置应用所需的Bean。
二、spring.factories文件与自动配置类
- spring.factories文件:
- 位于META-INF目录下。
- 列出了所有的自动配置类(Auto-Configuration Classes)。
- 在Spring应用上下文初始化时,这些自动配置类会被加载,并根据条件自动配置相应的Bean。
- 自动配置类:
- 自动配置类通常使用条件注解(Conditional Annotations)来控制Bean的装配。
- 常见的条件注解包括:
- @ConditionalOnClass:只有在指定的类在类路径上存在时才会装配Bean。
- @ConditionalOnMissingBean:只有在指定的Bean不存在时才会装配Bean。
- @ConditionalOnProperty:只有在指定的属性存在并具有特定值时才会装配Bean。
三、组件扫描与Bean注册
- 组件扫描:
- 通过@ComponentScan注解启用组件扫描。
- Spring会扫描指定包及其子包中的所有组件(带有@Component、@Service、@Repository、@Controller等注解的类),并将它们注册为Spring Bean。
- Bean注册:
- 在自动配置过程中,Spring Boot会根据检测到的依赖和条件注解来判断是否需要创建和注册Bean。
- 如果满足条件,Spring Boot会创建对应的Bean,并将其注册到Spring应用程序上下文中,以供应用程序使用。
四、自定义自动配置
除了使用Spring Boot提供的自动配置外,开发者还可以自定义自己的自动配置:
- 创建一个配置类,并在类上添加@Configuration和@EnableConfigurationProperties注解。
- 在配置类中使用条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)指定自动配置的条件。
- 使用@ConfigurationProperties注解创建配置属性类,并在配置类中注入该属性类。
- 编写需要自动配置的Bean,并使用@Bean注解将Bean注册到容器中。
综上所述,Spring Boot通过核心注解、spring.factories文件、自动配置类、组件扫描与Bean注册以及自定义自动配置等机制和步骤实现了bean的自动装配。这使得开发者可以更加便捷地集成第三方组件和库,并在应用程序中使用它们,而无需手动配置大量的XML文件或Java配置类。
注入
注入是指将依赖对象(Bean)的引用或数值注入到目标对象(Bean)中的过程。Spring支持多种注入方式,包括构造器注入、Setter方法注入和字段注入。
- 构造器注入(Constructor Injection):
- 通过构造方法将依赖对象注入到目标对象中。
- 实现方式:在目标对象的构造方法中声明参数,Spring容器负责将依赖对象的实例传递给构造方法。
- 优点:确保依赖对象在目标对象创建时即被注入,避免了后续注入可能带来的不确定性。
- Setter方法注入(Setter Injection):
- 通过Setter方法将依赖对象注入到目标对象中。
- 实现方式:在目标对象中提供一个Setter方法,Spring容器负责调用该方法并传递依赖对象的实例。
- 优点:灵活性高,可以在目标对象创建后再进行依赖注入。
- 字段注入(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初始化
- Aware接口回调:
- 如果Bean实现了xxxAware接口(如BeanNameAware、BeanFactoryAware等),Spring容器会在Bean初始化前后调用相应的set方法,将相关的Aware实例注入给Bean。
- BeanPostProcessor前置处理:
- 在Bean初始化之前,Spring容器会调用实现了BeanPostProcessor接口的类的postProcessBeforeInitialization方法,对Bean进行前置处理。
- 初始化Bean:
- 如果Bean实现了InitializingBean接口,Spring容器会调用其afterPropertiesSet方法进行初始化。
- 或者,如果Bean在配置中指定了init-method属性,Spring容器会调用该属性指定的方法进行初始化。
- 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/