假設我有介面 foo 和 bar,然后有多個實作它們的類:
public interface InterfaceFoo{
int getFoo()
}
public interface InterfaceBar{
int getBar()
}
public class FooBarOne implements InterfaceFoo, InterfaceBar{
public int getFoo() { ... }
public int getBar() { ... }
}
public class FooBarTwo implements InterfaceFoo, InterfaceBar{
public int getFoo() { ... }
public int getBar() { ... }
}
然后我為這兩個類創建 bean:
@Configuration
@ComponentScan
public class Config {
@Bean
fooBarOne getFooBarOne() { return new FooBarOne(); }
@Bean
fooBarTwo getFooBarTwo() { return new FooBarTwo();}
}
最后是另一個 bean,它在 foo 的所有實作串列中 @Autowries
@Configuration
@ComponentScan
public class FooConfig {
@Bean
@Autowired
public List<InterfaceFoo> fooFetcher(List<<InterfaceFoo>> listFoos) {
return listFoos;
}
}
我的問題是,當它們具有多個介面實作時,Spring 如何識別/自動裝配 bean?上面的偽代碼似乎可以作業,但是,如果我將 bean 的回傳型別從具體類更改為 ibar,它不會被 autowire 拾取:
@Configuration
@ComponentScan
public class Config {
@Bean
InterfaceBar getFooBarOne() { return new FooBarOne(); }
@Bean
InterfaceBar getFooBarTwo() { return new FooBarOne(); }
}
從上面的示例中,spring 在為 ifoo 的實作自動裝配時不會選擇這些 bean。將回傳型別切換為 ifoo 是可行的,這對我來說意味著 spring 查看 bean 的回傳型別而不是回傳物件的回傳型別?即使 fooBarOne 和 fooBarTwo 都實作了 foo 和 bar,如果我想要 List 的自動裝配來獲取它,我是否需要回傳具體的類或介面 ifoo?
uj5u.com熱心網友回復:
Spring 的默認自動裝配模式是按型別,因此如果您創建兩個 bean 型別iBar,它們將不會自動裝配為iFoo,即使具體類也是iFoo. Spring 不知道一個類實作的所有介面,它只知道在其背景關系中創建的 bean 的型別。
當您嘗試自動裝配時List<<iFoo>>,Spring 將在其背景關系中查找iFoo要注入的所有型別的 bean,而您沒有。
另外,請閱讀 Java 命名約定,您可能希望您的介面只是Foo和Bar https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html
uj5u.com熱心網友回復:
當宣告帶有@Bean 注釋的方法的bean 時,Spring 將方法的回傳型別分配為bean 型別,即將類名( ibar.class.getName()) 與其他物件元資料一起保存到BeanDefinition。從現在開始,spring 不關心你的類是否實作了其他介面,它只關心你的物件和分配的型別。
自動裝配時,spring 過濾匹配 bean 型別和名稱約束的 bean,由要構造的 bean 型別提供
在這種情況下,當嘗試創建時,spring 可以使用擴展/實作它List<iFoo>的型別或型別掛鉤 bean ,但不是,因為與iFooibaribariFoo
如果您只需要List<iFoo>,并且您沒有使用fooBarOne/ bean,那么實際上將 bean 宣告為orfooBarTwo并不重要。但總的來說,你應該更喜歡使用介面而不是實作,這將有助于在你的代碼中保持依賴倒置。iFoofooBarOne
而且,總是用大寫字母命名你的類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521729.html
標籤:爪哇春天弹簧靴界面
上一篇:將資料從一個表拆分到另一個表
