Wow, this was really helpful! I was able to get my extension set up and thing 
seem to be injecting just fine.

-- 
Chris Suich
chris.su...@netapp.com
NetApp Software Engineer
Data Center Platforms – Cloud Solutions
Citrix, Cisco & Red Hat

On Oct 24, 2013, at 5:00 PM, Darren Shepherd <darren.s.sheph...@gmail.com> 
wrote:

> Let me clarify some terms first, this might be confusing.  There is
> instantiation and then there is initialization.  Instantiation is
> calling the constructor.  Initialization is calling the
> @PostConstruct.  Beyond that there is what I've been calling
> "CloudStack Extended Lifecycle,"  This for bean implementing
> ComponentLifecycle or an extensible interface, like DataStoreProvider.
> Since I'm not sure which aspect your asking about, I'll just explain
> the whole process.
> 
> Spring is now arranged into a hierarchy of contexts.  The parent
> contexts are initialized first, and then the children afterwards.  So
> the process goes as follows
> 
> 1. Instantiate all beans in the current context - There is no way to
> deterministically control the instantiation of beans within a context.
> This is just a fundamental fact that can't change.  So beans are
> randomly instantiated.
> 2. Inject all dependencies on all beans in current context - This
> entails injecting all the dependencies defined by @Inject.  The order
> is not really deterministic which beans get injected first.
> 3. Initialize all beans in graph order - This entails calling all
> methods that have @PostConstruct.  Once the beans are all wired up
> they form a graph of dependencies.  Child beans are initialized first,
> then the parent.  CloudStack has a lot of circular dependencies in the
> beans currently, so while this is intended to be deterministic, you
> may find issues.  The storage code is particularly bad in this area,
> but if you are defining your beans in your own context then this
> doesn't apply.  Only if you add beans to the "core" context will you
> find issues.  If a class has an initialization dependency that is not
> express through its bean dependencies, you can add "depends-on" to the
> bean defintion in the XML.  This will ensure that the specified bean
> will be initialized first.
> 4. CloudStack Extended LifeCycle: Call ComponentLifecycle.configure()
> on all ComponentLifecycle implementing beans
> 5. CloudStack Extended LifeCycle: Register extensible types.  This
> phase happens really at the same time as step 4.  When an extensible
> type is registered nothing typically happens except that its stored in
> a list.  Storage is different in that when the DataStoreProvider is
> registered, at that time DataStoreProvider.configure() will be called.
> Notice that even though DataStoreProvider.configure() has the same
> signature as ComponentLifecycle.configure() it is different.  Honestly
> with the new Spring code we can remove DataStoreProvider completely,
> but that's a different discussion
> 
> After the context is initialized following the steps above, it will
> then initialize all the child contexts.  Once all contexts have been
> completely initialized, ComponentLifecycle.start() will be call on all
> beans starting with the parent context, then children.
> 
> A general guide line of when to use ComponentLifecycle.start() vs
> @PostConstruct is if your initialization logic starts a background
> thread or requires all extensible types to be registered, then you
> should use ComponentLifecycle.start().  All other initialization code
> should be in @PostConstruct.  ComponentLifecycle.configure() is
> largely useless in my mind and should be avoided.
> 
> I hope somewhere in all that is something that answered your question.
> If not you can email me directly with your spring config and I can
> help, or we can setup a GTM.
> 
> Darren
> 
> On Thu, Oct 24, 2013 at 1:04 PM, SuichII, Christopher
> <chris.su...@netapp.com> wrote:
>> Darren,
>> 
>> I’m switching my plugin over to use the new modularized Spring stuff you 
>> just merged and there is something I’m still battling with. I have other 
>> beans that were previously instantiated before my DataStoreProvider which 
>> get injected into the provider, lifecycle, etc. So, those beans need to be 
>> instantiated before the DataStoreProvider. How can I ensure those beans are 
>> created and setup before the DataStoreProvider does?
>> 
>> -Chris
>> --
>> Chris Suich
>> chris.su...@netapp.com
>> NetApp Software Engineer
>> Data Center Platforms – Cloud Solutions
>> Citrix, Cisco & Red Hat
>> 

Reply via email to