当前位置: 首页 > 知识库问答 >
问题:

Spring中具体类条件实例化的接口

钱渊
2023-03-14

我有一个基于Spring的Java应用程序,其中许多类使用以下自动生成的接口...

@Autowired
private IOperatingSystemManager m_operatingSystemManager;

现在,接口只有一个实现,如下所示:

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

应用程序的工作原理与预期一致。Spring是快乐的。大家都很高兴。好吧,不是每个人。。。

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

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

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

我不想更改任何已经自动绑定到接口并正在脱离接口工作的类。我所需要的只是Spring看一些逻辑,这些逻辑将决定变量的自动连接,并连接正确的具体实例:

@Autowired
IOperatingSystemManager m_operatingSystemManager 

在所有无数的地方。

文件

工厂化的方法看起来很有希望,但对于Spring来说是新的,无法找到一个明确的答案。

实现这一点的简单和推荐的方法是什么?

共有2个答案

邓深
2023-03-14

我不知道您使用的是哪个版本的spring,但是您可以选择这个版本

http://www.intertech.com/Blog/spring-4-conditional-bean-configuration/

在这里,如您所见,您可以根据您可以决定的条件创建bean。它实际上给出了你的例子,视窗和Linux:),所以我相信这就是你正在寻找的。

编辑:

如果您使用的是Spring启动,您还有其他一些条件注释

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html#boot-特征条件注释

百里光熙
2023-03-14

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

首先,从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接口的任何类。

 类似资料:
  • 本文向大家介绍python实例化对象的具体方法,包括了python实例化对象的具体方法的使用技巧和注意事项,需要的朋友参考一下 python中同样使用关键字class创建一个类,类名称第一个字母大写,可以带括号也可以不带括号;python中实例化类不需要使用关键字new(也没有这个关键字),类的实例化类似函数调用方式; 创建类的对象(实例化类) python中实例化类不需要使用关键字new(也没有

  • 我需要通过@Autowired注入服务类的具体实现。 服务接口: 实现: 服务中的方法带有@ Transactional注释 现在我想将postServiceImpl注入到我的控制器中——因为我需要使用实现中的一个方法,它不在接口中: 我收到NoSuchBeanDefinitionException并显示以下消息: 没有[(…)类型的合格bean。找到依赖项的PostServiceImpl]:预计

  • 作为条件表达式的结果,我很难获得相关实体对象的列表。我有两个具有多对多关系的对象 但是,这并不像预期的那样有效,因为投影API似乎只支持投影标量属性,而不支持投影实体对象。是否可以通过投影或其他标准API指定这种类型的选择?

  • 问题内容: 扩展初始化接口时提出的问题?),我们在实例化接口的同时用实现的类对其进行初始化。 我的问题是,为什么首先要使用Interface实例化它?为什么我不能直接用实现的类实例化它?例如。: Doc是接口,而SimpleDoc正在实现它。SimpleDoc有什么问题?mydoc = new SimpleDoc(); 哪里会失败? 问题答案: 通常,最好的方法是依赖系统中的抽象类型(接口或抽象类

  • 我有这个实体类: 我有这个Web服务类: 当我尝试启动服务时,会显示此错误: 我无法编辑BaseEntity类。有没有一种方法可以在不注释BaseEntity类的情况下创建Web服务? 我不想使用MOXy框架,因为我已经在线使用了Web服务。我的想法是,如果我只能封送客户类,而不能封送她的BaseEntity类。附加信息:我的客户机和我的Web服务可以访问Customer类所在的同一个包。

  • 我有一节课: 和接口: 这是完整的代码,让它更清晰: (我从和创建了内部类,使其更加简化。)