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

Spring 常用註解深度解析:從組件掃描到生命周期管理

     編輯:Java 綜合教學

Spring 註解驅動開發核心指南

Spring 框架並未採用「約定優於配置」的策略,而是要求開發者顯式指定掃描路徑,將符合條件的 Java 類註冊為 Spring Bean。那麼,Spring 如何識別哪些類應作為 Bean 處理?答案在於註解。

核心組件註解

Spring 提供四大核心刻板印象註解,分別對應不同架構層級:

  • @Component:通用組件註解,標識普通 Spring Bean
  • @Controller:表現層控制器組件
  • @Service:業務邏輯層組件
  • @Repository:數據訪問層 DAO 組件

最佳實踐:儘量使用 @Controller、@Service、@Repository 替代通用的 @Component,因為未來版本將賦予它們更豐富的語義。Bean 實例默認名稱為類名首字母小寫(如 UserService → userService)。

組件掃描配置

在 Spring 配置文件中引入 context 命名空間,啟用自動掃描:

<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:context="https://www.springframework.org/schema/context"
       xsi:schemaLocation="...spring-context-4.0.xsd">
    <context:component-scan base-package="org.crazyit.app.service"/>
</beans>

掃描過濾器進階用法

通過 <include-filter> 和 <exclude-filter> 精確控制掃描範圍,支持四種過濾器類型:

類型說明示例
annotation按註解過濾lee.AnnotationTest
assignable按類名過濾com.example.MyClass
regex正則表達式org\.example\.default.*
aspectjAspectJ 模式org.example..*Service+

示例:僅掃描以 Chinese、Axe 結尾的類

<context:component-scan base-package="org.crazyit.app.service">
    <context:include-filter type="regex" expression=".*Chinese"/>
    <context:include-filter type="regex" expression=".*Axe"/>
</context:component-scan>

依賴注入註解:@Resource vs @Autowired

@Resource(JSR-250 標準,推薦使用,減少對 Spring 耦合):

  • 默認按名稱(byName)注入
  • 可修飾 Field、Setter 方法
  • 省略 name 時:Field 採用字段名,Setter 採用去除 "set" 後首字母小寫
@Controller
public class Demo {
    @Resource(name="user")
    private User user;  // Field 注入,無需 Setter
    
    @Resource(name="user")
    public void setUser(User user) { this.user = user; }
}

@Autowired(Spring 專有):默認按類型(byType)注入,配合 @Qualifier 按名稱注入。

Bean 作用域與生命周期

@Scope 定義 Bean 作用域(singleton、prototype、request、session):

@Controller("demo")
@Scope("prototype")
public class Demo { }

生命周期回調(JSR-250):

  • @PostConstruct:依賴注入完成後調用,初始化邏輯
  • @PreDestroy:Bean 銷毀前調用,清理資源
@Component
public class Chinese {
    @Resource(name="steelAxe")
    private SteelAxe steelAxe;
    
    @PostConstruct
    public void init() { System.out.println("初始化..."); }
    
    @PreDestroy
    public void close() { System.out.println("銷毀前..."); }
}

容器啟動時需註冊關閉鉤子:ctx.registerShutdownHook(); 確保銷毀回調執行。

關鍵差異總結

特性@Resource@Autowired
來源Java EE (JSR-250)Spring Framework
默認策略byNamebyType
名稱指定name 屬性@Qualifier 配合
推薦度⭐⭐⭐⭐⭐ (標準化)⭐⭐⭐⭐
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved