弹簧自动布线仅适用于接口

2022-09-03 06:02:47

我对弹簧框架很陌生,遇到了以下问题。

我有一个接口,它由classed和.ClassAClassA1ClassA2

我有以下豆定义添加到applicationContext.xml

<bean id="class1" class="com.abc.ClassA1" />
<bean id="class2" class="com.abc.ClassA2" />

我想自动连接这两个实现类,如下所示。

@Autowired
private ClassA1 classA1;

@Autowired
private ClassA2 classA2;

上面的代码抛出错误为

无法自动写入字段:com.abc.ClassA1 com.abc.SomeClass.classA1;嵌套的异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No match bean type [com.abc.ClassA1]

但是,如果我将自动布线更改为界面,如下所示:

@Autowired
ClassA classA1;

然后,ClassA1 自动连接到变量。我不知道如何将变量自动连接到ClassA2。


答案 1

由于某种原因,你的课程被春天代理。发生这种情况的原因有很多。例如,如果您使用 JPA 或 AOP,则原始类是代理的。

如果类实现接口,则代理表示动态代理。因此,基本上在运行时创建了一个新类,该类实现接口但不从原始类继承。因此,自动连接到原始类不起作用。


答案 2

如果您的对象由 JDK 代理代理,则它们应由其接口引用。您可以使用 CGLIB(在类路径上)和 aop 配置(在proxy-target-class="true"applicationContext.xml)


推荐