Spring Autowiring仅适用于Interface

Cha*_*nya 16 java spring autowired

我对spring框架很新,遇到了以下问题.

我有一个接口ClassA,由分类ClassA1ClassA2.

我添加了以下bean定义 applicationContext.xml

<bean id="class1" class="com.abc.ClassA1" />
<bean id="class2" class="com.abc.ClassA2" />
Run Code Online (Sandbox Code Playgroud)

我想将两个实现类Autowire如下所示.

@Autowired
private ClassA1 classA1;

@Autowired
private ClassA2 classA2;
Run Code Online (Sandbox Code Playgroud)

上面的代码抛出错误为

无法自动写入字段:com.abc.ClassA1 com.abc.SomeClass.classA1; 嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有匹配的[com.abc.ClassA1]类型的bean

但是,如果我将自动装配更改为接口,如下所示:

@Autowired
ClassA classA1;
Run Code Online (Sandbox Code Playgroud)

然后ClassA1自动连接到变量.我无法知道如何将变量自动装配到ClassA2.

Tar*_*log 13

出于某种原因,您的课程由Spring代理.有很多原因导致这种情况发生.例如,如果您使用JPA或AOP,则会对原始类进行代理.

如果类实现接口,则代理意味着动态代理.所以基本上在运行时创建一个新类来实现接口但不从原始类继承.因此,原始类的自动装配不起作用.


Boz*_*zho 6

如果您的对象由JDK代理代理,那么它们的接口应该引用它们.您可以使用CGLIB(在类路径上)和proxy-target-class="true"aop配置(in applicationContext.xml)中通过具体类创建代理


Cha*_*nya 3

我尝试了多种方法来解决这个问题,但我按照以下方式解决了这个问题。

@Autowired
private ClassA classA1;

@Autowired
private ClassA classA2;
Run Code Online (Sandbox Code Playgroud)

在应用程序上下文中,我将 bean 定义如下:

<bean id="classA1" class="com.abc.ClassA1" autowire="byName" />
<bean id="classA2" class="com.abc.ClassA2" autowire="byName" />
Run Code Online (Sandbox Code Playgroud)