首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring JavaConfig 核心原理與配置映射:從 XML 到純 Java 配置的演進

     編輯:Java 相關知識

Spring JavaConfig(@Configuration + @Bean)將 Bean 定義從 XML 遷移到類型安全的 Java 代碼,是 Spring Boot 自動配置的基石。本文系統對比 XML 與 JavaConfig 映射關係,解析核心註解用法。

配置方式演進

時代配置形式特點
Spring 1.xXML (<beans>)聲明式、與代碼分離、編輯器支持弱
Spring 2.5+注解 (@Component 等)掃描自動註冊、侵入業務代碼
Spring 3.0+JavaConfig (@Configuration)類型安全、重構友好、程序化控制
Spring Boot自動配置 + 條件裝配約定大於配置、零 XML

核心映射對照表

1. 配置類入口

// XML
<beans xmlns="..." xmlns:context="...">
    <context:component-scan base-package="..."/>
</beans>

// JavaConfig
@Configuration
@ComponentScan(basePackages = "com.example") // 等價 component-scan
public class AppConfig { }

2. Bean 定義

// 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();
    }
}

3. 依賴注入

// XML: 
// JavaConfig: 方法調用 userDao()
// Spring 保證 @Bean 方法單例語義,多次調用返回同一實例

4. 掃描註冊

// XML: 
// JavaConfig: @ComponentScan(basePackages = "...")
// Spring Boot: @SpringBootApplication 內含 @ComponentScan

進階特性

@Bean 參數注入

@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;
}

@Primary / @Qualifier 解決多候選

@Bean @Primary
public DataSource primaryDs() { return new HikariDataSource(); }

@Bean
public DataSource secondaryDs() { return new HikariDataSource(); }

// 注入時 @Qualifier("secondaryDs") 指定

@Conditional 條件裝配(Spring Boot 基石)

@Bean
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(prefix = "spring.datasource", name = "url")
public DataSource dataSource() { ... }

@Import 組合配置

@Configuration
@Import({WebConfig.class, SecurityConfig.class, DataConfig.class})
public class AppConfig { }

JavaConfig 優勢

  • 類型安全:重構重命名 Bean 方法,調用處編譯報錯
  • IDE 支持:跳轉定義、查找引用、重構無障礙
  • 程序化控制:條件判斷、循環註冊、動態決定實現類
  • 測試友好:@TestConfiguration 覆蓋特定 Bean
  • 無 XML 解析開銷:啟動略快

注意事項

  • @Configuration 類最終被 CGLIB 代理,@Bean 方法不能是 private/final
  • 輕量級模式:不加 @Configuration 直接用 @Bean(@Component 類中),不會代理,多次調用產生多實例
  • 循環依賴:構造器注入報錯,Setter/字段注入配合 @Lazy 可解決

總結

JavaConfig 將配置變為代碼,賦予開發者完整的程序控制權。Spring Boot 以此為基礎構建了強大的自動配置體系。掌握 @Configuration/@Bean/@ComponentScan/@Conditional 核心註解,能深度理解 Spring 容器啟動過程,在自定義 Starter、覆蓋自動配置、排查 Bean 註冊失效等場景遊刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved