【问题标题】:How can I read factory configurations for my OSGI instance如何读取我的 OSGI 实例的工厂配置
【发布时间】:2015-12-10 13:25:20
【问题描述】:

我有一个由 sling 实例化的 OSGi Transformer 组件。在我的 OSGi 组件中,我有以下注释:

@Component(configurationFactory = true, metatype = true, policy =       ConfigurationPolicy.REQUIRE, label = "CDN Link Rewriter", description = "Rewrites links to all static files to use configurable CDN")
@Service(value = TransformerFactory.class)
public class StaticLinkTransformer implements Transformer,
    TransformerFactory

我有一些属性被我注释为@Property

@Property(label = "CDN Url prefix", description = "CDN URL prefix", value = "")
private static final String CDN_URL_PREFIX = "cdn_url_prefix";

现在我可以在 felix 控制台中使用“+”号为此类提供多种配置。如果我有“N”个配置,sling 正在实例化我的 StaticLinkRewriter 类的 N 个对象。

问题:如何获得实例化对象的正确配置?我的意思是,当 sling 实例化我的对象时,我如何获得实例化对象的配置?

【问题讨论】:

    标签: osgi apache-felix osgi-bundle


    【解决方案1】:

    我认为这个组件不是由 Sling 而是由 Declarative Services 实例化的。

    如果你实现了activate方法,你可以得到配置。例如:

    @Activate
    void activate(ComponentContext ctx) {
       Dictionary configuration = ctx.getProperties();
       // use your configuration
    }
    

    有关详细信息,请参阅 OSGi 纲要规范的 112 声明式服务规范一章。

    【讨论】:

    • 感谢您的回答,但只有在我添加新配置时才会调用激活方法。但是我想在实例化我的类的对象时获取配置。代码中有一个 init() 方法,在实例化对象时会调用该方法。在该方法中,我无法获取配置:init 方法如下:@Override public void init( org.apache.sling.rewriter.ProcessingContext context, org.apache.sling.rewriter.ProcessingComponentConfiguration config)
    • 谁调用了那个init方法?您确定在激活方法之前调用了 init 方法吗?我可以想象以下顺序:对象由DS实例化,调用activate方法,注册服务,由于注册了OSGi服务,其他技术调用init方法。如果你在activate方法中将你的配置保存到一个成员变量中,你也可以在init方法中访问它。
    • 1.我正在尝试通过实现 Sling Transformer 来实现自定义链接重写器。如果我的自定义链接重写器有 3 组配置,则 sling 正在创建我的类的 3 个实例。即时创建后吊索调用我的 init 方法。在这方面,@Activate 不会在任何地方出现。因此我无法访问配置。 2. 即使我在调用激活时将配置保存在静态变量中,我最终会在所有三个实例中获得相同的配置,这违背了配置工厂的全部目的。我想我在这里错过了一些大块。
    • 我说的是成员变量,不是静态变量。激活不是静态的,而是一个成员函数。因此,您可以将其保存到成员变量中。如果你实现了 TransformerFactory 来实例化你的被调用的 Transformer(我不知道那部分不在示例代码 sn-p 中),你可以将配置传递给新的 Transformer 实例。我认为在同一个类中实现 TransformerFactory 和 Transformer 不是一个好主意(虽然我不知道这些接口是什么意思)
    • 您的建议奏效了。我将实现和工厂分开并使用了成员变量。它现在正在工作。谢谢。
    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多