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

Spring 實戰(八):註解驅動開發——@Component 掃描、@Controller/@Service/@Repository 分層標識與 @Resource 注入

     編輯:Java 綜合教學

Spring 實戰(八):註解驅動開發——@Component 掃描、@Controller/@Service/@Repository 分層標識與 @Resource 注入

從 XML 走向註解,是 Spring 簡化配置、提升開發效率的關鍵里程碑。本文以 MVC 三層架構為例,展示如何使用掃描註解(``)自動發現 Bean、分層語義註解(`@Controller`/`@Service`/`@Repository`)替代 XML ``、以及JSR-250 `@Resource`實現依賴注入,構建零 XML 配置(除掃描啟動)的現代化 Spring 應用。

一、啟用註解掃描:一行 XML 替代百行 Bean 定義

<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="https://www.springframework.org/schema/context"
       xsi:schemaLocation="...>

    <!-- 掃描基礎包及子包下所有類,自動註冊帶有 @Component 衍生註解的類為 Bean -->
    <context:component-scan base-package="com.lee.spring012.scan.mvc.annotation"/>

</beans>

掃描機制:容器啟動時遞迴掃描 `base-package` 下所有 `.class` 檔案,檢測類上是否標註 `@Component`、`@Controller`、`@Service`、`@Repository`、`@Configuration` 等,若有則自動註冊為 Bean,Bean 名稱預設為類名首字母小寫(如 `PersonAction` → `personAction`)。

二、分層語義註解:比 @Component 更有意圖

註解目標層語義額外功能
@Controller表現層接收請求、返回視圖/JSONSpring MVC 請求映射支援
@Service業務層核心業務邏輯、事務邊界@Transactional 隱含支援
@Repository資料層DAO、資料庫操作自動將 JDBC/Hibernate 異常轉為 Spring DataAccessException
@Component通用不屬於上述三層的元件基礎掃描標識

四者本質上都是 `@Component` 的特化,使用語義註解能讓架構意圖一目了然,並啟用層專屬功能。

三、@Resource 注入:JSR-250 標準,按名稱匹配

// Action 層
@Controller
@Scope("prototype") // Action 多例,避免狀態共享
public class PersonAction {
    @Resource // 預設按名稱注入:尋找名為 "stuServiceImpl" 的 Bean
    public IStuService stuServiceImpl;
    
    public void displaySave() {
        System.out.println("mvc action: saving stu...");
        stuServiceImpl.saveStu();
    }
}

// Service 層
@Service
public class StuServiceImpl implements IStuService {
    @Resource
    public IStuDAO stuDAOImpl;
    
    @Override
    public void saveStu() {
        System.out.println("mvc service: saving stu...");
        stuDAOImpl.saveStu();
    }
}

// DAO 層
@Repository
public class StuDAOImpl implements IStuDAO {
    @Override
    public void saveStu() {
        System.out.println("mvc dao: saving stu...");
    }
}

@Resource vs @Autowired 關鍵差異:

  • `@Resource`:按名稱匹配(`name` 屬性或欄位名),找不到拋異常。JSR-250 標準,非 Spring 專屬。
  • `@Autowired`:按類型匹配,多候選時需配合 `@Qualifier("name")` 指定名稱。Spring 專屬,功能更豐富(`required=false`、建構子/方法/欄位通用)。
  • 建議:現代 Spring 偏好 `@Autowired` + 建構子注入(強制依賴、不可變、易測試),`@Resource` 適用於遷移舊代碼或需明確名稱綁定場景。

四、@Scope("prototype"):Action 多例的必要性

Spring Bean 預設為單例。Controller/Action 處理請求時若有實例變數(如表單綁定物件),單例會導致併發下狀態汙染。標註 `@Scope("prototype")` 確保每次 `getBean`/注入都創建新實例。

五、單元測試驗證

@Test
public void testPersonAction() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-scan-mvc.xml");
    PersonAction person = (PersonAction) context.getBean("personAction"); // 預設名稱 personAction
    person.displaySave();
}

輸出

mvc action: saving stu...
mvc service: saving stu...
mvc dao: saving stu...

六、進階:完全無 XML(Spring 3.0+ @Configuration)

@Configuration
@ComponentScan("com.lee.spring012.scan.mvc.annotation")
public class AppConfig {
    // 無需任何 XML,main 方法直接啟動:
    // new AnnotationConfigApplicationContext(AppConfig.class);
}

七、原始碼獲取

https://github.com/leechenxiang/maven-spring001-helloworld

結語

註解驅動開發將 Bean 定義從 XML 釋放,回到 Java 類內部,實現配置與代碼共生。掌握 `` 掃描機制、分層語義註解選型、@Resource/@Autowired 注入策略、@Scope 生命週期控制,是邁向 Spring 現代化開發的核心技能。下一步將探討AOP 註解(@Aspect/@Before/@After...)與聲明式事務(@Transactional),進一步消除樣板代碼。

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