我有ProjectA定义MyService
类。
ProjectA包含多个具体服务,例如:SomeService
。
现在我有了ProjectB,这是一个Spring引导项目,它将ProjectA作为依赖项。
ProjectB可以通过定义自己的SomeService
向public class SomeService extends project.a.SomeService {...}
添加一些功能。通过@ImportResource("applicationContext.xml")
扫描bean。
的applicationContext.xml:
<beans ...>
<context:component-scan base-package="project">
<context:include-filter type="assignable"
expression="project.a.MyService" />
</context:component-scan>
</beans>
主要问题是:这会导致ConflictingBeanDefinitionException:
Annotation-specified bean name 'someService' for bean class
[project.a.SomeService] conflicts with existing,
non-compatible bean definition of same name and class [project.b.SomeService]
虽然异常非常清楚,但我不知道如何解决它。
在我的研究之后,我相信setAllowBeanDefinitionOverriding(true)
应该解决我的问题。也许我只是在错误的时间做,但它从来没有帮助(我认为这是默认值)。
我的尝试:
我试图避免所有扫描并自己注册我的bean:
GenericApplicationContext ctx = (GenericApplicationContext) SpringApplication.run(ProjectBApplication.class, args);
ctx.getBeanFactory().registerSingleton("someService", new project.b.SomeService());
...
我可以通过这种方式过滤MyService
,但现在我在其他(以下!)bean中使用SomeService
运行自动装配问题。
也许我只是注册someService bean错了?
我已经读过有关BeanPostProcessors的内容,但我没有得到他们如何帮助我以及在哪里正确使用它们。
请记住:任何解决方案都适合,无论是否在xml中过滤MyService代码,只需告诉spring覆盖具有更具体或更具特色的bean。
答案 0 :(得分:0)
我发现我刚刚注册了错误的bean。使用
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(service);
context.registerBeanDefinition(beanName, beanDefinition);
解决了自动装配问题,目前一切正常。