我正在嘗試擴展現有代碼,這些代碼自動連接許多共享相同基類并且僅由它們的基類 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 中運行時不同
uj5u.com熱心網友回復:
你可以這樣做...
假設我們有兩個具有相同基類或介面的 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;
}
從清晰性和可維護性的角度來看,這似乎是最好的解決方案
uj5u.com熱心網友回復:
@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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/346834.html
上一篇:模板可能不存在
