Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring自动布线仅适用于接口_Java_Spring_Autowired - Fatal编程技术网

Java Spring自动布线仅适用于接口

Java Spring自动布线仅适用于接口,java,spring,autowired,Java,Spring,Autowired,我是spring框架的新手,遇到了以下问题 我有一个接口ClassA,它由classedClassA1和ClassA2实现 我将以下bean定义添加到applicationContext.xml <bean id="class1" class="com.abc.ClassA1" /> <bean id="class2" class="com.abc.ClassA2" /> 上面的代码正在抛出错误 无法自动写入字段:com.abc.ClassA1 com.abc.Some

我是spring框架的新手,遇到了以下问题

我有一个接口
ClassA
,它由classed
ClassA1
ClassA2
实现

我将以下bean定义添加到
applicationContext.xml

<bean id="class1" class="com.abc.ClassA1" />
<bean id="class2" class="com.abc.ClassA2" />
上面的代码正在抛出错误

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

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

@Autowired
ClassA classA1;
<bean id="classA1" class="com.abc.ClassA1" autowire="byName" />
<bean id="classA2" class="com.abc.ClassA2" autowire="byName" />

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

出于某种原因,您的类由Spring代理。这种情况之所以会发生,有很多原因。例如,如果使用JPA或AOP,则原始类将被代理


如果一个类实现了一个接口,那么proxy意味着动态代理。因此,基本上是在运行时创建一个新类,该类实现接口,但不从原始类继承。因此,到原始类的自动连接不起作用。

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

我尝试了多种方法来解决此问题,但我通过以下方式实现了它

@Autowired
private ClassA classA1;

@Autowired
private ClassA classA2;
在应用程序上下文中,我将bean定义如下:

@Autowired
ClassA classA1;
<bean id="classA1" class="com.abc.ClassA1" autowire="byName" />
<bean id="classA2" class="com.abc.ClassA2" autowire="byName" />

您可以使用
@限定符
注释:

@Autowired
@Qualifier("class1")
ClassA classA1;

@Autowired
@Qualifier("class2")
ClassA classA2;
@Resource(name="class1")
ClassA classA1;

@Resource(name="class2")
ClassA classA2;
参考:

@Resource
注释:

@Autowired
@Qualifier("class1")
ClassA classA1;

@Autowired
@Qualifier("class2")
ClassA classA2;
@Resource(name="class1")
ClassA classA1;

@Resource(name="class2")
ClassA classA2;

参考:

我在自动连接抽象服务方面也有类似的问题。您可以使用以下无任何问题的代码:

@Autowired
@Qualifier("classA1")
private ClassA1 classA1;

@Autowired
@Qualifier("classA2")
private ClassA2 classA2;
只有当您像这样声明bean时,这才有效

<bean id="class1" class="com.abc.ClassA1" />
@Component("classA1")
public class ClassA1 {
...
}

从我所看到的一点到现在,它似乎没有任何限制,关于可以标记为@Autowired的类的类型


与问题无关,但文章提到了情况本身

这有帮助吗?这意味着我必须避免在自动连接类中使用接口?不,不。你可以自动连接接口。在我的例子中,我使用注释自动连接,一个服务由其inferface而不是其类自动连接,我必须删除接口或创建一个伪接口。顺便说一句,良好的做法是根本不使用autowire。它会减慢bean的创建速度,从而导致应用程序的启动。使用@Resource和wire按bean的名称(而不是按类型!)要好得多。好吧,有不同的架构师和不同的观点。有人说大多数bean都是单例的,因此它只影响应用程序的启动,因此它并不重要。但作为一名开发人员,如果应用程序在两分钟而不是30秒内启动,这可能会很烦人。我说的是相当大的应用程序。这是唯一看起来有效的东西!!谢谢。