基于 Java 的容器配置 (Java-based Container Configuration)
本节介绍如何通过 Java 代码中的注解来配置 Spring 容器。
章节摘要
- 核心概念:@Bean 和 @Configuration
- 使用 AnnotationConfigApplicationContext 实例化 Spring 容器
- 使用 @Bean 注解
- 使用 @Configuration 注解
- 组合基于 Java 的配置
- 编程式 Bean 注册
补充教学 —— 为什么选择基于 Java 的配置?
在 Spring 的发展史上,配置方式经历从 XML 到 注解(Annotation-based) 再到 基于 Java(Java-based) 的演变。
1. 三种配置方式的区别
- XML (遗留模式):配置与代码完全分离。虽然清晰,但在大型项目中 XML 文件会变得异常庞大且难以维护。
- 基于注解 (侵入模式):如
@Component、@Autowired。配置就在类定义的上方。优点是开发极快,缺点是配置散落在各个类中,且无法给第三方库的类加注解。 - 基于 Java (现代模式):通过
@Configuration类和@Bean方法。它融合了前两者的优点:配置集中在一个或几个类中,同时又能利用 Java 编译期的类型检查和重构支持。
2. 基于 Java 配置的核心价值
- 类型安全:你不再需要写
class="com.example.Service"这种字符串,而是直接new Service()。如果类名改了,编译器会报错,而不是等程序运行时才抛出ClassNotFoundException。 - 逻辑灵活:由于配置本身就是普通的 Java 代码,你可以在
@Bean方法里写if-else、调用其他方法、读取系统环境。这在 XML 中几乎是不可能完成的任务(或者需要写极其复杂的 SpEL)。 - 三方库集成:当你无法修改第三方 JAR 包里的源代码时(因此没法加
@Component),使用基于 Java 的配置是将其纳入 Spring 容器的唯一优雅手段。
3. “配置类”本身也是一个 Bean 这是初学者常忽略的一点。标注了 @Configuration 的类本身也会被 Spring 扫描并作为一个单例 Bean 放入容器。因此,你可以在配置类里使用 @Autowired 注入其他依赖。
4. 总结:该选哪种? 在现代 Spring Boot 开发中,“基于 Java 的配置” + “基于注解的组件扫描” 是官方推荐的黄金组合。你通常使用扫描来处理自己写的业务代码,而使用配置类来集成第三方库或进行精细化的自定义设置。