彈簧自註入
瀏覽人數:236最近更新:
一、概述
自註入意味著 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
自註入
我們可以在 Spring 中通過在字段、構造函數參數或 bean 的 setter 方法上使用@Autowired
註解來執行自註入。
下面是將@Autowired
與字段一起使用的示例:
@Component
public class MyBean {
@Autowired
private MyBean self;
public void doSomething() {
// use self reference here
}
}
並帶有構造函數參數:
@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 職責的混淆,並使跟踪應用程序中的數據流變得更加困難。
自註入也可以創建循環依賴。從 2.6 版本開始,如果我們的項目有循環依賴,Spring Boot 將引發異常。當然,有一些解決方法。
六,結論
在這篇簡短的文章中,我們了解了在 Spring 中使用自註入的幾種方法以及何時使用它。我們還了解了 Spring 中自註入的一些缺點。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議