Spring Boot Bean 笔记

Bean 的定义方式

Bean 本质上就是被 Spring 容器管理的对象。常见定义方式有:

一、XML 配置

1
<bean class="com.example.UserService"/>
  • 容器启动时读取 XML 文件,将 `` 对应的类实例化为 Bean
  • 支持属性注入和构造器注入
  • 优点:明确可控;缺点:配置繁琐,可维护性差

二、注解方式

  • @Component:通用注解
  • 语义化注解:
    • @Service:标注 Service 层
    • @Repository:标注 Dao 层
    • @Controller / @RestController:标注 Web 层
  • @Configuration:标注配置类,可定义 @Bean 方法

自动扫描 Bean

1
@ComponentScan("com.xs")
  • 扫描指定包及其子包下的组件类,将标注了组件注解的类自动注册为 Bean
  • Spring Boot 项目中,如果启动类在根包下,默认会扫描启动类所在包及子包,无需显式写 @ComponentScan
  • @Bean 手动注册方式可以共存

三、@Bean 注解方式

  • 标注在方法上
  • 必须写在 @Configuration 配置类里

特点:

  • 一个 @Bean 方法调用另一个 @Bean 方法时,Spring 会从容器中获取,而不是重新 new
  • 可以干预第三方类,把外部类手动注册为 Bean
  • 方法参数会自动装配其他 Bean

示例:

1
2
3
4
5
6
7
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService("custom");
}
}

四、@Import 注解

  • 标注在类上
  • 导入的类会被注册为 Bean

用法:

  1. 直接导入普通类
1
@Import(UserService.class)
  1. ImportSelector
  • 实现 ImportSelector 接口
  • 重写 selectImports() 返回类的全限定名数组
  • 支持批量注入 Bean
  1. ImportBeanDefinitionRegistrar
  • 实现 ImportBeanDefinitionRegistrar 接口
  • 手动操作 BeanDefinitionRegistry 注册 Bean
  • 适用于动态或复杂场景

Bean 的实例化方式

一、无参构造函数(默认方式)

  • 如果类有无参构造函数,Spring 会优先使用它
  • 如果类只有一个有参构造函数,Spring 会尝试自动装配参数
  • 如果有多个有参构造函数且没有无参构造函数,会报错

二、实例工厂方法(配合 @Bean)

  • 在配置类里写工厂方法
  • 可以自由选择构造函数
  • 支持依赖注入
1
2
3
4
5
6
7
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService("custom");
}
}

三、FactoryBean(特殊 Bean)

  • FactoryBean 是一个接口
  • 实现它的类本身就是“工厂”,用来生产 Bean
  • 必须实现:
    • getObject():返回真正的 Bean
    • getObjectType():返回 Bean 类型信息

特点:

  • 容器中通过名字获取时拿到的是 getObject() 返回的对象
  • 想获取工厂本身,需要名字前加 &

小结

  • BeanDefinition 是蓝图,描述 Bean 的信息
  • Bean 是实例,由容器管理
  • 定义 Bean 的方式:XML、注解、JavaConfig、@Import
  • 实例化 Bean 的方式:构造器、工厂方法、FactoryBean
  • 自动扫描 Bean:通过 @ComponentScan 或 Spring Boot 默认扫描
注册方式是否需要类注解实例化方式适用场景
XML 配置不需要构造器 / 工厂方法老项目或第三方系统,配置明确可控
注解 + @ComponentScan需要构造器 / 工厂方法Spring Boot 自动扫描,省去手动注册
@Bean 方法不需要工厂方法 / 构造器第三方类或需要自定义初始化逻辑
@Import 注解不需要构造器 / 工厂方法动态或批量注册 Bean,注册第三方类或复杂场景