Due to my own limited knowledge of xbean and the nuances of deployment
I can't claim to totally understand all the benefits of allowing the
application server to handle instantiation for objects annotated for
dependency injection.   I have a hunch that the main benefit is that
it allows the container to pick which constructor it uses and even in
some cases call various application server specific lifecycle methods
on the object.  If that's true then I can see a tremendous benefit
if/when Geronimo extends annotation support outward towards GBeans.
Are there other benefits that should be pointed out as well?

I think that most integrating projects would support this approach.
In fact when I asked the MyFaces team about dependency injection their
initial response was something along the lines of -- why can't the
container intercept object instantiation and handle injection at the
classloader level?  (but that's not, BTW, how MyFaces finally ended up
providing injection support).  However, when discussing that approach
they were reluctant to relinquish control of @PostConstruct and
@PreDestroy because there is explicit language in the JSF spec about
how those annotations relate to the scope and lifecycle of managed
beans.  So, playing the MyFaces advocate here, how would their
component be assured of spec compliance when running in a container
that doesn't necessarily support this new approach?

Something else to take into consideration, at least for MyFaces, is
that their current approach is mostly compatible with how the JSF RI
and Tomcat provide injection support, which makes it easier to replace
the JSF RI with MyFaces in Glassfish and other application server
environments. In order for MyFaces to implement behavior that is much
different than the RI I think they would need to see much stronger
language in the JSF spec around dependency injection.  So it might be
worthwhile to pursue this as an addendum to the JSF and perhaps even
the JEE specs.

Best wishes,
Paul


On 3/6/07, David Jencks <[EMAIL PROTECTED]> wrote:
I've been working on annotation handling for jetty using xbean-
reflect and have come up with a design for general annotation
processing that I would like to propose we urge our integrated
projects to allow or adopt.

This is appropriate when the injection only involves stuff looked up
in jndi and when the sequence of events is

- construct instance
- inject stuff
- call postConstruct

with no intervening container lifecycle calls.

So I'd like each project to define an interface

public interface <Project>LifecycleSupport {

Object newInstance(String className); //might need a classloader too
depending on whether the project has per-module instances

void destroyInstance(Object o);

}

and provide a way we can inject such an object into the projects
framework.

We can then implement the newInstance method to construct and inject
properties using xbean-reflect and call postConstruct, and
destroyInstance to call preDestroy.


Another style has been popularized by tomcat (?) which has 3 methods

inject(Object)

postConstruct(Object)

preDestroy(Object)

We can use this style but then we wont be able to use xbean-reflect
which hides all the hard part :-) and would let us go beyond the spec
and support constructor injection if we can figure out how to get
constructor metadata to it.

It's pretty trivial to implement an adapter between my proposal and
the tomcat style, but not vice versa.

So, where would this be used?  The most likely bits are MyFaces, CXF,
and Axis2.  I'm already doing something very similar for jetty and
haven't looked to see if tomcat can be adapted this way.

Thoughts?

thanks
david jencks


Reply via email to