Torsten Curdt wrote:
On 30.12.2005, at 20:21, Vadim Gritsenko wrote:
Carsten Ziegeler wrote:
Gianugo Rabellino wrote:
I'm definitely not a fan of constructor injection, exp. when we
consider how (way too) often we resorted to inheritance in Cocoon
components. Now, while interface injection is clearly out of fashion,
sticking with Avalon/Excalibur also means that it would be difficult
to get around the container (e.g., how do you release components with
your approach? I assume Excalibur still kinda needs that).
Yes, Excalibur still needs it - but it's easy. Bascially, you
"emulate"
the service() method on construction of the object and then you
"emulate" the dispose method when destroying the object. Everything
our
ecm++ needs to know is there. As I said, I've done this in Fortress
and
we can use that code in ecm++ as well.
And we could implement setter injection with some kind of auto
wiring as
well. It's not really that harder. But using setters again requires to
code more than using a constructor.
I'm with Gianugo on this one - I'd better have setter injection
instead of constructor injection.
Maybe this is becoming a bit OT but could you guys give some reasons
why?
I personally prefer contructor injection over setter injection
because of
the clear contract. As soon as the object is instantiated it can be
used.
With setter injection you have to have some weird behind the scenes
object
life-cycle.
Well, personal preferences aside, there are pros and cons in any
situation. First, any component that is able to be accessed is fully
instantiated. Nothing more needs to be done. Setter injection vs.
Constructor injection doesn't change a thing here. Both styles of code
encorage different coding conventions.
Setter Injection
---------------
Familiar JavaBean style interface, natural to many Java developers, and
easy to use introspection based tools. Encorages failsafe design so
that almost all components are optional. In short, the absense of other
components cause the bean to work with diminished capacity. An example
is the DataSource object from the SQL package. In fact, that component
would work out of the box in this type of environment.
Constructor Injection
---------------------
Very robust design, less familiar to many Java developers, but natural
enough. Encourages tight encapsulation and failfast design so that
almost all components are required. In short, the absense of other
components can cause the component to crash. Examples include just
about any unmodifiable POJO object.
Spring is the XML laden container of choice for Setter Injection while
Pico is the code it yourself container of choice for Constructor Injection.
My personal preference would be for Pico primarily because it is not
nearly so XML heavy. Also note that Pico can work with setter injection
as well as constructor injection. My Java5 Dojo container works with
Setter injection out of the box, and can easily be extended for
constructor injection. Through the "Multi-Dojo" wrapper, it could have
components designed for either style of development work seamlessly with
each other. Even if you don't use it, you might take a look at the
code. It's pretty straight-forward and a simple design.