Spring 中具体 class 条件实例化的接口
Interface to concrete class conditional instantiation in Spring
我有一个基于 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.. 基本上是一个任意字符串,不能从系统属性等中派生出来。仅仅是因为这是一个虚拟的例子。实际的管理者不是 OS相关。)
我不想更改任何 类 已自动连接到界面并正在关闭界面的人。我所需要的只是 Spring 查看一些逻辑,这些逻辑将指示变量的自动装配并为以下项连接正确的具体实例:
@Autowired
IOperatingSystemManager m_operatingSystemManager
在无数的地方。
文档和网络搜索讨论了配置文件、条件、bean 工厂、限定符等。但我们不想使用配置文件;和限定符似乎需要更改所有接口变量注释。
工厂方法看起来很有前途,但作为新手 Spring,找不到明确的答案。
实现此目的的简单且推荐的方法是什么?
不是扫描 WindowsManager
class,而是根据您的逻辑条件创建一个实现 IOperatingSystemManager
接口或另一个接口的具体实例。
首先,从 WindowsManager
class 中删除 @Component
注释。
然后,创建并扫描这个 @Configuration
class,它将充当您的 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
接口的 classes。
我不知道您使用的 spring 是哪个版本,但您可以选择
http://www.intertech.com/Blog/spring-4-conditional-bean-configuration/
在这里,如您所见,您可以根据您可以决定的条件创建一个 bean。它实际上给出了你的例子,Windows 和 Linux :),所以我相信这就是你要找的东西。
编辑:
如果你使用的是spring-boot,你还有一些其他的Conditional annotations
我有一个基于 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.. 基本上是一个任意字符串,不能从系统属性等中派生出来。仅仅是因为这是一个虚拟的例子。实际的管理者不是 OS相关。)
我不想更改任何 类 已自动连接到界面并正在关闭界面的人。我所需要的只是 Spring 查看一些逻辑,这些逻辑将指示变量的自动装配并为以下项连接正确的具体实例:
@Autowired
IOperatingSystemManager m_operatingSystemManager
在无数的地方。
文档和网络搜索讨论了配置文件、条件、bean 工厂、限定符等。但我们不想使用配置文件;和限定符似乎需要更改所有接口变量注释。
工厂方法看起来很有前途,但作为新手 Spring,找不到明确的答案。
实现此目的的简单且推荐的方法是什么?
不是扫描 WindowsManager
class,而是根据您的逻辑条件创建一个实现 IOperatingSystemManager
接口或另一个接口的具体实例。
首先,从 WindowsManager
class 中删除 @Component
注释。
然后,创建并扫描这个 @Configuration
class,它将充当您的 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
接口的 classes。
我不知道您使用的 spring 是哪个版本,但您可以选择
http://www.intertech.com/Blog/spring-4-conditional-bean-configuration/
在这里,如您所见,您可以根据您可以决定的条件创建一个 bean。它实际上给出了你的例子,Windows 和 Linux :),所以我相信这就是你要找的东西。
编辑:
如果你使用的是spring-boot,你还有一些其他的Conditional annotations