簡體   English   中英

僅引用基類時 Autowire 如何工作

[英]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是它的短名稱,例如upNavigationUpNavigation類。

@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.

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