Apache Felix - 如何保证在激活方法之前注入动态引用

时间:2017-09-04 11:33:50

标签: java osgi apache-felix

以下是有关案件的摘要:

我们有一些配置类,它可以有多个实例。它假设我们在一个捆绑中提供多个配置。这是一个范围。

@Service
@Component
public class SampleConfigurationImpl implements SampleConfiguration {
    // declaration of some properties, init method and etc...
}

我们还有一项使用这些配置的服务:

@Service
@Component
public class SampleServiceImpl implements SampleService {

    @Reference(
        referenceInterface = SampleConfiguration.class,
        cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
        policy = ReferencePolicy.DYNAMIC)
    private Map<String, SampleConfiguration> sampleConfigurations = new ConcurrentHashMap<>();

    private void bindSampleConfigurations(SampleConfiguration sampleConfiguration) {
        sampleConfigurations.put(sampleConfiguration.getName(), sampleConfiguration);
    }

    private void unbindSampleConfigurations(SampleConfiguration sampleConfiguration) {
        sampleConfigurations.remove(sampleConfiguration.getName());
    }

    @Activate
    private void init() {
        System.out.println(sampleConfigurations.size());
    }

}

那么,我可以得到一些保证,在调用init方法时,所有配置都被注入(至少是当前的bundle)吗?也许还有一些替代方法可以做到这一点。据我所知,另一个捆绑包可以带来新的配置,获得保证是不真实的,但只有一个捆绑包的情况下它才有用。

在实践中,在init方法中只有部分配置可能是这种情况。特别是当你有几种类型的配置或者一个服务使用另一个具有动态引用并且第一个服务依赖于注入所有内容的事实时,它会更加困难。

最令人不快的是它可以在init方法之前和之后绑定/解除绑定配置。 也许有一些方法可以保证它在init方法之后总是绑定...

我对任何信息感兴趣。能够回答两个问题(保证之前或之后)将会很棒。可能有人有经验如何解决这个问题,并可以与我分享。

感谢。

1 个答案:

答案 0 :(得分:1)

不,不是我所知道的。在这种情况下我通常做的事情(取决于你的用例,取决于你的激活码是否可以运行多次)是创建一个'reallyActivate'方法,我从常规激活和bindSampleConfigurations调用(+设置)激活中的isActivated标志)。然后,每次新的SampleConfiguration绑定时,我都可以执行一些逻辑,即使它是在激活之后。这对你的案子有帮助吗?