Please, please, please do note use spring packages.  Spring should be a runtime 
and not compile time dependency.  If you leave spring as a compile time 
dependency you'll ate


On Feb 9, 2013, at 12:05 AM, Kelven Yang <kelven.y...@citrix.com> wrote:

> 
> Apologize for such a long email first, if you are interested, please read
> on...
> 
> 
> Auto-scan globally is never a good idea and we are currently doing it just
> for the reason of getting existing code quickly converted. I'm currently
> profiling some details on how much time Spring has spent for scanning the
> component and how much time it spends to resolve dependency and performs
> auto-wiring.
> 
> There are both "pros and cons" for in doing in annotation way or in XML
> way. Historically in CloudStack we are doing code-refactoring quite often,
> this makes using annotation attractive to CloudStack developers. However,
> we also need flexibility provided by XML for people to customize
> CloudStack after deployment, so historically, CloudStack prefers to take
> advantages of both annotation way and XML way. For built-in or other basic
> components like DAOs, using annotations can save developers a lot of
> typing work. For pluggable components like Adapters, Network Elements,
> having them in XML makes more sense.
> 
> As a general guideline, we should keep component as independent of others
> as possible, as loosely coupled with other as possible. The motivation of
> adopting Spring is for that purpose, to enforce a consistent way of
> developing pluggable, unit-testable components.
> 
> However, there is never a perfect solution that can satisfy everyone's
> needs, I would prefer to just using auto-wiring and leaving component
> definitions all in XML, in this way, component and a particular container
> are not tightly coupled (does not necessarily to be Spring), however, in
> reality, using @Component with caution can give developers decent freedom
> to write component independently (they don't need to remember to edit Java
> and XML at multiple places and not everyone likes XML soup).
> 
> A possible solution to combine both the advantages of using @Component and
> XML <bean> definitions could be
> 
> Option 1, Using coding convention to reduce the auto-scan scope, for
> example, 
> 
> All components (Spring component specifically) have to share with the same
> java package namespace, for example, org.apache.cloudstack.component.
> overall module/java package structure would look like,
>    Cloud-engine (module)
>        org.apache.cloudstack.component.XyzMgr
>          org.apache.cloudstack.component.AbcAdapter
> 
>    Cloud-cool-plugin (module)
>        org.apache.cloudstack.component.CoolMgr
>        org.apache.cloudstack.component.CoolAdapter
> 
> 
> 
> And we only scan org.apache.cloudstack.component.
> 
> We didn't use this approach for the reason that this involves with a lot
> of directory refactoring work, and this is too bad for branch merges.
> 
> Option 2, Using build-time XML auto-generation
> 
> With this option, developers can continue to use @Component for
> meta-programming, we can add a step in build-process that we can
> automatically generate the Spring XML file for components that have been
> annotated by @Component.
> 
> However, our maven build is already slow now, what we saved in
> bootstrapping will have to be paid at build time, so for developers, this
> option may still looks slow
> 
> Option 3, Using @Configuration (one more Spring annotation!)
> Cloud-server and pluggable module, each can have a per-module Spring
> component configuration class (annotated by @Configuration) and we only
> scan configuration components at bootstrap.
> 
> Option 3 does not need us to refactor existing directory structure, and
> have the flexibility for developers to do module development
> independently, as I mentioned early, I'm profiling the Spring bootstrap
> process, if it is confirmed that majority of time is spent in scanning
> instead of auto-wiring, I'm actually leaning towards this option.
> 
> As of whether or not to strictly limit the usage of Spring specific stuff,
> **never** or **ever** to use @Component, I'm not a perfect-ist but a more
> practical one, so using @Component only for meta programming looks fine to
> me. And In this option, @Component is actually not necessarily to be
> defined by Spring, we just happen to borrow it and that's it. I'm kind of
> buying the point that with such a powerful editor like Eclipse, it seems
> to be much easier for code-refactoring if things are written in "java"
> instead of XML.
> 
> Kelven  
> 
> 
> 
> On 2/8/13 9:38 PM, "Darren Shepherd" <dar...@godaddy.com> wrote:
> 
>> Frank,
>> 
>> This is probably not the answer you looking for, but I have to just
>> throw in my two cents.  When should you use @Component?  Never.  The
>> cleanest way to use the Spring container is to *never* "import
>> org.springframework".  Only bootstrap and obviously spring specific code
>> should import spring packages.  JSR250 and JSR330 provide standards
>> compliant annotations that can be used in place of the Spring one's that
>> give most of all the functionality.  Refer to
>> http://static.springsource.org/spring/docs/3.2.x/spring-framework-referenc
>> e/html/beans.html#beans-standard-annotations.
>> The standard compliant annotation of @Component would be @Named from
>> JSR250 (which is included in the JDK at this point).
>> 
>> Regarding when to use @Named and when to register the bean in XML.  You
>> should never use @Named.  I'm sure many will disagree with me but past
>> experiences have over and over again shown to me that component scanning
>> on large scale projects is a bad idea.  Ignoring bad initialization
>> performance, component scanning ends up introducing weird difficult to
>> debug issues when some does something dumb.  It is better to have a
>> clear and definitive source regarding what is registered in your
>> context.
>> 
>> Additionally if you get into context hierarchies (which I hope you do,
>> but that is a different topic altogether), component scanning blows up.
>> 
>> Darren
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> -------- Original Message --------
>> Subject: what's rule for using @Component and xml bean file
>> From: Frank Zhang <frank.zh...@citrix.com>
>> Date: Fri, February 08, 2013 6:39 pm
>> To: "cloudstack-dev@incubator.apache.org"
>> <cloudstack-dev@incubator.apache.org>
>> 
>> 
>> I see client/tomcatconf/componentContext.xml.in defining lots of beans
>> while I also see many beans use @Component
>> Is there any guideline here?
> 

Reply via email to