簡體   English   中英

@Repository class 中的自引用導致循環引用

[英]Self reference in @Repository class result in circular reference

我發現@Repository中的自我引用不起作用,例如:

@Repository
public class HelloService {
    static final Logger Log = LoggerFactory.getLogger(HelloService.class);

    @Autowired
    HelloService self;  // <----- self reference
    ...
}

得到循環引用錯誤

osbwsc。原始版本作為循環引用的一部分,但最終已被包裝。 這意味着所說的其他 bean 不使用 bean 的最終版本。 這通常是過度渴望類型匹配的結果 - 例如,考慮使用 'getBeanNamesOfType' 並關閉 'allowEagerInit' 標志。

但是,當將Repository更改為@Component@Service時,此技巧可能會起作用。 作為一種解決方法,我必須在self中添加一個@Lazy

HelloService的行為取決於 Spring 數據 JPA 存儲庫的引導方式,在這種情況下,這似乎是默認模式:

  • DEFAULT(默認)- 除非使用 @Lazy 顯式注釋,否則存儲庫會被急切地實例化。

閱讀日志,並查找此條目:

RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in XYZ mode.

然后看看那個XYZ是什么。

@Lazy可以幫助您,因為:

如果 @Component 或 @Bean 定義上不存在此注解,則會發生急切初始化。 如果存在並設置為 true,則 @Bean 或 @Component 在被另一個 bean 引用或從封閉的 BeanFactory 顯式檢索之前不會被初始化。

為了了解您的其他組件是如何被初始化的,最好有日志、屬性、配置或其他任何可能影響 Spring 應用程序行為的內容。 如果您不提供最小的可重現示例,真的很難猜出您擁有什么


其他要點:

通常,將A注入A是一種非常糟糕的做法,您幾乎應該永遠不要這樣做。

但是,如果沒有@Lazy bean A注入到自身中,那么您將得到異常也就不足為奇了。 您需要在 Spring 容器中准備好 bean,以便將其注入某處; 並且,為了准備好那個 bean,Spring 必須注入它的依賴項.. 然而,在你的代碼中:

@Repository
public class HelloService {
    static final Logger Log = LoggerFactory.getLogger(HelloService.class);

    @Autowired
    HelloService self;  // <----- self reference
    ...
}

這取決於它自己。

您要告訴應用程序上下文:

  1. 實例化 bean helloService (包括准備它,通過注入它的每個依賴項);
  2. helloService bean 注入自身。

您認為不先完成step 1就可以完成步驟step 2嗎? 如果step 2無法完成, step 1將如何完成?

您正在注入尚未准備好的東西,為了准備好,您需要注入它本身,這又是未准備好......等等......

這會讓你遇到循環引用問題,這是一個死鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM