配置方式演进: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 管第三方与复杂装配",演进方向是类型安全与少样板。
笔记加载中…