知識庫 / Spring RSS 訂閱

Spring 自動注入

Spring
HongKong
5
11:35 AM · Dec 06 ,2025

1. 概述

自注入是指 Spring Bean 將自身作為依賴注入。它利用 Spring 容器獲取自身的一個引用,然後使用該引用執行一些操作。

在本簡短教程中,我們將學習如何在 Spring 中使用自注入。

2. 自引用注入的應用場景

自引用注入最常見的應用場景是在 Spring AOP 限制下,當需要將方面應用於自身方法或類時。

假設我們有一個服務類,該類執行一些業務邏輯,並且需要在業務邏輯的一部分中調用自身的方法:

@Service
public class MyService {
    public void doSomething() {
        // ...
        doSomethingElse();
    }

    @Transactional
    public void doSomethingElse() {
        // ...
    }
}

然而,當我們運行應用程序時,可能會注意到 @Transactional 沒有被應用。這是因為 doSomething() 方法直接調用了 doSomethingElse(),從而繞過了 Spring 代理。

為了解決這個問題,我們可以使用自注入來獲取指向 Spring 代理的引用,並通過該代理調用該方法。

3. 使用 @Autowired 自注入

我們可以通過在 Bean 的字段、構造函數參數或 setter 方法上使用 <em @Autowired</em>> 註解,在 Spring 中進行自注入。

以下是一個使用 <em @Autowired</em>> 與字段的示例:

@Component
public class MyBean {
    @Autowired
    private MyBean self;

    public void doSomething() {
        // use self reference here
    }
}
<div>
</div>
<div>
<p>And with a constructor parameter:</p>
@Component
public class MyBean {
    private MyBean self;

    @Autowired
    public MyBean(MyBean self) {
        this.self = self;
    }

    // ...
}

4. 使用 ApplicationContextAware 自注入

另一種進行自注入的方式是通過實現 ApplicationContextAware 接口。該接口允許 Bean 意識到 Spring 應用上下文並獲取自身的一個引用:

@Component
public class MyBean implements ApplicationContextAware {
    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        this.context = context;
    }

    public void doSomething() {
        MyBean self = context.getBean(MyBean.class);
        // ...
    }
}

5. 缺點

當一個 Bean 注入自身時,這可能會導致對 Bean 職責的混淆,並使應用程序中數據流追蹤變得更加困難。

自我注入也可能導致循環依賴。 從 Spring Boot 版本 2.6 開始,如果我們的項目存在循環依賴,Spring Boot 將拋出異常。 當然,還有一些解決方法。

6. 結論

在本文中,我們學習了多種使用自注入(self-injection)在 Spring 中的方法,以及何時使用它們。我們還了解了自注入在 Spring 中的一些缺點。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.