簡體   English   中英

春季:兩個bean實現一個接口,其中一個作為@Primary-自動裝配將創建兩個bean

[英]Spring: Two beans implementing one interface with one as @Primary - autowiring creates both beans

一個接口: BeanMapperUtil

兩個實現bean:

  1. OrikaBeanMapper單例豆並標記為@Primary
  2. DirectBeanMapper原型bean

在經理課程中:

@Autowired
BeanMapperUtil mapper;

觀察: Spring同時創建OrikaBeanMapperDirectBeanMapper ,然后自動裝配OrikaBeanMapper

預期:由於OrikaBeanMapper已經被標記為@Primary ,Spring應該只創建這個bean並自動裝配它。 Spring不需要創建DirectBeanMapper的實例。 這對性能/功能沒有影響,但是這看起來像浪費實例的創建,只能將其丟棄。

當您的應用程序啟動時,Spring容器會創建所有在其中注冊的bean(期望原型bean)的實例,並將該bean存儲在BeanFactory中。

因此,所有的bean都被立即創建,並且只有BeanMapperUtil被注入,因為它用於自動裝配。

創建所有匹配的bean之后, @Primary用作過濾器。 它並非旨在防止查找和創建其他非主匹配的Bean。

當Spring嘗試自動BeanMapperUtil ,它將找到兩個匹配項OrikaBeanMapperDirectBeanMapper ,並且兩者都將被創建。 此時, @Primary開始起作用。 Spring將選擇帶有@Primary批注的bean進行注入。

暫無
暫無

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

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