【发布时间】:2015-02-28 09:45:38
【问题描述】:
我目前正在尝试为以下场景配置 Spring Boot(使用 Java Annotations 和 ComponentScan):
场景
- 有一个接口
MyService。 - 我想为
MyService提供一个默认实现,我们称之为MyDefaultService。 - 如果组件扫描未检测到
MyService的其他实现,则 Spring 应将MyDefaultService实例化为“后备”。 - 如果存在
MyService的不同实现,例如MyCustomService,那么在将依赖项自动装配到MyService时,该 bean 应该始终优先于MyDefaultService。在这方面,MyDefaultService应该是隐性(而不是@Primary)。 - 理想情况下,
MyCustomService上不需要附加注释即可“覆盖”MyDefaultService。 - 理想情况下,不需要显式实现的工厂或工厂方法。
问题
问题是:我需要如何注释MyDefaultService 类才能实现这一点?
到目前为止我为解决问题所做的尝试
- 用
@ConditionalOnMissingBean(MyService.class)注释MyDefaultService。不起作用,因为从未使用过MyDefaultService,即使没有其他实现MyService。 - 有一个名为
@Primary的注解解决了这个问题。但是,它需要驻留在MyCustomService上,这是一个我尽量避免附加注释的类。本质上,我需要MyDefaultService上的@Primary的inverse 注释。但是,我找不到这样的注释。
具体用例
我正在一个项目中开发一个服务层,而另一个项目将在它之上实现一个 Web UI 层。 UI 项目依赖于服务层项目。但是,对于在服务层实现的某些功能,我需要知道当前在 Web 上下文中登录的用户。所以我必须在服务层项目中为其定义一个服务接口,以便它可以由UI项目实现。但是,为了在服务层项目中进行测试,我需要该接口的默认实现。此外,如果 UI 项目团队忘记实现此接口,应用程序不应崩溃,而是实例化 fallback bean 并发出警告。
感谢和亲切的问候,
艾伦
【问题讨论】:
标签: spring annotations spring-boot autowired