Spring Bean
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 | @Configuration |
四、@Import 注解
- 标注在类上
- 导入的类会被注册为 Bean
用法:
- 直接导入普通类
1 | @Import(UserService.class) |
- ImportSelector
- 实现
ImportSelector接口 - 重写
selectImports()返回类的全限定名数组 - 支持批量注入 Bean
- ImportBeanDefinitionRegistrar
- 实现
ImportBeanDefinitionRegistrar接口 - 手动操作
BeanDefinitionRegistry注册 Bean - 适用于动态或复杂场景
Bean 的实例化方式
一、无参构造函数(默认方式)
- 如果类有无参构造函数,Spring 会优先使用它
- 如果类只有一个有参构造函数,Spring 会尝试自动装配参数
- 如果有多个有参构造函数且没有无参构造函数,会报错
二、实例工厂方法(配合 @Bean)
- 在配置类里写工厂方法
- 可以自由选择构造函数
- 支持依赖注入
1 | @Configuration |
三、FactoryBean(特殊 Bean)
FactoryBean是一个接口- 实现它的类本身就是“工厂”,用来生产 Bean
- 必须实现:
getObject():返回真正的 BeangetObjectType():返回 Bean 类型信息
特点:
- 容器中通过名字获取时拿到的是
getObject()返回的对象 - 想获取工厂本身,需要名字前加
&
小结
- BeanDefinition 是蓝图,描述 Bean 的信息
- Bean 是实例,由容器管理
- 定义 Bean 的方式:XML、注解、JavaConfig、@Import
- 实例化 Bean 的方式:构造器、工厂方法、FactoryBean
- 自动扫描 Bean:通过
@ComponentScan或 Spring Boot 默认扫描
| 注册方式 | 是否需要类注解 | 实例化方式 | 适用场景 |
|---|---|---|---|
| XML 配置 | 不需要 | 构造器 / 工厂方法 | 老项目或第三方系统,配置明确可控 |
| 注解 + @ComponentScan | 需要 | 构造器 / 工厂方法 | Spring Boot 自动扫描,省去手动注册 |
| @Bean 方法 | 不需要 | 工厂方法 / 构造器 | 第三方类或需要自定义初始化逻辑 |
| @Import 注解 | 不需要 | 构造器 / 工厂方法 | 动态或批量注册 Bean,注册第三方类或复杂场景 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Emqo的个人博客!
评论