There are some inaccuracies in what Christian wrote.

> On Mar 28, 2017, at 2:19 AM, Christian Schneider <ch...@die-schneider.net> 
> wrote:
> 
> On 28.03.2017 11:07, erwan wrote:
>> Hello,
>> Coming back again to get light!
>> I have a bundle of questions regarding DS.
>> How do you use a service without being yourself a service?
> You can not use a service without being a service in DS. You can hide your 
> service though.
> If you set serviceClass to a class in a private package then no other bundle 
> can use this service.
> So this works nicely if you have some internal wiring.

A DS component does not have to expose any service interfaces.  Such a 
component will not be registered as a service.  It will be immediate and a 
singleton.
If you are using the DS spec annotations, the default service property is all 
the directly implemented interfaces of your class, so if there are no such 
interfaces, by default your component will not be registered as a service; 
otherwise you have to specify service={} in the @Component annotation.

>> 
>> I understand that each service is managed by the scr and so need to be
>> activated at a time. If I have a class that need to do a reference to a
>> service but that I want to control instantiation, is this possible to
>> instantiate a service on demand (newInstance?) ?
> I think you can create a DS component instance programmatically but I do not 
> remember any more how to do it exactly.

You can try to use a factory component but these have a very peculiar lifecycle 
that in my experience makes them impossible to understand and useless.  For 
instance, I’ve been trying to explain their behavior for a couple months to 
someone on the felix lists.  There’s a felix-proprietary extension 
@DSExt.PersistentFactoryComponent  that makes the lifecycle like a normal 
component, but I would strongly advise seeking another solution.

I would consider whether some combination of configuring several service 
instances of the same DS component using factory configurations and/or using 
prototype scope would meet your needs.

>> 
>> How do you manage to deal with multiple instances of a service?
>> For example:
>> 
>> class dummy {
>> 
>> @Reference
>> private Service service1
>> 
>> @Reference
>> private Service service2
>> 
>> }
> 
> For this case you typically use a filter and set a service property on each 
> of the implementing classes.
> 
> Btw you can even set a service property for a DS service that you have not 
> written.
> See 
> http://liquid-reality.de/display/liquid/2016/09/27/Some+hints+to+boost+your+productivity+with+declarative+services
> Paragraph "Override service properties using config “

This reference is mostly correct except for claiming that components must 
expose services.  I think it would be helpful if it provided an example of 
filter syntax (people often leave off the parentheses the first time) and 
pointed out that all the @Reference choices are available for the event 
strategy (and indeed lookup strategy) by explicitly specifying them in the 
@Reference annotation.  While I think it’s pretty likely that constructor 
injection will still be in the R7 spec when it comes out I prefer not to assert 
such things categorically.

thanks
david jencks

> 
> Christian
> 
> 
> -- 
> Christian Schneider
> http://www.liquid-reality.de
> 
> Open Source Architect
> http://www.talend.com
> 

Reply via email to