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

Spring 配置兩大方式深度解析:Java Config 與註解驅動

     編輯:Java 相關知識

自 Spring 3.0 起,框架全面推廣「無 XML」配置風格,主要分為基於 Java 的配置與基於註解的組件掃描兩大流派。本文深入對比兩者的核心註解、適用場景、優缺點與最佳實踐,幫助開發者在專案中做出合理的架構選型。

一、核心註解對照表

分類註解作用等價 XML
註解驅動
(組件掃描)
@Component通用組件標識<bean>
@Service業務邏輯層<bean>
@Repository資料存取層(含異常轉換)<bean>
@Controller控制層<bean>
Java Config
(程式化配置)
@Configuration聲明配置類(相當於 spring.xml)<beans>
@Bean方法返回值註冊為 Bean<bean id="..." class="..."/>
@ComponentScan啟用組件掃描(可配合註解驅動)<context:component-scan/>

二、註解驅動模式:約定優於配置

代碼範例

package di;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service  // 1. 標識為 Spring Bean
public class UseFunctionService {
    
    @Autowired  // 2. 自動注入依賴
    private FunctionService functionService;

    public String sayHello(String word) {
        return functionService.toHello(word);
    }
}

啟用掃描

@Configuration
@ComponentScan("di")  // 掃描 di 包下所有 @Component 衍生註解
public class AppConfig { }

特點

  • 侵入性強:業務類需加註解,耦合 Spring API。
  • 開發效率高:新建類加註解即可,無需修改配置類。
  • 適合業務邏輯層:Service、Repository、Controller 等大量同質 Bean。

三、Java Config 模式:集中式聲明式配置

代碼範例

package javaconfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration  // 1. 標識為配置類
public class JavaConfig {
    
    @Bean  // 2. 方法返回值註冊為 Bean,id 默認為方法名
    public UseFunctionService useFunctionService() {
        return new UseFunctionService();  // 手動 new,可控制構造邏輯
    }
    
    @Bean
    public FunctionService functionService() {
        return new FunctionServiceImpl();
    }
}

特點

  • 非侵入性:業務類無 Spring 註解,純 POJO,易於單元測試、移植。
  • 集中管理:所有 Bean 定義在配置類中,依賴關係一目瞭然。
  • 程式化能力強:可在 `@Bean` 方法中寫邏輯(條件裝配、環境判斷、第三方庫整合)。
  • 適合基礎設施層:DataSource、TransactionManager、RedisTemplate、第三方 Client 等。

四、兩大模式深度對比

維度註解驅動 (@ComponentScan)Java Config (@Configuration + @Bean)
Bean 定義位置分散在各業務類上集中在配置類方法中
業務類耦合度強(依賴 Spring 註解)零(純 POJO)
第三方庫整合困難(無法修改源碼加註解)極佳(寫 @Bean 方法包裝)
條件裝配需配合 @Conditional 於類上靈活(方法內任意邏輯判斷)
依賴關係可視化較差(需 IDE 支援)優秀(配置類即文檔)
啟動掃描開銷類路徑掃描較慢無掃描,啟動更快

五、最佳實踐:分層混合策略

業界公認的 Spring 專案結構建議:

  1. 基礎設施層(Config 包):使用 Java Config。
    數據源、事務管理器、MVC 配置、安全配置、第三方 Client(Redis、MQ、HTTP Client)等。
    @Configuration
    @EnableTransactionManagement
    public class DataConfig {
        @Bean
        public DataSource dataSource() { ... }
        
        @Bean
        public PlatformTransactionManager txManager() { ... }
    }
  2. 業務邏輯層:使用 註解驅動。
    Service、Repository、Controller、Component 等自定義業務組件。
    @Service
    public class OrderService {
        @Autowired private OrderRepository repo;
        @Autowired private PaymentClient payClient;
        // 業務邏輯...
    }
  3. 主配置類組合:
    @Configuration
    @ComponentScan(basePackages = "com.myapp.service, com.myapp.repository, com.myapp.controller")
    @Import({DataConfig.class, WebConfig.class, SecurityConfig.class})
    public class ApplicationConfig { }

六、進階技巧

1. @Bean 方法參數自動注入

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
    // dataSource 由容器自動注入
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
    emf.setDataSource(dataSource);
    return emf;
}

2. @Conditional 條件裝配

@Bean
@ConditionalOnProperty(name = "cache.type", havingValue = "redis")
public CacheManager redisCacheManager(RedisConnectionFactory factory) {
    return new RedisCacheManager(factory);
}

@Bean
@ConditionalOnMissingBean(CacheManager.class)
public CacheManager simpleCacheManager() {
    return new SimpleCacheManager();
}

3. @Configuration(proxyBeanMethods = false) 輕量模式

Spring 5.2+ 支援,關閉 CGLIB 代理,提升啟動速度,適用於不需 `@Bean` 方法互調的配置類。

七、總結

Spring 配置沒有絕對優劣,關鍵在於分層選型:

  • Java Config 統籌全局基礎設施、第三方整合、條件裝配,提供清晰的架構藍圖。
  • 註解驅動 加速業務組件開發,降低樣板代碼。
  • 兩者透過 @Import、@ComponentScan 無縫協作,構建出既靈活又治理良好的 Spring 應用。

現代 Spring Boot 專案更進一步:@SpringBootApplication 組合了 `@Configuration` + `@EnableAutoConfiguration` + `@ComponentScan`,將上述最佳實踐內化為預設約定,開發者只需專注於業務邏輯與少量自定義配置。

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