On Jan 3, 2011, at 10:57 , Bram de Kruijff wrote:
> question/observation about the dependencymanager callbacks contract. I
> noticed that init() was being invoked more then once over the lifespan
> of my service instance because 1) I constructed it with an instance
> (insted of class/factory)
Indeed, if you construct the component and supply an already created instance,
the dependency manager will use that instance every time instead of
constructing a new one itself every time the components needs to be created. So
if you create an instance yourself, make sure it can handle multiple life
cycles.
> and 2) I was adding dependencies in init,
> leading to duplicates, leading to multiple service dependecy
> callbacks.
If you add dependencies in init, you run the risk of your component getting
deactivated immediately. Since that can lead to complicated logic in your
component, you should use setInstanceBound(true) for such components, which
ensures that if an instance was already created, it will not go away again, not
even when a required dependency is not available. The instance will just sit
there and wait for that dependency to show up again.
>
> // Eg. This will result in multiple service dependencies upon
> logservice (un)availibility as we will go throught init/destroy each
> cycle
> public synchronized void init() {
> ServiceDependency logServiceDependency =
> m_dependencyManager.createServiceDependency();
> logServiceDependency.setService(LogService.class);
> logServiceDependency.setRequired(true);
> m_component.add(logServiceDependency);
> }
The other solution would be to immediately add such a dependency instead of
dynamically adding it after the component is being activated.
By the way, why do you make LogService a required dependency? In general I
think that's a bad idea, since it will bring down your whole application if
logging for some reason is not available (if you update the log bundle).
> My (naive) assumption was that init() would be called once and only
> once an a service instance, but as it seems init/destroy is called
> each time a required service becomes (unavailable).
[...]
> Question is why and what is the contract? Obvisouly, the fact that
> this results in different behaviour depending on how one instantiates
> the Component is rather confusing :S
See above, it will only if *you* supply an already created instance. In that
case, I cannot assume I can create a new instance so I have to reuse the
existing one. If you don't want that, either supply the class or a custom
factory so I can invoke it to create an instance.
Greetings, Marcel
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]