在组件中使用@Autowired字段实现相同的接口

时间:2014-09-11 17:11:15

标签: java spring dependency-injection autowired

我可以确定类SomeInterfaceAdvancedImpl中的委托字段(请参阅下面的代码)将始终是SomeInterfaceBasicImpl类型。 我只是检查了调试器中的类型并且它有效,但我有疑问,它将始终以相同的方式工作。有人可以解释一下这种现象(为什么会起作用)?

public interface SomeInterface {
    long doSomething(String param);
}

public abstract class SomeInterfaceAbstractImpl implements SomeInterface {
    public abstract long doSomething();
}

@Component
class SomeInterfaceBasicImpl extends SomeInterfaceAbstractImpl {
    @Override
    public long doSomething(String param) {
      return 1;
    };
}

@Primary
@Component
class SomeInterfaceAdvancedImpl extends SomeInterfaceAbstractImpl {

    @Autowired
    SomeInterface delegate;

    @Override
    public long doSomething(String param) {
      if (param == "2") {
        return 2;
      } else {
        return delegate.doSomething(param);
      }
    };
}

1 个答案:

答案 0 :(得分:1)

添加SomeInterface的其他一些实现,您将看到由NoSuchBeanDefinitionException引起的Spring错误。在这种情况下,您需要使用@Qualifier注释来告诉Spring使用哪个bean。

在mkyong.com上查看此link以获得更好的理解。