在阅读了文章 on 参考目标 (和相应的属性)之后,当target
在运行时被设置为(通常在编译时设置目标和属性,并在运行时由SCR进行评估),我仍然不理解如何检索服务。
假设有三个服务实现分别定义了@Property(name="type", value="csv")
、@Property(name="type", value="xls")
和@Property(name="type", value="pdf")
。
和一个消费者:
//@Reference(target="(type=%runtime_variable%)")
Service service;
注释 %runtime_variable%
在运行时自动评估(从设置文件读取)。
我是否应该在@Activate
/@Modified
注释方法中调用@Activate
,以便在运行时获得正确的服务?
如果我不显式使用component.xml并在@Activate
/@Modified
注释方法中动态设置目标,那么如何创建@Activate
?
我可以使用@Designate
元类型注释来简化这里的生活吗?
发布于 2017-11-20 08:00:49
您已经阅读过的文章已经7岁了,我不清楚它使用了哪些注释(是的,有几个)。我建议忽略它。现在,您最好使用声明式服务(DS)和标准的OSGi注释。
简而言之,有两个重要的部分:
/OSGI-INF
文件夹中的XML文件虽然您可以手工编写XML文件,但它们通常是由Bnd或其他构建工具使用Bnd (如我们bnd-maven-plugin)生成的。这是在构建时完成的,Bnd检查类的注释并使用提供的信息生成XML文件。因此,在运行时根本不使用注释。
至于电线,当你有
@Reference(target="(type=pdf)")
Service service;
字段service
将自动连接到Service
服务的一个实例(是的,可以有多个实例),该实例注册在与目标过滤器匹配的OSGi服务注册表中。这是由SCR在运行时完成的。通过使用PID重新配置组件,可以在运行时更改目标。您可以通过编程或通过使用配置管理的属性文件来实现这一点。
您提到的@Designate
注释与另一个名为元类型的OSGi规范有关。它允许您更好地定义配置字段的类型。这里您可以阅读更多关于如何使用元类型和声明性服务1.3的内容。
关于OSGi注释的另一个很好的信息来源是这里 (忽略特定于Liferay的注释)
为了反映您编辑的问题,您有一些选项。一是获取所有实例:
@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
地图获取服务。另一个是重新配置组件。例如,如果您像这样定义它
@Component(
configurationPid = "my.component"
)
public class MyComponent implements ... {
@Reference(target="(type=pdf)")
Service myService;
}
您可以通过my.component.cfg
配置它,在其中指定
myService.target=(type=somethingElse)
您可以使用Configuration以编程方式进行同样的操作。
发布于 2017-11-20 09:02:52
简单地使用
@Reference
Service myService;
然后,在运行时为组件创建一个配置,并设置如下过滤器:
myService.target=(mykey=1)
发布于 2018-11-19 05:05:50
你可以这样做:
@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
创建配置文件:
myService.target="(type\=pdf)"
您还可以使用(http://localhost:8888/system/console/configMgr)在运行时更改此值。
https://stackoverflow.com/questions/47393876
复制