A simple pluggable API sounds like a reasonable approach to me.   For
some situations, a pure reflection scanner might work better.  For
others, it won't scale.   You might need to temporarily switch to a
different scanner to determine if it's the cause of some particular
bug.   Or perhaps the target appserver itself provides some form of
high-optimized scanner.

On Fri, Feb 27, 2009 at 4:31 PM, Curtiss Howard
<curtiss.how...@gmail.com> wrote:
> Hi all,
>
> I'd like to take this opportunity to address some concerns I have with
> the way annotation processing is done.  I take interest in this
> subject due to the extensive amount of work I have done in this area,
> and I feel that I can shed some light on possible performance issues.
> This message is mainly addressed to Jan-Kees van Andel as he is doing
> the work on the MyFaces annotation processing engine, but of course
> community input is always welcome.  I will address some points that JK
> raised in a previous thread on the user mailing list:
>
> "- Currently, I'm using the xbean-finder library from Geronimo for the
> processing stuff. This library uses ASM under the hood which worries
> me, since ASM is a widely used library and it has lead to many
> classloading issues because of other frameworks packaging different
> versions of ASM. "
>
> I would strongly recommend that MyFaces does NOT move away from doing
> class scanning with ASM (or some other bytecode scanning library) as
> the only other alternative is pure reflection and the performance in
> that case does not scale well at all.
>
> "- I have also created an annotation scanner of my own, which is
> actually quite fast and doesn't have a dependency on any library,
> except Java. "
>
> Since this scanner has no external dependencies, I'm tempted to
> believe this is a reflective scanner.  If not, did you write a
> bytecode scanning library?
>
> "I don't think that making the annotation scanning code pluggable is
> very useful since the xbean-finder library is already very easy to
> use. "
>
> The one major concern with the xbean-finder library is that it
> assembles a list of all the JARs on the classpath and scans all of
> them.  This is bad for a number of reasons:
>
> 1. The number of JARs to scan is _enormous_ in a typical customer
> application running on a typical (i.e., bloated) appserver.
> 2. By indiscriminately scanning JARs that are on the classpath but not
> necessarily part of the application you open yourself up to
> potentially pulling in random annotations that could have negative
> effects on the application.
>
> Now, xbean-finder has a way for you to specify that you only want to
> include JARs up to a certain point in the Classloader hierarchy, but
> FaceConfigurator is not currently doing this :) and there is at least
> one appserver I know of where even that approach wouldn't work since
> applications are allowed to reference "shared libraries" that sit
> apart from the normal classloader hierarchy.  At a minimum, I think
> FacesConfigurator would need to allow pluggability for integrators to
> decide how to populate xbean-finder with its set of Classloaders.
>
> In terms of pluggability, what I'd like to see is a simple interface
> that abstracts away annotation scanning.  This would be good for two
> reasons: first, appservers that integrate MyFaces would be able to
> take advantage of performance benefits that may arise from tight
> coupling with their runtime (not to mention that they may need to
> customize the classpath that xbean-finder or the like searches).  And
> second, this is a good practice in general as MyFaces shouldn't
> necessarily be tied to xbean-finder.  There may very well be better
> solutions, and being able to plug them in would help in the long run.
>
> My proposal for such an interface is this:
>
> public interface AnnotationScanner {
>        public Collection<Class> getAnnotatedClasses (Class annotationClass);
>        public Collection<Method> getAnnotatedMethods (Class annotationClass);
>        public Collection<Field> getAnnotatedFields (Class annotationClass);
>        public Collection<Package> getAnnotatedPackages (Class 
> annotationClass);
> }
>
> This interface is very similar to xbean-finder, and with good reason:
> as you stated, it's a simple API to work with.  FacesConfigurator
> would need minimal changes to adapt to this interface.  The advantage
> here is, again, more freedom in how annotation scanning is performed.
>
> Also, I would propose a factory that creates these instances with the
> FacesContext (that should be enough context for implementers to work
> with).
>
> Please let me know what you think.  Thanks,
>
>
> Curtiss Howard
>

Reply via email to