我目前正在尝试针对以下情况配置 Spring Boot (使用 Java Annotations 和 ComponentScan ):
情境
MyService
MyDefaultService
MyCustomService
@Primary
题
问题是:MyDefaultService为了实现这一点,我需要如何为课程添加注释?
我到目前为止为解决问题所做的尝试
@ConditionalOnMissingBean(MyService.class)
@Primary``MyDefaultService
具体用例
我正在一个项目中开发服务层,而另一个项目将在其之上实现Web UI层。UI项目与服务层项目有依赖关系。但是,对于在服务层实现的某些功能,我需要知道当前在Web上下文中登录的用户。因此,我必须在服务层项目中为该服务定义一个服务接口,以便可以由UI项目来实现。但是,为了在服务层项目中进行测试,我需要该接口的默认实现。另外,如果UI项目团队忘记实现此接口,则应用程序不应崩溃,而应实例化后备bean并发出警告。
谢谢!
艾伦
我建议FactoryBean为此编写一个实现。您FactoryBean将扫描bean工厂以查找实现的bean,MyService如果找到实现的bean,它将从中返回该bean getObject。如果不是,则可以MyDefaultService直接实例化并返回该实例。然后,您的工厂bean用添加了注释@Primary。
FactoryBean
getObject
像这样的片段(伪代码):
public class MyServiceFactory implements FactoryBean<MyService> { ListableBeanFactory beanFactory; public MyService getObject() { Map beans = beanFactory.getBeansOfType(MyService.class) if (beans.isEmpty()) return new MyDefaultService(); // plus args, obviously else return get_some_bean_from_the_map } }
然后
@Primary @Bean public MyServiceFactory MyServiceFactory() { return new MyServiceFactory(); }
Spring将自动处理工厂bean(即,将MyService对象像正常情况一样用作注入的bean)。
该解决方案不需要任何特殊的魔术,并且它的工作原理非常明显。您还可以处理错误的情况,例如MyService声明了多个bean。