【发布时间】:2018-04-24 01:30:15
【问题描述】:
我正在尝试了解如何在 OSGi(特别是 Adobe Experience Manager (AEM) 中使用的 Apache Felix)中控制依赖注入。我在一个引用接口的字段上有一个带有@Reference 注释的servlet——在我的例子中,它代表一个安全的文档签名提供程序。我有一个实现接口的实现类,它会自动注入到 servlet 中。
在 servlet 中:
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private DocumentSigningProvider signingProvider;
...
URL redirectUrl = signingProvider.Sign(...);
和我的实现类:
@Component(metatype=true)
@Service
@Property(name = "service.ranking", intValue = 1000)
public class DocumentSigningProviderDocuSignImpl implements DocumentSigningProvider {
如果我编写第二个实现,我可以通过service.ranking 值控制注入哪一个——最高数字获胜。如果没有在任何实现上声明排名,则最老的获胜。
到目前为止,一切都很好——除了要更改我需要重新编译和重新部署的值。我需要在运行时或通过与环境或“运行模式”相关的配置文件来控制它。我不知道该怎么做。
由于@Component 声明了metatype=true,@Property 注释在 类在 OSGi 控制台的 GUI 中生成一个控件。我可以使用该 GUI 在运行时更改值。但是service.ranking 是在@Property 中声明的类本身,它似乎不会在GUI 中生成控件。
此外,以类命名的配置文件在运行时提供默认值,我可以为每个环境或“运行模式”设置不同的配置文件。这对我也有用;在一个环境中,我可以配置一个模拟实现,并在另一个环境中使用“真实”实现。但同样,这些配置文件似乎适用于 @Property 声明 inside 类,但不适用于 on 类。
我在这里阅读了很多关于这个主题的帖子,但没有一个涉及在 OSGi GUI 或配置文件中公开service.ranking。
有什么方法可以控制注入哪个类而不需要修改、重新编译和重新部署源代码?
【问题讨论】:
标签: java dependency-injection osgi apache-felix