2012-04-25 180 views
2

我想知道如果弹簧加载一个接口,当声明为一个实现类的@autowired属性,而不注释接口为a @component弹簧接口加载

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

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

我在想,不包括<context:component-scan接口的,你觉得呢?

PS:我的界面不@Component注释,应用程序运行在DEVELOPPEMENT environement就好了,我只Proguard的混淆后得到的错误

+0

很好的问题,试着通过实现例如和post结果来排除组件扫描。 – 2012-04-25 15:20:34

+0

你的意思是排除组件扫描权的接口? – Genjuro 2012-04-25 15:23:29

+0

你能更详细地描述你的情况吗? ''context:component-scan>'的配置有什么特别之处吗? – axtavt 2012-04-25 15:26:07

回答

0

嗯,我想在不同的包中移动界面会工作,因为你将创建对象接口和相应的实现bean的引用将被自动连接到那些对象引用。但是你应该遵循命名约定。区分接口和实现类时会有问题,因为名称相同。按照像

interface SomeInterface { 
//.... 
} 

标准的实现类SomeInterface

class SomeInterfaceImpl implements SomeInterface { 
// implementation.... 
} 
+0

我同意命名约定,但我混淆了我的代码,所以我可以结束与接口的名称= a和它的实现= a(当然在不同的包) – Genjuro 2012-04-25 15:47:55

1

的注解与@Component,而不是你的注释接口通常是设置的东西,以正确的方式您的实现。 Spring的自动布线将查找匹配类型的托管bean,并且您的实现将匹配输入到该接口的字段。如果您的界面没有注释@Component或任何Spring构造型注释,则在组件扫描期间不应将其加载到上下文中。所以,如果接口和实现具有相同的类名称,则不应该有问题。

您确定您已经试过而不是注释界面?你确定你的项目中没有其他的类还有其他的类,它的名字和界面及其实现一样吗?

+0

我的接口没有用Component(“myImpl “),只有我的实现是。 但仍然,我神秘地告知,该名称是同时接口和实施。 我想用限定符(“myImpl”)使用自动装配。 – Genjuro 2012-04-26 09:11:01

+0

你可以包括你的界面的开始行和实现?具体来说就是package语句,声明行和类中的任何注释(可以忽略导入)。另外,您是否检查过您的项目中是否有另一个带注释的类,它与您的实现具有相同的名称? Spring应该只关注带注释的类,所以如果你的接口确实没有注释,那么它不应该引起问题。 – sdouglass 2012-04-26 15:36:36

+0

该项目运行得很好,我只在用proguard混淆后才得到这个错误。 现在尽管实现在同一个包中并且名称不同,但也会出现相同的问题。 ps:没有其他类使用相同的组件名称+我的界面干净的注释。我想知道proguard是否有问题。调试过程是这样一个噩梦:( – Genjuro 2012-04-26 16:18:23

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 forums有更详细的解答。