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 中的一些缺點。