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

Apache Felix - How to guarantee injecting of dynamic references before an activate method

这是感兴趣案例的片段:

我们有一些配置 class 它可以有多个实例。它假设我们在一个包中提供多种配置。这是一个范围。

@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 方法时注入所有配置(至少是当前包)?也许有一些替代方法可以做到这一点。我知道另一个捆绑包可以带来新的配置,并且获得保证是不真实的,但它对只有一个捆绑包的情况很感兴趣。

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

最不爽的是它可以bind/unbind配置init方法前后。 也许有一些方法可以保证它总是在 init 方法之后绑定...

我对任何信息都感兴趣。如果能得到两个问题的答案(之前或之后的保证),那就太好了。可能有人有解决此类问题的经验,可以与我分享。

谢谢。

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