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

【譯文】Spring 4 組件掃描與自動裝配:@ComponentScan 實現零配置 Bean 發現

     編輯:Java 綜合教學

【譯文】Spring 4 組件掃描與自動裝配:@ComponentScan 實現零配置 Bean 發現

承接上篇 Hello World,本文展示 Spring 如何通過 @ComponentScan 實現 Bean 自動發現、自動裝配,完全擺脫 XML 與 @Bean 手動聲明。

技術棧升級

  • Spring 4.0.6.RELEASE
  • Joda-Time 2.3 (日期處理)
  • Maven 3 / JDK 1.6 / Eclipse Juno

分層架構示例

com.websystique.spring
├── configuration/AppConfig.java      # 掃描配置
├── dao/EmployeeDao.java              # 持久層介面
├── dao/EmployeeDaoImpl.java          # @Repository
├── service/DateService.java          # 業務介面
├── service/DateServiceImpl.java      # @Service
├── service/EmployeeService.java      # 核心業務介面
├── service/EmployeeServiceImpl.java  # @Service + @Autowired
├── model/Employee.java               # 實體
└── AppMain.java                      # 啟動

核心配置類:掃描啟動器

@Configuration
@ComponentScan(basePackages = "com.websystique.spring")
public class AppConfig {
    // 空類體!所有 Bean 由掃描自動發現
}

@ComponentScan 掃描基礎包下所有類,識別標註刻板印象註解的類作為 Bean:

註解語義層級說明
@Repository持久層 (DAO)自動轉換持久化異常
@Service業務層標識業務邏輯組件
@Controller表現層 (MVC)Web 請求處理
@Component通用組件上述三者的父註解,泛用
@Configuration配置類內部亦含 @Component

最佳實踐: 嚴格按層級使用對應註解,而非濫用 @Component,利於架構治理與 AOP 切點精準匹配。

等效 XML 配置

<beans xmlns:context="https://www.springframework.org/schema/context" ...>
  <context:component-scan base-package="com.websystique.spring" />
</beans>

DAO 層實現

@Repository("employeeDao")
public class EmployeeDaoImpl implements EmployeeDao {
    public void saveInDatabase(Employee employee) {
        System.out.println("Employee " + employee.getName() + 
            " registered for assessment on " + employee.getAssessmentDate());
    }
}

Service 層與依賴注入

@Service("dateService")
public class DateServiceImpl implements DateService {
    public LocalDate getNextAssessmentDate() {
        return new LocalDate(2015, 10, 10);
    }
}

@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired private DateService dateService;
    @Autowired private EmployeeDao employeeDao;

    public void registerEmployee(Employee employee) {
        employee.setAssessmentDate(dateService.getNextAssessmentDate());
        employeeDao.saveInDatabase(employee);
    }
}

@Autowired 按類型自動裝配。因掃描已註冊 dateService、employeeDao Bean,容器能精準注入。

啟動方式三選一

方式 1:配置類啟動 (推薦)

AbstractApplicationContext context = 
    new AnnotationConfigApplicationContext(AppConfig.class);

方式 2:無配置類,純掃描啟動

AnnotationConfigApplicationContext context = 
    new AnnotationConfigApplicationContext();
context.scan("com.websystique.spring");  // 程式化掃描
context.refresh();                      // 必須刷新完成註冊
EmployeeService service = context.getBean("employeeService", EmployeeService.class);

方式 3:XML 配置啟動

AbstractApplicationContext context = 
    new ClassPathXmlApplicationContext("app-config.xml");

執行輸出

Employee Danny Theys is registered for assessment on 2016-12-22

核心機制總結

  1. @ComponentScan 掃描類路徑,識別刻板印象註解。
  2. 為每個匹配類創建 BeanDefinition,註冊到 BeanFactory。
  3. @Autowired 注入點在 Bean 初始化階段按類型/名稱解析依賴。
  4. AnnotationConfigApplicationContext 整合掃描、註冊、刷新、生命週期管理。

下一步預告

後續將探討:Bean 作用域、生命週期回調、@Primary/@Qualifier 解決多候選衝突、條件裝配 (@Conditional)。

原文與源碼

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