簡體   English   中英

Spring Autowiring僅適用於Interface

[英]Spring Autowiring only works with Interface

我對spring框架很新,遇到了以下問題。

我有一個接口ClassA ,它由ClassA1ClassA2分類實現。

我在applicationContext.xml添加了以下bean定義

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

我想將兩個實現類Autowire如下所示。

@Autowired
private ClassA1 classA1;

@Autowired
private ClassA2 classA2;

上面的代碼拋出錯誤為

無法自動寫入字段:com.abc.ClassA1 com.abc.SomeClass.classA1; 嵌套異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有匹配的[com.abc.ClassA1]類型的bean

但是,如果我將自動裝配更改為接口,如下所示:

@Autowired
ClassA classA1;

然后ClassA1自動連接到變量。 我無法知道如何將變量自動裝配到ClassA2。

出於某種原因,您的課程由Spring代理。 有很多原因導致這種情況發生。 例如,如果您使用JPA或AOP,則會對原始類進行代理。

如果類實現接口,則代理意味着動態代理。 所以基本上在運行時創建一個新類來實現接口但不從原始類繼承。 因此,原始類的自動裝配不起作用。

如果您的對象由JDK代理代理,那么它們的接口應該引用它們。 您可以使用CGLIB(在類路徑上)和在aop配置中的proxy-target-class="true" (在applicationContext.xml )通過具體類創建代理

我嘗試了多種方法來解決這個問題,但我通過以下方式實現了它。

@Autowired
private ClassA classA1;

@Autowired
private ClassA classA2;

在應用程序上下文中,我將bean定義如下:

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

您可以使用@Qualifier注釋:

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

@Autowired
@Qualifier("class2")
ClassA classA2;

參考: http//static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers

@Resource注釋:

@Resource(name="class1")
ClassA classA1;

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

參考: http//static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-resource-annotation

我有自動化抽象服務的類似問題。 您可以使用沒有任何問題代碼,如下所示:

@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的類的類型,似乎沒有任何限制。

不相關的問題,但這個文章提到的情況本身

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM