Inversão de controle X injeção de dependência  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
Icavalera
Thread.start()
[Avatar]

Membro desde: 14/04/2006 10:51:47
Mensagens: 48
Offline

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?

E ServiceLocator? é para que ... hehehe?

Alguem sabe falar boas referencias sobre o assunto?
vdb
JavaEvangelist

Membro desde: 28/09/2006 11:38:29
Mensagens: 330
Localização: Curitiba / PR
Offline

Vc disse sem usar framework, mas sugiro que estude spring, com ele voce consegue fazer e de uma maneira muito facil.

SCJP 5
SCWCD 5
pozzo
JavaEvangelist

Membro desde: 08/04/2006 11:07:20
Mensagens: 331
Localização: Curitiba
Offline

o que é Inversão de controle e o que é injeção de dependência?

R.: É tudo a mesma coisa.

E ServiceLocator?

R.: É um pattern com objetivo de encapsular complexas chamadas de rede; busca de serviços (aqueles lookup chatos de ejb, por exemplo), etc.

mais detalhes: http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html

Mas veja que se você usar injeção de dependência (termo mais comum, pois inversão de controle as vezes confunde as pessoas), vai acabar eliminando o "service locator", já que o objetivo da injeção de dependência é justamente esse, descobrir o objeto/serviço e "dar para você usa-lo".

This message was edited 2 times. Last update was at 08/02/2010 14:38:01

sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

Icavalera wrote: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?


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



Vc está injetando uma instância de B em A.
Isto é feito em uma terceira classe,C , o injetor. Esta classe faz o seguinte:



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.



Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
magnomp
JavaBaby

Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline

Na verdade inversão de controle (ioc - inversion of control) é um conceito que engloba injeção de dependencias (di - dependency injection), mas é bem mais abrantente.

ioc é o conceito que define frameworks, e significa que o framework chama o seu código (e não o contrario).
Por exemplo, quando colocamos um listener em um componente swing, isso é ioc, mas nao tem nada a ver com di
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

magnomp wrote:Na verdade inversão de controle (ioc - inversion of control) é um conceito que engloba injeção de dependencias (di - dependency injection), mas é bem mais abrantente.

ioc é o conceito que define frameworks, e significa que o framework chama o seu código (e não o contrario).
Por exemplo, quando colocamos um listener em um componente swing, isso é ioc, mas nao tem nada a ver com di


É verdade. Apenas não é verdade que "ioc é o conceito que define frameworks". Para fazer IOC não precisa de frameworks.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
magnomp
JavaBaby

Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline

É verdade. Apenas não é verdade que "ioc é o conceito que define frameworks". Para fazer IOC não precisa de frameworks.

Concordo que para usar IoC não precisa de um framework. Mas o que eu quis dizer com "ioc é o conceito que define frameworks" é que o uso de IoC é o que diferencia um framework de uma biblioteca de classes.
Icavalera
Thread.start()
[Avatar]

Membro desde: 14/04/2006 10:51:47
Mensagens: 48
Offline

Tem um exemplo de Injeção de Dependência então ? Sem FrameWork ...
magnomp
JavaBaby

Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline


Acabei de usar injeção de dependencia ali, e sem nenhum framework. Mais especificamente, isso é injeção pelo construtor. Existe tambem injeção via setter, e um outro tipo que não me lembro.

Eu desenvolvi um framework de DI para Delphi (http://www.emballo-di.com) que trabalha apenas com injeção via construtor. Tudo que ele faz é resolver os parametros do construtor e invoca-lo via reflexão.
Eu havia implementado um método de injeção que ele enumerava todos os atributos da classe e injetava em cada um, sem precisar usar nem um setter, mas posteriormente eu removi isso pois vi que não era muito bom injetar dessa forma
Giulliano
GUJ Master
[Avatar]

Membro desde: 14/11/2006 19:29:38
Mensagens: 1627
Localização: São Paulo
Offline

Olha só...no seu caso eu instanciaria o "Facade + Manager + DAO" tudo na Action.

Pelo o que vc disse sua Action esta instanciado o "Facade". E depois vc não tem mais controle sobre o manager e o DAO pq essas instância são feitas internamente.

A Inversão de Controle sugere que você tenha o controle sobre os objetos. Se na sua Action vc fizer

DAO d = new DAO()
Manager m = new Manager(d);
Facade f = new Facade(m);

Então ainda na sua action vc possue o controle de todos os objetos. Lógico que vc pode evitar esses "news" atráves de outros patterns como proxy e factory. Mas aí são outros 500...

Oracle Certified Master, Java EE 5 Enterprise Architect
Oracle Certified Professional Java Programmer
GiuLLianO MoRRoNi




<UnTouChAbLe>
[Email] [WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

Giulliano wrote:Olha só...no seu caso eu instanciaria o "Facade + Manager + DAO" tudo na Action.


Isso seria um erro crasso.
Primeiro vc está amarrando tudo na action, e segundo está violando a separação de camadas.

A injeção de depedências quando não é feita automaticamente, deve ser feita antes do sistema começar. no caso de aplicações web, deve acontencer no evento de inicialização da aplicação (ServletContextListener).

Como esta classe não pertence a nenhuma camada não ha problemas de dependência.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
Giulliano
GUJ Master
[Avatar]

Membro desde: 14/11/2006 19:29:38
Mensagens: 1627
Localização: São Paulo
Offline

sergiotaborda wrote:
Isso seria um erro crasso.
Primeiro vc está amarrando tudo na action, e segundo está violando a separação de camadas.


Você pode dar um exemplo prático baseado nisso que vc falou (e que siga a estrutura existente do projeto) ?

sergiotaborda wrote:
A injeção de depedências quando não é feita automaticamente, deve ser feita antes do sistema começar. no caso de aplicações web, deve acontencer no evento de inicialização da aplicação (ServletContextListener).

A injeção nem sequer existe aqui (quem dirá automaticamente). Além disso ele precisa de uma solução que não dependa de frameworks. Se ele seguisse o seu conselho eu recomendaria o uso de JNDI e lookups. (discorda ?)

sergiotaborda wrote:
Como esta classe não pertence a nenhuma camada não ha problemas de dependência.

Aqui eu não entendi o que vc disse. Qual classe não pertence a nenhuma camada e quem não tem problema de depêndencia?


Minha opnião foi baseada no seguinte raciocínio: O facade possui a inteligência das regras de negócio. Porém para ele ser executado é necessário injetar um Manager e um DAO. Portanto se minha aplicação fosse dividida em Swing e Web, na minha aplicação Swing ficaria a cargo do novo módulo injetar as depências necessárias para o funcionamento do facade. Aí entrando no conceito de proxy...para aplicações Swing eu poderia usar um Manager e um DAO diferente da web.

Oracle Certified Master, Java EE 5 Enterprise Architect
Oracle Certified Professional Java Programmer
GiuLLianO MoRRoNi




<UnTouChAbLe>
[Email] [WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

Giulliano wrote:
sergiotaborda wrote:
Isso seria um erro crasso.
Primeiro vc está amarrando tudo na action, e segundo está violando a separação de camadas.


Você pode dar um exemplo prático baseado nisso que vc falou (e que siga a estrutura existente do projeto) ?


Um exemplo de quê ?


sergiotaborda wrote:
A injeção de depedências quando não é feita automaticamente, deve ser feita antes do sistema começar. no caso de aplicações web, deve acontencer no evento de inicialização da aplicação (ServletContextListener).

A injeção nem sequer existe aqui (quem dirá automaticamente). Além disso ele precisa de uma solução que não dependa de frameworks. Se ele seguisse o seu conselho eu recomendaria o uso de JNDI e lookups. (discorda ?)


Discordo. Primeiro, não ha nenhuma necessidade em usar frameworks. Segundo não ha necessidade em usar JNDI. Terceiro, mesmo com um injetor de dependencias automático vc não evita lookups ( evitar lookups é impossivel. É uma questão de quantos e quais).

Primeiro vc define um registro de objetos. Sim, pode usar JNDI para isto, mas não é estritamente necessário.

Segundo vc define um ServletContextListener e o registra no web.xml

Terceiro, no codigo de init do ServletContextListener vc inicializa os objetos e os registra no Registro , mais ou menos assim



Repare que todos os objetos são inicializados mas apenas o facade é colocado no registro.
Repare também que este codigo depende de todos os objetos. Isto significa que, pelas regras, esses objetos deveriam ser injetados nele também.
Poderiamos desenvolver um mecanismo de escolhe as classes via propreties ou algo assim, mas podemos tb pensar que esta classe é o limite do sistema. Ou seja, não ha como comandar a sua criação, logo ,não ha como comandar a sua injeção automática.


sergiotaborda wrote:
Como esta classe não pertence a nenhuma camada não ha problemas de dependência.

Aqui eu não entendi o que vc disse. Qual classe não pertence a nenhuma camada e quem não tem problema de depêndencia?


Eu estava falando da classe MyServletContextListener. Ela não pertence a nenhuma camada e o fato dela depender de todas as outras classes não é um problema.

This message was edited 1 time. Last update was at 15/03/2010 14:25:25


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
mrmarcondes
Thread.start()

Membro desde: 02/08/2007 09:50:01
Mensagens: 34
Offline

Só uma curiosidade. Por que nao usar framework para fazer IoC?

Marco.
Giulliano
GUJ Master
[Avatar]

Membro desde: 14/11/2006 19:29:38
Mensagens: 1627
Localização: São Paulo
Offline

Sua solução não difere em praticamente nada de uma solução JNDI (que é muito mais robusta do que um simples Hash). Apenas o conceito de armazenagem e busca dos objetos que é diferente.

Acho que a única parte em que concordo com vc é que os objetos deveriam ser criados na inicialização da aplicação (mesmo assim ainda há controvérsias).

Portanto ao dono do tópico eu recomendo o uso de JNDI e Lookups. E a inicialização pode ser feita numa porrada só como foi feito pelo Sergio ou sob demanda (que eu prefiro).

This message was edited 1 time. Last update was at 15/03/2010 14:54:43


Oracle Certified Master, Java EE 5 Enterprise Architect
Oracle Certified Professional Java Programmer
GiuLLianO MoRRoNi




<UnTouChAbLe>
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team