当只引用基类时,Autowire是如何工作的



我正在尝试扩展现有代码,该代码自动连接许多共享同一基类且仅由其基类引用的组件,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。

最新更新