• zxb的博客
    • 运维
      • 🧊即插即更:移动硬盘与 U 盘的自动同步方案
      • ⛳FRP穿透个人博客——SSL安全篇
      • 📄Github Action自动化部署Vue3项目
      • 🎲Docker Desktop 代理配置:让镜像拉取更稳更快
      • 🤓FRP穿透搭建个人博客(白嫖SSL版)
      • 🪁FRP穿透搭建个人博客
      • 📄Kubeeasy安装K8s集群(附独家报错解决)
      • 📄不用 Kubernetes,Docker Compose 也能实现零停机蓝绿发布
    • 技术体验
      • 🛡️别再找插件了,美团出品的Tabbit才是真正的AI浏览器
      • 💧GitHub 霸榜!Tabbit平替:给浏览器装上“最强大脑”,这才是真·AI 浏览器插件
    • 自制软件插件
      • 🧋🧧 仪式感拉满!这款开源“年味”小游戏,带你瞬间找回童年快乐!
      • 🕸️摸鱼神器——摸了吗
      • 🔍🚀 思源笔记 S3 插件 v1.0.2 更新:手把手教你配置 PicList 导出
      • 🌊🚀 思源笔记 S3 插件 v1.0.3 更新:一键解锁 BM.md 精美排版!
      • 🥔AE机器人大模型案例
      • Claude Code 终于会"叫"了 —— 一个 10MB 小工具,让 AI 跑完任务发个声
    • 开发小技巧
      • 🪴【保姆级】NAS 骚操作:白嫖百 T 网盘做图床!阿里云/百度秒变“私有云相册”,快到飞起!
    • 后端技术
      • 🚁解决 Spring Session 分布式部署难题:Redis 集成指南
      • 📄使用ThreadLocal实现用户身份认证
      • SpringAI
        • 别再手写 HTTP 客户端调 AI 了!Spring AI 官方出手,一行代码搞定多模型切换
      • 📄使用注解+反射实现自动填充
      • Spring
        • 🔁循环依赖:一个Spring经典坑
        • Spring如何解决依赖循环
        • 🫛什么是Spring Bean
      • Java基础
        • 什么是序列化和反序列化?
        • 📄Java中HashMap的原理
      • 📄分布式系统中的"保险箱":事务Outbox模式深度解析
    • 📑前端技术
      • 🫚axios工具类
      • 🍛Vite项目屏幕适配的两种方案,超详细
      • 📕vue-router小技巧:通过route传参动态设置页面
      • 📄Next.js 中 NEXT_PUBLIC_ 环境变量为何修改后不生效
    • 疑难杂症
      • 🕙SpringWeb报错——CORS问题解决
      • 📄一行 JVM 参数解决 HttpClient 卡死:强制 Java 禁用 IPv6
      • 📄修复github action注入npm包权限问题
zxb的博客后端技术Spring

什么是Spring Bean

访问次数 2654 次创建时间 2026-03-27 11:08

由Spring全权管理的“对象”容器

普通的对象:自己new自己管理

Spring Bean 的两种常见定义方式

一、组件扫描(Component Scanning)

通过注解 + 自动扫描的方式,让 Spring 自动发现并注册 Bean。

核心注解

注解 语义 典型场景
@Component 通用组件 工具类、通用服务
@Service 业务逻辑层 Service 层
@Repository 数据访问层 DAO / Mapper 层
@Controller​ / @RestController 控制器层 Web 接口层

示例

// 1. 标注注解 → 声明"我是一个 Bean"
@Service
public class UserService {

    public User findById(Long id) {
        // ...
    }
}

// 2. 配置扫描路径(Spring Boot 自动处理)
@SpringBootApplication  // 内含 @ComponentScan
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

工作流程

Spring 启动
    │
    ▼
扫描指定包路径下所有类
    │
    ▼
发现 @Component / @Service / @Repository / @Controller
    │
    ▼
自动创建实例并注册到 IoC 容器
    │
    ▼
Bean 可用,支持 @Autowired 注入

二、配置类(Java Config / @Bean)

通过 @Configuration​ + @Bean​ 手动声明 Bean 的创建逻辑。

示例

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setUrl("jdbc:mysql://localhost:3306/mydb");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    // 方法名就是 Bean 的名称,也可以自定义
    @Bean("myCache")
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("users");
    }
}

工作流程

Spring 启动
    │
    ▼
发现 @Configuration 类
    │
    ▼
执行所有 @Bean 方法
    │
    ▼
将返回对象注册到 IoC 容器
    │
    ▼
Bean 可用,支持 @Autowired 注入

三、核心对比

┌──────────────┬─────────────────────┬──────────────────────┐
│     维度      │   组件扫描            │   配置类 @Bean         │
├──────────────┼─────────────────────┼──────────────────────┤
│  控制粒度     │  低,自动发现          │  高,精确控制           │
│  适用对象     │  自己写的类            │  第三方库的类           │
│  创建逻辑     │  默认构造函数          │  完全自定义             │
│  代码侵入性   │  需要加注解            │  无侵入,类不用改动       │
│  集中管理     │  分散在各类中          │  集中在一个配置类         │
│  条件装配     │  @Conditional 系列    │  同样支持,更灵活         │
└──────────────┴─────────────────────┴──────────────────────┘

四、典型应用场景

✅ 用组件扫描的场景

// 自己写的业务代码,直接加注解即可
@Repository
public class UserDao {
    public User find(Long id) { ... }
}

@Service
public class UserService {
    @Autowired
    private UserDao userDao;  // 自动注入
}

✅ 用 @Bean 的场景

@Configuration
public class ThirdPartyConfig {

    // 第三方库的类,你无法在源码上加 @Component
    @Bean
    public ModelMapper modelMapper() {
        ModelMapper mapper = new ModelMapper();
        mapper.getConfiguration()
              .setMatchingStrategy(MatchingStrategies.STRICT);
        return mapper;
    }

    // 需要复杂初始化逻辑的 Bean
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper om = new ObjectMapper();
        om.registerModule(new JavaTimeModule());
        om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        om.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return om;
    }
}

五、总结一句话

  • 自己写的类 → 加 @Component​ 系列注解,走组件扫描,简单省事
  • 第三方类 / 需要复杂初始化 → 用 @Configuration​ + @Bean​,走配置类,灵活可控

两者并不冲突,实际项目中通常是混合使用的。

‍

评论

0 条评论

暂无评论,欢迎第一个留言。

验证码
回复评论
验证码
举报内容
验证码
由 b8l8u8e8 提供支持