当bean实现与Spring的某些接口时,无法自动装配字段

Voj*_*ěch 5 spring dependency-injection autowired

我在我的Java应用程序中使用Spring,所有@Autowired注释一直工作到现在.

简化的例子是:

  @Component
  public class MyBean implements MyInterface {
      ...
  }

  @Component
  public class MyOtherBean {
      @Autowired
      private MyBean myBean;
      ...
  }
Run Code Online (Sandbox Code Playgroud)

一旦我尝试启动应用程序,我得到:

java.lang.IllegalArgumentException: Can not set MyBean field MyOtherBean.myBean to $ProxyXX

  1. 该接口只包含两个公共简单方法,该类实现它们.
  2. 这两个类都是公共的,并且有公共默认构造函数.(我甚至试图在测试中实例化它们.
  3. 删除该implements部分后,一切正常.

接口的实现有什么问题?什么是$ProxyXX

Wil*_*ing 11

我怀疑问题是Spring正在注入一个实现的AOP代理MyInterface- 可能用于事务管理或缓存.是否有任何MyBean方法@Transactional使用任何其他注释进行注释或注释?

理想情况下,您可能希望通过它的接口类型引用MyBean - 这应该可以解决问题.

@Component
public class MyOtherBean {
    @Autowired
    private MyInterface myBean;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果你有多个bean实现,MyInterface那么你总是按名称限定你的bean.

@Component
public class MyOtherBean {
    @Autowired
    @Qualifier("myBean")
    private MyInterface myBean;
    ...
}
Run Code Online (Sandbox Code Playgroud)