[英]Spring Autowiring only works with Interface
我對spring框架很新,遇到了以下問題。
我有一個接口ClassA
,它由ClassA1
和ClassA2
分類實現。
我在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.