spring-boot - 捆绑激活后 OSGI 组件未激活
问题描述
OSGI 的新手。
我在 OSGI 中使用 spring-boot。在 bundle activator 中,spring-boot 应用程序启动成功。我有一个组件类如下
@Service // spring-boot annotation
@Component(immediate = true) // osgi annotation
public class Test {
@Activate
public void activate() {
System.out.println("osgi component activated");
}
@Reference
public void set(ServiceComponentXXX a) {
System.out.println("reference got");
}
Test 类只绑定服务,不被任何其他服务绑定。ServiceComponnetXXX 类来自其他捆绑包。activate 和 set 方法永远不会执行。
删除 spring-boot 注释@Service 后,代码工作正常。所以问题是一个类可以既是 spring-boot 组件又是 OSGI 组件?
解决方案
让一个类两者兼而有之是没有意义的。Spring Boot 和声明式服务的生命周期是完全分开的。因此,在最好的情况下,您最终会得到该类的两个实例——一个由 Spring Boot 填充,另一个由声明性服务填充——但它更有可能只是不起作用。
我建议决定是否要使用 OSGi。如果是,那么只需使用声明性服务而不是 spring boot。通常决定一个注入框架。在 OSGi 中,您可以通过捆绑拥有一个注入框架,但它们必须与 OSGi 兼容。Spring Boot 并不是真正的 OSGi 兼容。
推荐阅读
- java - 导入与当前类同名的类
- python - 使用打印功能的缩进逻辑
- python - 使用 Selenium-Python 检查页面中是否存在文本的最佳方法
- algorithm - 测试一组中的哪些圆相交
- ml - 在 Poly/ML 编程中计算没有重复的元素列表
- c# - 如何在c#中解码一些编码文本
- asp.net-core - Conditional rendering in asp.net core razor, without evaluating expression
- amazon-web-services - 如何提高 AWS Global Accelerator 或 Route53 延迟路由的故障转移速度?
- javascript - 无法在 Webview android 中访问地理位置
- c++ - 字符的输入/输出操作