下面是一个有趣的案例片段:
我们有一些配置类,它可以有多个示例。它假设我们在一个包中提供多个配置。这是一个范围。
@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可以带来新的配置,得到保证是不真实的,但是对于只有一个bundle的情况,它是很有兴趣的。
在实践中,当init方法中只有部分配置时,这种情况可能会出现。尤其是当您有几种类型的配置或者一个服务使用另一种具有动态引用的服务,并且第一个服务依赖于所有内容都被注入的事实时,情况更为困难。
最令人不快的是,它可以在init方法之前和之后绑定/取消绑定配置。也许有某种方法可以保证它总是在init方法之后绑定。。。
我对任何信息都感兴趣。这将是伟大的得到两个问题的答案(保证之前或之后)。可能有人有解决这个问题的经验,可以和我分享。
谢谢。
1条答案
按热度按时间inkz8wg91#
不,据我所知不是。在这种情况下,我通常做的事情(取决于您的用例,这取决于您的激活代码是否可以多次运行)是创建一个“reallyactivate”方法,我从常规activate和bindsampleconfigurations调用它(+在activate中设置isactivated标志)。然后我可以在每次绑定新的sampleconfiguration时执行一些逻辑,即使是在激活之后。这对你的案子有帮助吗?