Hi,

thanks a lot for your explanations. Now I understand the desired iPOJO 
behaviour regarding instantiation much better.

However the problem with calling a parameterless constructor remains. I've made 
a short research into the issue and created a test case which could be found at 
http://www.sendspace.com/file/imhlcx. It is a simple two-component sample (one 
component requires the other). The components are created programmatically (via 
IPOJOHelper class fragment taken from junit4osgi project). It correctly does 
not invoke a parameterless constructor of a.b.LoggerComponent when 
a.b.LoggerComponent class does not contain a @Validate annotated method. 
However, if such a method exists in the class, a parameterless constructor is 
invoked. This seems a bug to me. Could you please confirm it or let me know 
what I'm doing wrong?

Thanks,

--Hynek

On 30.7.2010, Clement Escoffier wrote:
> Hi
>
> On 29.07.2010, at 15:59, Hynek Mlnařík wrote:
>
> > Hi,
> >
> > I have two questions. To start with a simple one - is there a way to let 
> > iPOJO
> create default (empty) component instances on demand when requested by
> @Requested annotation? I only found a possibility of explicit instantiation 
> via
> @Instantiate annotation explicitly but the on-demand one would be nice.
>
> No there is not @Requested annotation. The @Instantiate annotation declares an
> instance. However:
> - @Instantiate declares the instance BUT does not create the POJO object
> (service object), which is created lazily. So, it's an empty shell until the
> service object is required (if the component is not configure to be 
> immediate).
> - You can create iPOJO instances using the Factory service (exposed by all
> 'public' component types). If you need to handle lazy instance declarations, 
> you
> can still use this API to create instances on the fly.
>
>
> >
> > The second question might be linked to the previous one. I'd like to have a
> component (logger) that gets parametrized by requesting components. I found 
> that
> a way to get it working might be using strategies like this:
> >
> > @Component
> > @Provides(strategy="LoggerComponentStrategy")
> > class LoggerComponent implements LoggerComponentInterface {
> > ...
> > }
> >
> > public class LoggerComponentStrategy extends ConfigurableCreationStrategy
> implements ServiceObjectFactory {
> >    @Override
> >    protected ServiceObjectFactory getServiceFactory(final InstanceManager
> manager) {
> >        return this;
> >    }
> >
> >    @Override
> >    public Object getService(final ComponentInstance instance) {
> >        final String name =
> instance.getInstanceDescription().getComponentDescription().getName();
> >        return safelyCreateLogger(name);
> >    }
> >  ...
> > }
> >
> > @Component
> > @Instantiate
> > class B {
> >    @Requires LoggerComponentInterface l;
> > }
> >
> > B gets only instantiated when the LoggerComponent class is annotated with
> @Instantiate annotation, ie. there already exists a Logger instance in iPOJO
> manager. That empty instance however is not used (and never will): the 
> obtained
> instance of Logger injected into B must be parametrized with "B" name. Is 
> there
> any way to have B initialize with the correct logger without the necessity of
> that useless empty Logger instance?
>
> The LoggerComponent instance should not be created until B is really requiring
> the logger. So, the 'getService' method should not be called before 'l' is
> accessed.
> Did you see a different behavior ?
>
>
> Regards,
>
> Clement

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to