[quote=Icavalera]Eu tenho uma aplicação simples, onde eu estou usando struts.
A aplicação funciona da seguinte maneira. Eu tenho um Jsp que chama uma Action que chama um Facade que chama um Manager que chama um DAO
Sempre no Facade eu tenho que dar new no obj Manager e sempre no Manager eu tenho que dar new no obj dao …
Queria usar IOC ou injeção de dependência para resolver esse problema.
Alguem tem ae em exemplo disso feito sem o uso de algum frameWork?
Na verdade eu estou meio na duvida sobre o que é Inversão de controle e o que é injeção de dependência?
[/quote]
Inversão de controle é um principio de OO e significa que uma classe não deve controlar as suas dependências.
Ou seja, se A precisa de B, A não deve executar new B() (que é exactamente o que vc está fazendo). O que deve acontecer é que A
deve receber B no contrutor ou num método set. A diferença é que , se A precisa de B obrigatoriamente para executar o seu trabalho, B deve ser passado no contrutor e consistido para não ser null. Se A pode usar B opcionalmente então deve ser usado um set.
injeção de Dependencia é o processo que, dado A, executa os sets necessários para dar a A acesso a B. Ou seja, quando vc chama
a.setB(b)
Vc está injetando uma instância de B em A.
Isto é feito em uma terceira classe,C , o injetor. Esta classe faz o seguinte:
B b = new B();
A a = new A(b);
// ou
A a = new A()
a.setB(b);
Injeção Automatica de Dependencia é o processo/mecanismo que realiza a injeção sem que vc tenha que escrever este tipo de codigo.
Framework de injeção Automática de Dependencia ou Container de Injeção (Automática de Depedencia) é um frameowrk onde vc declara quais objetos devem ser injetados em quais outros e o container executa a logica de criar os objetos e injetá-los no lugar certo.
O codigo anterior mostra como se faz injeção sem framework (sim, é o jeito normal de escrever OO! )
Usar um container de injeção facilita as coisas porque vc só tem que dizer o que quer e não como é feito o processo.Além disso o container trata de coisas como referencia ciclica e permite que vc modifque a criação dos objetos, como por exemplo criando proxies em torno do objeto real.
ServiceLocator é um padrão EE para descobrir objetos no registro JNDI. Todo o Container de Injeção atua como um servicelocator, a diferença
é que usando serviceLocator, vc, na classe A vai dar new do ServiceLocator, e mandar ele procurar o B. Ok, vc não dá new do B, mas dá do ServiceLocator, violando do mesmo jeito a inversão de controle. Este problema não é do serviceLocator em si, mas do jeito que se usava antigamente.
Hoje em dia, nada o impede de mandar injetar o proprio contexto de injeção em um objeto e localizar o objeto explicitamente. A diferença é vc nunca dará new nos objetos.