Origem: Wikipédia, a enciclopédia livre. (http://pt.wikipedia.org/wiki/Inversão_de_controle)
Inversão de controle (Inversion of Control ou IoC, em inglês) é o nome dado ao padrão de desenvolvimento de programas de computadores onde a sequência (controle) de chamadas dos métodos é invertida em relação à programação tradicional, ou seja, ela não é determinada diretamente pelo programador. Este controle é delegado a uma infraestrutura de software muitas vezes chamada de container ou a qualquer outro componente que possa tomar controle sobre a execução. Esta é uma característica muito comum à alguns frameworks.
Injeção de dependência (Dependency Injection, em inglês) é um padrão de desenvolvimento de programas de computadores utilizado quando é necessário manter baixo o nível de acoplamento entre diferentes módulos de um sistema. Nesta solução as dependências entre os módulos não são definidas programaticamente, mas sim pela configuração de uma infraestrutura de software (container) que é responsável por "injetar" em cada componente suas dependências declaradas. A Injeção de dependência se relaciona com o padrão Inversão de controle mas não pode ser considerada um sinônimo deste.
Exitem controversias entre diferenças de Injeção de dependencias e IoC...
public class Person {
private Adreess adreess;
public Person() {
this.Adreess = new Adreess();
}
}
Neste explemplo tempos uma amostra de um forte acoplamento entre a classe Person e Address, assim tudo que for alterado na Classe Address afeta diretamente a classe Person, não tornando possível a reutilização da classe Person em outras situações...
Solução com IoC:
public class Person {
private Adreess adreess;
public setAdreess(Adreess adreess) {
this.adreess = adreess;
}
}
Assim Adress poderia ser Abstract, Interface ou simplesmente ter outro constructor que modifique Address tornando Person uma Classe totalmente reutilizavel.
Existem frameworks que usam o padrão IoC e que efetuam a injeção de dependência.
Ex: Spring e etc...