Spring fallback bean实现

我目前正在尝试为以下场景配置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的反向注释.但是,我找不到这样的注释.

具体用例

我正在一个项目中开发一个服务层,另一个项目将在它上面实现一个Web UI层. UI项目依赖于服务层项目.但是,对于在服务层实现的某些功能,我需要知道哪个用户当前在Web上下文中登录.所以我必须在服务层项目中为它定义一个服务接口,这样它就可以由UI项目实现.但是,为了在服务层项目中进行测试,我需要该接口的默认实现.此外,如果UI项目团队忘记实现此接口,则应用程序不应该崩溃,而是实例化回退bean并发出警​​告.

谢谢&亲切的问候,

艾伦

最佳答案
我建议写一个FactoryBean的实现来做到这一点.您的factorybean将扫描bean工厂,查找实现MyService的bean,如果找到,则从getObject返回该bean.如果没有,那么它可以直接实例化MyDefaultService并返回它.然后,您的工厂bean将使用@Primary进行注释.

像这样的碎片(伪代码):

@H_301_39@public class MyServiceFactory implements factorybeanbeanfactory 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
    }
}

然后

@H_301_39@@Primary
@Bean
public MyServiceFactory MyServiceFactory() {
    return new MyServiceFactory();
}

Spring将自动处理工厂bean(即它将使MyService对象可用作正常注入的bean.

这个解决方案不需要任何特殊的魔法,它的工作原理相当明显.您还可以处理错误的情况,例如声明的多个MyService bean.

相关文章

Spring Cloud为Spring Boot应用程序提供Netflix OSS集成。 提供的功能模块包括服务发现(Eureka),断路...
Spring Cloud 学习笔记;maven配置;入门学习;基于Spring Boot 实现;服务端配置,客户端配置;
可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的...
Spring中各种方式进行日期时间处理,有作用于单个实体的,也有作用于全局的,有作用于请求入参的,有作...
跨域资源共享(Cross-origin resource sharing)(CORS)是W3C的标准,大部分的浏览器都实现了这个标准...
Spring Boot使创建基于Spring的应用程序变得轻松,大部分的SpringBoot应用程序都只需要很少的Spring配置...