The Spring IoC container
It is a process whereby objects define their dependencies, that is, the other objects they work with, only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method. The container then injects those dependencies when it creates the bean. This process is fundamentally the inverse, hence the name Inversion of Control (IoC), of the bean itself controlling the instantiation or location of its dependencies by using direct construction of classes, or a mechanism such as the Service Locator pattern.
Inversion of Control (IoC):-
Inversion of Control
(or IoC) can be quite confusing when it is first encountered.
Inversion of Control is what you get when your program
callbacks, e.g. like a gui program.
For example, in an old
school menu, you might have:
print "enter your
name"
read name
print "enter your
address"
read address
etc...
store in database
Thereby controlling
the flow of user interaction.
In a GUI program or
some such, instead we say
when the user types in field a,
store it in NAME
when the user types in field b,
store it in ADDRESS
when the user clicks the save
button, call StoreInDatabase
So now control is inverted... instead of the
computer accepting user input in a fixed order, the user controls the order in
which the data is entered, and when the data is saved in the database.
Basically, anything
with an event loop, callbacks, or execute triggers falls into this category.
If you follow these
simple two steps, you have done inversion of control:
1. Separate what-to-do part from when-to-do part.
2. Ensure that when part knows
as little as possible about what part; and vice versa.
There are several
techniques possible for each of these steps based on the technology/language
you are using for your implementation.
Examples:-
·Event Handling. Event
Handlers (what-to-do part) -- Raising Events (when-to-do part)
·Interfaces. Component
client (when-to-do part) -- Component Interface implementation (what-to-do
part)
· xUnit fixure. Setup
and TearDown (what-to-do part) -- xUnit frameworks calls to Setup at the
beginning and TearDown at the end (when-to-do part)
·Template method design
pattern. template method when-to-do part -- primitive subclass implementation
what-to-do part
·DLL container methods
in COM. DllMain, DllCanUnload, etc (what-to-do part) -- COM/OS (when-to-do
part)
For example, say your application has a text editor component and you want to provide spell checking. Your standard code would look something like this:
public class TextEditor
{
private SpellChecker checker;
public TextEditor()
{
this.checker = new SpellChecker();
}
}
{
private SpellChecker checker;
public TextEditor()
{
this.checker = new SpellChecker();
}
}
What we've done here is create a dependency between the TextEditor and the SpellChecker. In an IoC scenario we would instead do something like this:
public class TextEditor
{
private SpellChecker checker;
public TextEditor(SpellChecker checker)
{
this.checker = checker;
}
}
{
private SpellChecker checker;
public TextEditor(SpellChecker checker)
{
this.checker = checker;
}
}
Now, the client creating the TextEditor class has the control over which SpellChecker implementation to use. We're injecting the TextEditor with the dependency.
Dependency Injection:-
The
best definition I found so far is one by James Shore:
"Dependency
Injection" is a 25-dollar term for a 5-cent concept. [...] Dependency
injection means giving an object its instance variables. [...].
There is an article by Martin Fowler that
may prove useful too.
Dependency injection
is basically providing the objects that an object needs (its dependencies)
instead of having it construct them itself. It's a very useful technique for
testing, since it allows dependencies to be mocked or stubbed out.
One of the major
advantages of dependency injection is that it can make testing lots easier.
Suppose you have an object which in its constructor does something like:
public
SomeClass() {
myObject = Factory.getObject();
}
This can be troublesome when all you want to
do is run some unit tests on SomeClass, especially if myObject is something
that does complex disk or network access. So now you're looking at mocking
myObject but also somehow intercepting the factory call. Hard. Instead, pass
the object in as an argument to the constructor. Now you've moved the problem
elsewhere, but testing can become lots easier. Just make a dummy myObject and
pass that in. The constructor would now look a bit like:
public
SomeClass (MyClass myObject) {
this.myObject = myObject;
}
}
Cost of Titanium Art: the most affordable art, tools, and
ReplyDeleteYou can buy this art collection on the web titanium ore and track your passion titanium coating for metal. mokume gane titanium Discover its worth in the ford fusion titanium for sale artworks titanium belly ring section, the