Spring在运行时选择bean实现

2023-11-27

我使用带有注释的 Spring Bean,并且需要在运行时选择不同的实现。

@Service
public class MyService {
   public void test(){...}
}

例如对于windows平台我需要MyServiceWin extending MyService,对于linux平台我需要MyServiceLnx extending MyService.

目前我只知道一个可怕的解决方案:

@Service
public class MyService {

    private MyService impl;

   @PostInit
   public void init(){
        if(windows) impl=new MyServiceWin();
        else impl=new MyServiceLnx();
   }

   public void test(){
        impl.test();
   }
}

请考虑我仅使用注释而不是 XML 配置。


1. 实施自定义Condition

public class LinuxCondition implements Condition {
  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return context.getEnvironment().getProperty("os.name").contains("Linux");  }
}

同样适用于Windows.

2. Use @Conditional在你的Configuration class

@Configuration
public class MyConfiguration {
   @Bean
   @Conditional(LinuxCondition.class)
   public MyService getMyLinuxService() {
      return new LinuxService();
   }

   @Bean
   @Conditional(WindowsCondition.class)
   public MyService getMyWindowsService() {
      return new WindowsService();
   }
}

3. Use @Autowired照常

@Service
public class SomeOtherServiceUsingMyService {

    @Autowired    
    private MyService impl;

    // ... 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring在运行时选择bean实现 的相关文章

随机推荐

  • Java:PhantomReference、ReferenceQueue 和 Finalize

    我有一个 PR 一个 PR 指向的对象 O 以及一个为 PR 设置的 RQ 我有一个线程不断轮询 RQ 并且在它在 RQ 中找到的第一个引用时 该线程打印它找到它的时间 然后退出 一切工作正常 但是一旦 O 完成了 无论多么微不足道 线程就
  • 如何使用phpmyadmin编写存储过程以及如何通过php使用它?

    我希望能够使用创建存储过程phpMyAdmin然后通过php使用它 但我不知道该怎么办 据我所知 我发现我们无法通过以下方式管理存储过程phpMyAdmin 还有什么其他工具可以管理存储过程 我什至不确定通过 PHP 使用存储过程是否是更好
  • 枚举是否创建其参数的副本?

    如果我在迭代非常大的图形集群列表时使用枚举 我想确保我不会在内存中不必要地创建该列表的任何副本 我一直在尝试确认它不会创建任何副本 但想确定一下 for i cluster in enumerate c code that does stu
  • 我可以将dispatch_once_t谓词声明为成员变量而不是静态吗?

    我只想每个实例运行一次代码块 我可以将dispatch once t谓词声明为成员变量而不是静态变量吗 From GCD 参考 我不清楚 谓词必须指向存储在全局或静态中的变量 范围 使用自动或动态谓词的结果 存储未定义 我知道我可以使用di
  • 无法在 Eclipse IDE 中更改 Maven 版本

    在 Eclipse 内部 mvn package 失败但在终端中成功后 我意识到 Eclipse 正在运行Maven 3 3 3当终端运行时3 3 9 我尝试通过以下方式重新配置 Eclipse 并且从所有明显的情况来看都成功了 Eclip
  • 如何将 HTML 标签显示为纯文本 [重复]

    这个问题在这里已经有答案了 我的网站上有一个允许使用 HTML 的输入表单 我正在尝试添加有关使用 HTML 标签的说明 我想要的文字是 strong Look just like this line so then know how to
  • 运行 Mac OS X 10.4 的 Mac PowerPC 上的 Java 6

    是否可以在装有 Mac OS X 10 4 的 Mac PowerPC 上运行 Java 6 AFAIKSoyLatte仅适用于英特尔处理器 截至 2009 年 12 月 适用于 OS X 10 5 PPC 的 OpenJDK 7 测试版已
  • 有没有办法用 xlwings 调用 python 而无需重新打开 Excel 文件?

    我使用 xlwings 从 Excel 调用 python 我发现运行宏时 Excel 会关闭并重新打开以运行代码 它可以正常工作 但会减慢速度 此外 如果 Excel 文件未保存 则会出现一个对话框 提示该文件已打开 并且我将丢失未保存的
  • 使用 Volley 进行异步帐户身份验证

    大家 我正在使用 AbstractAccountAuthenticator 实现帐户身份验证器 并且需要在函数 getAuthToken 中调用异步方法来对用户进行身份验证 我的代码是这样的 public class AccountAuth
  • 升级到 angular-6.x 会出现“未捕获的引用错误:全局未定义”

    我将项目从 Angular 5 x 升级到 Angular 6 x 它开始出现以下错误 甚至创建虚拟全局变量也无法按照此处给出的方式工作Angular 6 Auth0 全局未定义 错误如下 Uncaught ReferenceError g
  • UILabel 更新在滚动期间停止 UIScrollView

    我有一个scrollView 里面有一个imageView 这scrollView是superView的子View imageView是superView的子ViewscrollView 我还有一个标签 在超级视图级别 它每毫秒从 NSTi
  • 我可以在 Angular 服务中直接在 templateUrl 上使用 $compile 而不是在原始 HTML 或原始 angular.element 上吗?

    给定以下旨在创建 对话框 元素 即模式 的服务 app service dialog document compile rootScope function document compile rootScope var body docum
  • 在java中不使用循环读取完整文件

    可能的重复 如何从文件内容创建 Java 字符串 Java 中将整个文本文件转换为字符串 我正在尝试使用 FileReader 读取文件的内容 但我想读取文件而不逐行读取 是否可以不循环地读取整个文件 我正在使用以下代码 try File
  • 定义 (1 << 31) 还是使用 0x80000000?结果不同

    define SCALE 1 lt lt 31 define fix Q31 80 x int float x float 0x80000000 define fix Q31 SC x int float x float SCALE int
  • PHP 货币格式

    我正在使用money format第一个参数是 n 包括美元符号 并且我将区域设置设置为en US但它仍然不包括它 为什么 来自PHP net评论 如果 Money format 似乎不是 工作正常 请确保您 定义有效的语言环境 例如 在
  • 如何延迟Default.png?

    如何延迟应用程序加载以更长时间地显示启动屏幕 您应该让应用程序照常启动 然后使出现的第一个视图具有与初始屏幕相同的图像 启动计时器 然后在几秒钟后将该视图替换为真实的应用程序根视图 故意推迟实际的应用程序启动是一个很大的禁忌
  • Tomcat 服务使用“本地服务”帐户安装

    在 Tomcat 8 0 53 之后 当我安装 Tomcat 9 0 30 或 8 5 50 并将其安装为服务 使用 service bat 时 它会被安装 但 登录 为 本地服务 而不是 本地系统 帐户 这可以在windows的服务下看到
  • 个人存储库与中央存储库

    我正在尝试设置版本控制软件 目前我独自工作 但我希望这种情况会改变 并且我想将代码存储在定期备份的网络驱动器上 但在笔记本电脑的硬盘驱动器上处理相同的代码 但 GIT 让我很困惑 因此 据我所知 我应该在笔记本电脑上创建一个个人存储库 然后
  • 带身份验证的 Python 请求(access_token)

    我正在尝试在 Python 中使用 API 查询 从命令行我可以使用curl像这样 curl header Authorization access token myToken https website example id 这会给出一些
  • Spring在运行时选择bean实现

    我使用带有注释的 Spring Bean 并且需要在运行时选择不同的实现 Service public class MyService public void test 例如对于windows平台我需要MyServiceWin extend