Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在OSGi参考注释中动态设置目标属性

在OSGi参考注释中动态设置目标属性
EN

Stack Overflow用户
提问于 2017-11-20 06:03:33
回答 3查看 4.6K关注 0票数 3

在阅读了文章 on 参考目标 (和相应的属性)之后,当target在运行时被设置为(通常在编译时设置目标和属性,并在运行时由SCR进行评估),我仍然不理解如何检索服务。

假设有三个服务实现分别定义了@Property(name="type", value="csv")@Property(name="type", value="xls")@Property(name="type", value="pdf")

和一个消费者:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//@Reference(target="(type=%runtime_variable%)")
Service service;

注释 %runtime_variable%在运行时自动评估(从设置文件读取)。

我是否应该在@Activate/@Modified注释方法中调用@Activate,以便在运行时获得正确的服务?

如果我不显式使用component.xml并在@Activate/@Modified注释方法中动态设置目标,那么如何创建@Activate

我可以使用@Designate元类型注释来简化这里的生活吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-20 08:00:49

您已经阅读过的文章已经7岁了,我不清楚它使用了哪些注释(是的,有几个)。我建议忽略它。现在,您最好使用声明式服务(DS)和标准的OSGi注释。

简而言之,有两个重要的部分:

  • 提供/消费服务的包中/OSGI-INF文件夹中的XML文件
  • 服务组件运行时(,SCR)--一个在运行时检查其他包的包,如果它找到上面的XML文件,负责注册和连接服务。

虽然您可以手工编写XML文件,但它们通常是由Bnd或其他构建工具使用Bnd (如我们bnd-maven-plugin)生成的。这是在构建时完成的,Bnd检查类的注释并使用提供的信息生成XML文件。因此,在运行时根本不使用注释。

至于电线,当你有

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   @Reference(target="(type=pdf)")
   Service service;

字段service将自动连接到Service服务的一个实例(是的,可以有多个实例),该实例注册在与目标过滤器匹配的OSGi服务注册表中。这是由SCR在运行时完成的。通过使用PID重新配置组件,可以在运行时更改目标。您可以通过编程或通过使用配置管理的属性文件来实现这一点。

您提到的@Designate注释与另一个名为元类型的OSGi规范有关。它允许您更好地定义配置字段的类型。这里您可以阅读更多关于如何使用元类型和声明性服务1.3的内容。

关于OSGi注释的另一个很好的信息来源是这里 (忽略特定于Liferay的注释)

为了反映您编辑的问题,您有一些选项。一是获取所有实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Reference(
 cardinality = ReferenceCardinality.MULTIPLE,
 policy = ReferencePolicy.DYNAMIC,
 policyOption = ReferencePolicyOption.GREEDY
 )
protected void setService(Service service, Map<String, Object> properties) {
   String type = MapUtil.getString(properties, "type");
   _services.put(type, service);
}

然后,您可以按类型从_services地图获取服务。另一个是重新配置组件。例如,如果您像这样定义它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component(
 configurationPid = "my.component"
)
public class MyComponent implements ... {
   @Reference(target="(type=pdf)")
   Service myService;
}    

您可以通过my.component.cfg配置它,在其中指定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myService.target=(type=somethingElse)

您可以使用Configuration以编程方式进行同样的操作。

票数 3
EN

Stack Overflow用户

发布于 2017-11-20 09:02:52

简单地使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Reference
Service myService;

然后,在运行时为组件创建一个配置,并设置如下过滤器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myService.target=(mykey=1)
票数 2
EN

Stack Overflow用户

发布于 2018-11-19 05:05:50

你可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Property(name = "myService.target", label = "My Service", description = "The target reference for the MyService, e.g. use target=(type=html) to bind to services by type.")
@Reference(name = "myService")
private Service myService;

然后可以为组件com.example.impl.MyComponent.config创建配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myService.target="(type\=pdf)"

您还可以使用(http://localhost:8888/system/console/configMgr)在运行时更改此值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47393876

复制
相关文章
4.《python自省指南》学习
  前面几篇博客我都是通过python自省来分析代码并试图得出结论。当然,仅仅通过自省能解决的问题有限,但遇到问题还是不自主的去用这个功能,觉得对于认识代码的含义还是有一定帮助的。而这些自省的知识我都是从python自省指南中学习的。所以,下文的内容基本参考自这份指南,看官可以直接转跳,笔者只是希望通过博客整理自己的思路,检验学习效果。
py3study
2020/01/20
6880
python sys.stdout
下面介绍几个我们经常不经意就会用到的sys包的命令 stdout/stderr/stdin
kirin
2020/10/27
9750
Python中os与sys两模块的区别 原
os: This module provides a portable way of using operating system dependent functionality.
晓歌
2018/08/15
4890
python 重定向输入输出流 脚本
file-like objects that save standard output text in a string and provide
用户5760343
2022/05/13
6460
python标准输入输出
sys.stdin与可读文件对象具有相同的类型,sys.stdout与可写文件对象具有相同的类型
py3study
2020/01/08
8620
Python unittest 测试输入(input)和输出(print)
测试输入输出的解决方法是: 将标准输入输出定向到一个StringIO类(python3是 io.StringIO)。
饶文津
2020/05/31
1.7K0
【Python】重定向 Stream 到
Python 系统模块 sys 中有三个变量 stdin 、 stdout 与 stderr ,分别对应标准输入流、输出流与错误流。stdin 默认指向键盘, stdout 与 stderr 默认指向控制台。
py3study
2020/01/17
9010
AttributeError: 'dic
这是因为换成了Python3.6.5,Python3.6.5已经删除了has_key()方法,改成了下面的写法:
py3study
2020/01/19
6150
2018年8月25日python中os模块和sys模块的区别
    os: This module provides a portable way of using operating system dependent functionality.
武军超
2018/09/27
8640
Python中标准输入(stdin)、标准输出(stdout)、标准错误(stdout)的用法
Python 3.x 中 input() 函数可以实现提示输入,python 2.x 中要使用 raw_input(),例如:
Python学习者
2023/08/01
4310
Python 代码片段总结
生成的pyc可以跨平台使用,但是只能这样用python xxx.pyc,而不能使用./xxx.pyc执行,因为缺少了shebang的支持,不过貌似Binfmt_misc可以解决这个问题,ubuntu下apt-get install binfmt-support可以直接安装。
老高的技术博客
2022/12/28
6120
Python 代码片段总结
python中的sys模块函数
Sys模块函数之多,我只能选取自己认为比较实用的一些函数列在此处。借马云找员工的说法,”找最合适的而不是最天才的”,这句话,我个人觉得在很多方面都能适应,学习也不在话下。Sys模块功能的确很多,但我们应该将重点放在那些功能才是最适合我们的,为此,我列的这些函数,就是我认为比较适合我以后开发的函数。 (1)sys.argv 很多人会想,我如何给我的程序在外部传递参数呢?这个,就可以实现。如: Tesy.py Import sys Print sys.argv[number] 一般情况下,number为0是这个脚本的名字,1,2…则为命令行下传递的参数.如: Test.py脚本内容: import sys
全栈程序员站长
2022/09/09
9470
python模块—command and
  返回结果是一个tuple元组,第一个值为接收状态码,int类型,0表示正常,非0表示异常;第二个值为字符串,即shell命令执行的结果
py3study
2020/01/08
4950
解决jupyter控制台出现中文乱码的问题
前几天在Python钻石交流群【盼头】问了一道Jupyter乱码处理的问题,如下图所示。
前端皮皮
2022/08/17
1.6K0
解决jupyter控制台出现中文乱码的问题
了解和分析iOS Crash Report
翻译自苹果官方文档:Understanding and Analyzing Application Crash Reports
nimomeng
2018/09/13
1.7K0
了解和分析iOS Crash Report
实现一个 BrainFuck 解释器
BrainFuck是一门非常简单的图灵完备的编程语言,只有 8 个指令: Brainfuck 包含一个有 30,000 个单元为 0 的数组,和一个数据指针指向当前的单元。
杜逸先
2023/04/13
6610
Python教程:sys.stdout方法
Python中sys 模块中的一个方法是stdout ,它使用其参数直接显示在控制台窗口上。
Python学习者
2023/10/23
4190
实现一个Brainfuck解释器
Brainfuck 包含一个有 30,000 个单元为 0 的数组,和一个数据指针指向当前的单元。
杜逸先
2023/04/06
5990
点击加载更多

相似问题

Odoo 12:'report.label.report_label‘AttributeError

116

AttributeError:“”ca.report“”对象没有属性“”appliquer“”

122

Input、sys.stdin和functions

110

使用sys.stdin

114

Pandas-分析错误AttributeError:'DataFrame‘对象没有属性'profile_report’

84
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文