Spring JavaConfig(@Configuration + @Bean)將 Bean 定義從 XML 遷移到類型安全的 Java 代碼,是 Spring Boot 自動配置的基石。本文系統對比 XML 與 JavaConfig 映射關係,解析核心註解用法。
| 時代 | 配置形式 | 特點 |
|---|---|---|
| Spring 1.x | XML (<beans>) | 聲明式、與代碼分離、編輯器支持弱 |
| Spring 2.5+ | 注解 (@Component 等) | 掃描自動註冊、侵入業務代碼 |
| Spring 3.0+ | JavaConfig (@Configuration) | 類型安全、重構友好、程序化控制 |
| Spring Boot | 自動配置 + 條件裝配 | 約定大於配置、零 XML |
// XML
<beans xmlns="..." xmlns:context="...">
<context:component-scan base-package="..."/>
</beans>
// JavaConfig
@Configuration
@ComponentScan(basePackages = "com.example") // 等價 component-scan
public class AppConfig { }
// XML
<bean id="userService" class="com.example.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
// JavaConfig
@Configuration
public class AppConfig {
@Bean // 方法名默認為 bean id
public UserService userService() {
return new UserServiceImpl(userDao()); // 直接調用其他 @Bean 方法
}
@Bean
public UserDao userDao() {
return new UserDaoImpl();
}
}
// XML:
// JavaConfig: 方法調用 userDao()
// Spring 保證 @Bean 方法單例語義,多次調用返回同一實例
// XML:
// JavaConfig: @ComponentScan(basePackages = "...")
// Spring Boot: @SpringBootApplication 內含 @ComponentScan
@Bean
public DataSource dataSource(@Value("${db.url}") String url,
@Value("${db.user}") String user,
@Value("${db.pwd}") String pwd) {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(url); ds.setUsername(user); ds.setPassword(pwd);
return ds;
}
@Bean @Primary
public DataSource primaryDs() { return new HikariDataSource(); }
@Bean
public DataSource secondaryDs() { return new HikariDataSource(); }
// 注入時 @Qualifier("secondaryDs") 指定
@Bean
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(prefix = "spring.datasource", name = "url")
public DataSource dataSource() { ... }
@Configuration
@Import({WebConfig.class, SecurityConfig.class, DataConfig.class})
public class AppConfig { }
@TestConfiguration 覆蓋特定 Bean@Configuration 類最終被 CGLIB 代理,@Bean 方法不能是 private/final@Configuration 直接用 @Bean(@Component 類中),不會代理,多次調用產生多實例@Lazy 可解決JavaConfig 將配置變為代碼,賦予開發者完整的程序控制權。Spring Boot 以此為基礎構建了強大的自動配置體系。掌握 @Configuration/@Bean/@ComponentScan/@Conditional 核心註解,能深度理解 Spring 容器啟動過程,在自定義 Starter、覆蓋自動配置、排查 Bean 註冊失效等場景遊刃有餘。