Java 是否可以从HK2的属性文件中动态管理@Named injection name

Java 是否可以从HK2的属性文件中动态管理@Named injection name,java,dependency-injection,aop,hk2,qualifiers,Java,Dependency Injection,Aop,Hk2,Qualifiers,我们有一个核心Java应用程序和针对不同客户机的不同插件。我们正在使用Hk2进行依赖注入 我现在想知道,是否有可能将一些@Named限定符名称放入插件的属性文件中,这样我就可以更改属性文件的值,为不同的客户端注入不同的类实现 我的意思是有@Named(key=“plugins.impl.xplugin”)而不是@Named(“xplugin”) 这将大大有助于摆脱如此多的插件样板代码。这是一个可能的解决方案,您可以使用IterableProvider(其上有一个“命名”方法,用于在运行时选择特定

我们有一个核心Java应用程序和针对不同客户机的不同插件。我们正在使用Hk2进行依赖注入

我现在想知道,是否有可能将一些@Named限定符名称放入插件的属性文件中,这样我就可以更改属性文件的值,为不同的客户端注入不同的类实现

我的意思是有@Named(key=“plugins.impl.xplugin”)而不是@Named(“xplugin”)


这将大大有助于摆脱如此多的插件样板代码。

这是一个可能的解决方案,您可以使用IterableProvider(其上有一个“命名”方法,用于在运行时选择特定的命名版本):

@服务
公开课范例{
@注入
私人IterableProvider myService;
公共MyService getSpecificService(字符串serviceName){
返回myService.named(serviceName.get();
}
@合同
公共接口MyService{}
@服务@Named(“Foo”)
公共静态类myServiceFo实现MyService{}
@服务@命名(“酒吧”)
公共静态类MyServiceBar实现MyService{}
}
在上面的示例中,您只需将所需服务的名称(“Foo”或“Bar”)传递给getSpecificService,它将传回您选择的实现


注意:如果给定的服务没有实现给定的名称,实际的代码可能希望更复杂地了解会发生什么。

您能更详细地介绍一下希望发生什么吗?我不完全清楚你希望这个系统如何工作。当然。假设我有一个具有两个不同客户端的基本应用程序。对于ServiceA,我目前实现ServiceImpA和ServiceImpB类,以注入某些函数的特定于客户端的实现。但它们目前只是样板代码。我希望有一个公共接口和一个属性文件驱动的实现,这样我就可以为不同的客户机注入不同的服务实现。我不确定这是否足够,或者我可以试着画一些详细的图表来更清楚。听起来你要求的东西超出了注射系统的范围。您可能需要自己实现这一点。条件绑定并不难实现。这和你们想要的差不多,听起来像是,注入是在运行时完成的。通过从外部属性文件中读取实现的类路径来决定将注入哪个实现,这确实是可能的?也许你在找这样的东西?当您说“从外部属性文件读取实现的类路径”时,首先想到的是这一点。很多“插件”系统实际上都使用这个。
@Service
public class Example {
    
    @Inject
    private IterableProvider<MyService> myService;
    
    public MyService getSpecificService(String serviceName) {
        return myService.named(serviceName).get();
    }

    @Contract
    public interface MyService {}
    
    @Service @Named("Foo")
    public static class MyServiceFoo implements MyService {}
    
    @Service @Named("Bar")
    public static class MyServiceBar implements MyService {}

}