Spring Fallback bean实现
我目前正在尝试针对以下情况配置 (使用 和
):
- 有一个界面
MyService
。 - 我想提供一个默认的实现
MyService
,让我们把它MyDefaultService
。 - 如果组件扫描未检测到的其他实现
MyService
,则Spring应该实例MyDefaultService
化为“后备”。 - 如果有不同的实现
MyService
目前,让我们说MyCustomService
,那豆应 接管优先MyDefaultService
自动装配依赖于时MyService
。在这方面,MyDefaultService
应该是 (而不是@Primary
)。 - 理想情况下,不需要附加注释
MyCustomService
即可将其“覆盖”MyDefaultService
。 - 理想情况下,不需要明确实现的工厂或工厂方法。
问题是:MyDefaultService
为了实现这一点,我需要如何为课程添加注释?
- 注解
MyDefaultService
用@ConditionalOnMissingBean(MyService.class)
。无法MyDefaultService
使用,因为从未使用过,即使没有其他实现MyService
。 - 有一个称为的注解
@Primary
可以解决该问题。但是,它需要驻留在上MyCustomService
,我试图避免添加其他注释。本质上,我需要on 的 反 注。但是,我找不到这样的注释。@Primary``MyDefaultService
我正在一个项目中开发服务层,而另一个项目将在其之上实现Web
UI层。UI项目与服务层项目有依赖关系。但是,对于在服务层实现的某些功能,我需要知道当前在Web上下文中登录的用户。因此,我必须在服务层项目中为该服务定义一个服务接口,以便可以由UI项目来实现。但是,为了在服务层项目中进行测试,我需要该接口的默认实现。另外,如果UI项目团队忘记实现此接口,则应用程序不应崩溃,而应实例化后备bean并发出警告。
谢谢!
艾伦
回答:
我建议FactoryBean
为此编写一个实现。您FactoryBean
将扫描bean工厂以查找实现的bean,MyService
如果找到实现的bean,它将从中返回该bean
getObject
。如果不是,则可以MyDefaultService
直接实例化并返回该实例。然后,您的工厂bean用添加了注释@Primary
。
像这样的片段(伪代码):
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。
以上是 Spring Fallback bean实现 的全部内容, 来源链接: utcz.com/qa/400880.html