![](/img/trans.png)
[英]Spring autowire does not work in simple class, but works everywhere else
[英]How does Autowire work when reffering only to a base class
我正在嘗試擴展現有代碼,這些代碼自動連接許多共享相同基類並且僅由它們的基類 ei 引用的組件:
@Configuration
public class NavigationHotKeyBindConfigs {
private static final Logger logger = LogManager.getLogger(NavigationHotKeyBindConfigs.class);
@Autowired
private HotKeyConfig hotKeyConfig;
@Autowired
private ANavigation upNavigation;
@Autowired
private ANavigation downNavigation;
@Autowired
private ANavigation centerOnSelection;
@Autowired
private ANavigation handVerify;
public abstract class ANavigation {
@Autowired
protected ScrollSchedulerConfigurer scrollSchedulerConfigurer;
public abstract void execute(DetectionView DetectionView);
}
@Component
public class DownNavigation extends ANavigation{
private static final Logger logger = LogManager.getLogger(DownNavigation.class);
public void execute(DetectionView detectionView){
logger.info(String.format("Received: Navigation key %s", ENavigationKey.DOWN.name()));
scrollSchedulerConfigurer.stop();
detectionView.selectNextDetection();
}
}
@Component
public class UpNavigation extends ANavigation{
private static final Logger logger = LogManager.getLogger(UpNavigation.class);
public void execute(DetectionView detectionView){
logger.info(String.format("Received: Navigation key %s", ENavigationKey.Up.name()));
scrollSchedulerConfigurer.stop();
detectionView.selectPrevDetection();
}
}
我不明白 spring 應該如何分別將 upNavigation/downNavigation 與 UpNavigation/DownNavigation 組件相匹配。 這只是原作者的糟糕設計還是我遺漏了微妙之處?
這種缺乏理解也導致了一些問題,因為 centerOnSelection 和 handVerify 對象在自動裝配后最終為 NULL,盡管它們在我能看到的各個方面都遵循相同的模式。 有趣的是,最后一個行為在 Intellij IDE 中運行時與在 .jar 中運行時不同
你可以這樣做...
假設我們有兩個具有相同基類或接口的 bean
@Component("fooFormatter")
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
@Component("barFormatter")
public class BarFormatter implements Formatter {
public String format() {
return "bar";
}
}
然后我們像這樣注入它們......
public class FooService {
@Autowired
@Qualifier("fooFormatter")
private Formatter formatter;
}
從清晰性和可維護性的角度來看,這似乎是最好的解決方案
@Autowired
首先查看變量的類型,然后查看變量的名稱以匹配正確的 bean。 默認情況下,標有類的名字@Component
是它的短名稱,例如upNavigation
為UpNavigation
類。
@Autowired
private ANavigation upNavigation;
是相同的
@Autowired
@Qualifier("upNavigation")
private ANavigation upNavigation;
和
@Component
public class UpNavigation
是相同的
@Component("upNavigation")
public class UpNavigation
由於名稱匹配,Spring 能夠找到相應的 bean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.