spring does not impose itself
wholly on to the design of a project. Spring is modular and has
been divided logically into independent packages, which can
function independently.
encourages users to introduce Spring into existing applications
in a phased manner. So no matter what kind of framework you are
using now Spring will co-exist with it without causing you
nightmares and further more Spring will allow you to choose
specific packages in Spring.
Spring has a layered
architecture, meaning that you can choose to use just about any part of it in
isolation, yet its architecture is internally consistent
it's easy to introduce Spring incrementally into
existing projects
The main difference is that I expect a component
to be used locally (think jar file, assembly, dll, or a source
>
>
i
mport). A service will be used remotely through some remot
>e
>
i
nterface, either synchronous or asynchronous
>
>
configuration through XML files and also through code
Dependency injection and a service locator aren't necessarily
mutually exclusive concepts.
With service locator the application class asks for
it explicitly by a message to the locator. With injection there is no
explicit request, the service appears in the application class - hence
the inversion of control.
with a Service Locator every user
of a service has a dependency to the locator. The locator can hide
dependencies to other implementations, but you do need to see the
locator.
In this kind of scenario I don't see the
injector's inversion as providing anything compelling.The difference comes if the lister is a component that I'm
providing to an application that other people are writing. In this
case I don't know much about the APIs of the service locators that my customers
are going to use. Each customer might have their own incompatible
service locators
Since with an injector you don't have a dependency from a
component to the injector, the component cannot obtain further
services from the injector once it's been configured.
frameworks should minimize their impact
upon application code, and particularly should not do things that slow
down the edit-execute cycle. Using plugins to substitute heavyweight
components does a lot help this process, which is vital for practices
such as Test Driven Development.
a more general issue with object-oriented
programming - should you fill fields in a constructor or with
setters.
Another advantage with constructor initialization is that it
allows you to clearly hide any fields that are immutable by simply not
providing a setter. I think this is important - if something shouldn't
change then the lack of a setter communicates this very well
The problem with
classic Factory Methods for components assembly is that they are
usually seen as static methods, and you can't have those on
interfaces. You can make a factory class, but then that just becomes
another service instance. A factory service is often a good tactic,
but you still have to instantiate the factory using one of the
techniques here
Factory
Methods
start with
constructor injection, but be ready to switch to setter injection
One case is
where you have a simple application that's not got a lot of deployment
variation. In this case a bit of code can be clearer than separate XML
file.
configuration files or code on an API to wire up services
the Java world at the moment is a
cacophony of configuration files,
Aspect Oriented Programming AOP. can be possible with IoC.
When building application classes the two are
roughly equivalent, but I think Service Locator has a slight edge due
to its more straightforward behavior. However if you are building
classes to used in multiple applications then Dependency Injection is a
better choice.
PicoContainer is an implementation of lightweight embedable container using dependency injection design pattern. a good example for learning API frameworks and design patterns.