java - Spring 中具体类条件实例化的接口(interface)

标签 java spring pojo

我有一个基于 Spring 的 Java 应用程序,其中许多类使用以下 Autowiring 接口(interface)。它们在所有地方都使用此接口(interface)。

@Autowired
private IOperatingSystemManager m_operatingSystemManager;

目前只有一种接口(interface)实现如下:

@Component
public class WindowsManager implements IOperatingSystemManager 
{
 // Windows based shenanigans
}

应用程序按预期运行。 Spring 是快乐的。每个人都很开心。 好吧,不是每个人...

所以,我想添加另一个 IOperatingSystemManager 的具体实现..

@Component
public class LinuxManager implements IOperatingSystemManager 
{
 // Linux based shenanigans
}

我们想要的是根据属性文件设置有条件地自动连接 IOperatingSystemManager。 (比如说.. os=windows.. 基本上是一个任意字符串,不能从系统属性等中派生出来。仅仅是因为这是一个虚拟示例。实际的管理器与操作系统无关。)

我不想更改任何已自动连接到接口(interface)并在接口(interface)外工作的类。我所需要的只是让 Spring 查看一些逻辑,这些逻辑将指示变量的 Autowiring 并为以下项连接正确的具体实例:

@Autowired
IOperatingSystemManager m_operatingSystemManager 

在无数的地方。

文档和网络搜索谈论配置文件、条件、bean 工厂、限定符等。但我们不想使用配置文件;和限定符似乎需要更改所有接口(interface)变量注释。

工厂方法看起来很有前途,但作为 Spring 的新手,找不到明确的答案。

实现此目标的简单且推荐的方法是什么?

最佳答案

不是扫描 WindowsManager 类,而是创建一个具体实例来实现 IOperatingSystemManager 接口(interface)或另一个具体实例,具体取决于您的逻辑条件。

首先,从 WindowsManager 类中删除 @Component 注释。

然后,创建并扫描这个 @Configuration 类,它将充当您的 bean 的工厂:

@Configuration
public class OperatingSystemManagerFactory {

    @Bean
    public IOperatingSystemManager getOperatingSystemManager() {
        if ( /* some logic that evaluates to true if windows */ ) {
            return new WindowsManager();
        } else {
            // Linux default option ;)
            return new LinuxManager();
        }
    }
}

使用此解决方案,您不需要更新任何引用 IOperatingSystemManager 接口(interface)的类。

关于java - Spring 中具体类条件实例化的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543636/

相关文章:

java - 使用 ehcache 编写自定义 RefreshAheadCacheFactory

java - @ControllerAdvice 不触发

机器人 RestClientException : no suitable HttpMessageConverter found

android - 将 JSON 对象保存到 Android 中的 Firebase

java - 将 list<map<string,object>> 转换为 POJO 类的对象

java - 如何使用 fragment (Android)在 Activity 之间保留动态Arraylist元素

java - matlab代码的空指针异常

java - 如何在Android Studio中正确导入Android项目?

eclipse - 如何在 tomcat 服务器中更改我的 webapp 的 url?

java - 如何从 POJO 或 JavaBean 创建 Backbone 模型?