2

我想知道当声明为@autowired实现类的属性而没有将接口注释为a @component.

让我再描述一下我的问题:我有一个接口和它的实现类有相同的名称,但它们驻留在不同的包中。我将实现注释为@Component("myImplementation"). 但我最终有一个例外,上面写着:

conflicts with existing, non-compatible bean definition of same name and class

我正在考虑排除接口<context:component-scan ,你怎么看?

PS:我的界面没有@Component注释,应用程序在开发环境中运行得很好,我只是在 Proguard 混淆后得到错误

4

3 回答 3

1

@Component而不是用接口来注释你的实现通常是正确的设置方法。Spring 的自动装配将寻找匹配类型的托管 bean,并且您的实现将匹配键入到接口的字段。如果您的界面没有使用@Component或任何 Spring 原型注解进行注释,则不应在组件扫描期间将其加载到上下文中。因此,如果接口和实现具有相同的类名,您应该不会有问题。

你确定你试过注释界面吗?您确定在项目的其他地方没有与接口及其实现同名的其他类吗?

于 2012-04-25T19:29:24.230 回答
1

您的proguard.conf应包含:

## ... preserve class annontation (Java EE 1.6 DI)
# Spring3
#-keep @org.springframework.stereotype.Service class *
-keep @org.springframework.stereotype.Controller class *
#-keep @org.springframework.stereotype.Component class *
#-keep @org.springframework.stereotype.Repository class *

proguard论坛有更详细的答案。

于 2012-08-28T21:41:55.803 回答
0

Well I think moving interfaces in different package would work because you would create object reference of interface and respective implementation beans would be auto wired to those object references. But you should follow naming conventions. There would be problem when differentiating interfaces and implementation classes as names are same. Follow standards like

interface SomeInterface {
//....
}

for implementation class of SomeInterface

class SomeInterfaceImpl implements SomeInterface {
// implementation....
}
于 2012-04-25T15:42:20.347 回答