gpt4 book ai didi

java - 如何在运行时控制 OSGi 中的依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-30 06:25:47 25 4
gpt4 key购买 nike

我试图了解如何控制 OSGi 中的依赖项注入(inject)(特别是 Adob​​e Experience Manager (AEM) 中使用的 Apache Felix)。我有一个 servlet,在引用接口(interface)的字段上带有 @Reference 注释 —— 在我的例子中,它代表一个安全文档签名提供程序。我有一个实现该接口(interface)的实现类,它会自动注入(inject)到 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 值控制注入(inject)哪个实现 - 数字最高者获胜。如果任何实现均未声明排名,则最旧的实现获胜。

到目前为止,一切都很好——除了要更改值我需要重新编译和重新部署。我需要在运行时或通过与环境或“运行模式”相关的配置文件来控制它。我不知道该怎么做。

由于@Component声明metatype=true@Property注释中生成一个控件OSGi 控制台的 GUI。我可以使用该 GUI 在运行时更改值。但是 service.ranking 是在类本身的 @Property 中声明的,并且它似乎没有在 GUI 中生成控件.

此外,以类命名的配置文件在运行时提供默认值,并且我可以为每个环境或“运行模式”使用不同的配置文件。这对我也有用;在一种环境中,我可以配置模拟实现,并在另一种环境中使用“真实”实现。但同样,这些配置文件似乎适用于类内部@Property声明,但不适用于类之上

我在这里阅读了许多有关此主题的主题,但没有涉及在 OSGi GUI 或配置文件中公开 service.ranking

有没有办法可以控制注入(inject)哪个类,而不需要修改、重新编译和重新部署源代码?

最佳答案

在声明性服务中,您可以通过为组件提供配置并设置属性来在运行时覆盖任何服务属性。因此,设置 service.ranking=1 或类似内容实际上应该有效。

有一点需要注意。默认情况下,声明性服务绑定(bind)到第一个可用服务并与之保持不变。因此,如果您想确保使用排名较高的服务,即使它晚于排名较低的服务,那么您需要在消费者端使用此选项:

@Reference(policyOption=ReferencePolicyOption.GREEDY)

这可以确保 DS 在稍后出现更好的服务时切换服务。

如果您想更具体地在消费者端使用什么服务,您还可以在运行时使用过滤器。

target.signingProvider=(myproperty=myvalue)

我收集了更多提示here .

关于java - 如何在运行时控制 OSGi 中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47229217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com