配置方式演进:XML→注解→JavaConfig
结论先行:Spring 的配置方式经历了三代:XML(全量描述 Bean)→ 注解(@Component 系列标记 + @Autowired 装配)→ JavaConfig(@Configuration + @Bean,类型安全)。三者可混用互操作,演进本质是把"字符串化、难重构、无编译检查"的 XML 换成"类型安全、可重构、可调试"的 Java 代码。现代 Spring Boot 默认就是 JavaConfig + 注解扫描。
一、三代配置对比
| 时代 | 方式 | 代表写法 | 特点 |
|---|---|---|---|
| 1.x 起 | XML | <bean id="ds" class="..."/>、<property/>、<constructor-arg/> | 全部集中声明;字符串无类型检查,重构困难 |
| 2.5~3.0 | 注解 | @Component/@Service/@Repository + @Autowired/@Value | 需开启组件扫描;业务类免写 XML |
| 3.0 起 | JavaConfig | @Configuration 类 + @Bean 方法 | 类型安全、可断点;适合装配第三方类与条件逻辑 |
- 桥接手段:@ImportResource 把老 XML 引入 JavaConfig;@Import 引入其它配置类;XML 里也可以用 <context:component-scan> 混用注解。
二、三种写法对照(同一数据源对象)
// 1) XML 时代
// <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
// <property name="url" value="${db.url}"/></bean>
// 2) 注解时代:自己写的组件
@Component
public class RedisClient {
@Value("${redis.host}")
private String host;
}
// 3) JavaConfig:装配第三方类 / 复杂初始化(类型安全、方法可复用)
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource(@Value("${db.url}") String url) {
return new DriverManagerDataSource(url); // 方法返回值类型受编译检查
}
}
常见追问 / 记忆点
- 追问 1:@Component 与 @Bean 区别?答:@Component 标在类上、配合组件扫描、用于自己写的类;@Bean 标在 @Configuration 类的方法上、返回对象交给容器、用于第三方类或需要复杂初始化逻辑的场景,方法名即 bean 名。
- 追问 2:现在还写 XML 吗?答:老系统迁移保留(@ImportResource),新项目几乎全部注解 + JavaConfig。
- 记忆点:"XML 管一切 → 注解扫自己 → JavaConfig 管第三方与复杂装配",演进方向是类型安全与少样板。