| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 18:05:14
|
benflodin
JavaGuru
![[Avatar]](/images/avatar/0f6b1f657ac30ab76519ed4c677e9909.jpg)
Membro desde: 04/06/2006 13:50:18
Mensagens: 223
Offline
|
parabens pela iniciativa, precisamos mesmo de diversidade, cade os testes ? - brincadeira
|
think Java |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 19:09:34
|
magnomp
JavaBaby
Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline
|
Não faz DI pelo construtor?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 19:21:19
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2668
Localização: Chicago, EUA
Offline
|
magnomp wrote:Não faz DI pelo construtor?
Sim, suporta, mas a preferencia é usar setter.
E veja que wiring por construtor não faz sentido, pois quando vc interliga os componentes eles já devem estar inicializados e o container não tem como calcular de anti-mão todas as dependências para chamar um construtor. Ele vai injetando conforme vai encontrando dependências. Isso é auto-wiring (no caso do MentaContainer por nome e type).
This message was edited 2 times. Last update was at 28/07/2010 19:57:10
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 20:01:11
|
magnomp
JavaBaby
Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline
|
Algum motivo em especial para preferir via setter?
Digo isso por que eu implementei um container de DI para Delphi onde suporto apenas injeção pelo construtor (o projeto é novo... eventualmente posso implementar isso), e queria saber quais as vantagens de fazer injeção pelo setter.
Inicialmente eu suportava injeção diretamente nos campos do objeto (ou seja, sem passar pelo construtor nem pelos setters), mas depois descartei isso pois vi que era furada trabalhar assim
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 20:04:25
|
magnomp
JavaBaby
Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline
|
O que seria o wiring a que você se refere? Seria outro termo para injeção?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 20:05:14
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2668
Localização: Chicago, EUA
Offline
|
magnomp wrote:Algum motivo em especial para preferir via setter?
Digo isso por que eu implementei um container de DI para Delphi onde suporto apenas injeção pelo construtor (o projeto é novo... eventualmente posso implementar isso), e queria saber quais as vantagens de fazer injeção pelo setter.
Inicialmente eu suportava injeção diretamente nos campos do objeto (ou seja, sem passar pelo construtor nem pelos setters), mas depois descartei isso pois vi que era furada trabalhar assim
Tanto faz injetar por setter ou por construtor. Ambos tem vantagens e desvantagens. O MentaContainer suporta ambos. Agora wiring por construtor é esquisito pelo motivo acima. Eu particularmente prefiro por setter.
O Mentawai suportava injection direto em campo privado, mas no MentaContainer tirei isso, pois é muita mágica. Se uma propriedade pode ser setada externamente ela precisa declarar um setter e ser uma boa cidadã.
O mais comum é fazer injection por setter mesmo. É o que eu vejo por aí.
This message was edited 1 time. Last update was at 28/07/2010 20:05:53
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 20:08:42
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2668
Localização: Chicago, EUA
Offline
|
magnomp wrote:O que seria o wiring a que você se refere? Seria outro termo para injeção?
AutoWiring = Tudo pode depender de tudo, e quando o container retorna um bean ele já retorna ele populado / preenchido com outros beans. Exemplo: Container está configurado para prover Connection e MyDAO. MyDAO depende de connection. Quando vc pede o MyDAO ele te retorna uma instancia de MyDAO com uma Connection dentro, que ele tb procura (a connection) no container. Faz isso automaticamente (por nome e type), daí auto-wiring.
Agora DI é simplesmente inversão de controle, ou seja, o container é que tem o controle para criar e injetar as instancias ao invés do objeto que depende dela fazer um new. É o desacoplamento total. Vc pode fazer isso via construtor ou setting. É parecido mais diferente de auto-wiring.
É claro que se vc entendeu DI vai entender também que todo DI deve acontecer numa campo de tipo INTERFACE.
This message was edited 4 times. Last update was at 28/07/2010 20:13:24
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 20:34:24
|
magnomp
JavaBaby
Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline
|
Pelo que eu entendi, você considera que em DI o container instancia a classe e retorna para você, mas sem considerar as dependencias da mesma.
Já no wiring, o container instancia a classe e ainda provê todas as dependencias que ela pode precisar.
É isso?
Se sim, então acho que não faz sentido chamar de DI. O container não injeta nada, só cria e retorna para alguem (e esse alguem sim, poderá injetar em algum lugar). No Emballo (o projeto que citei), faço esse wiring via construtor sem problemas. No GIN (Google Guice adaptado para o GWT) idem.
Se eu lhe entendi errado, peço que desconsidere o paragrafo acima
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2010 20:40:01
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2668
Localização: Chicago, EUA
Offline
|
magnomp wrote:Pelo que eu entendi, você considera que em DI o container instancia a classe e retorna para você, mas sem considerar as dependencias da mesma.
Já no wiring, o container instancia a classe e ainda provê todas as dependencias que ela pode precisar.
É isso?
Se sim, então acho que não faz sentido chamar de DI. O container não injeta nada, só cria e retorna para alguem (e esse alguem sim, poderá injetar em algum lugar). No Emballo (o projeto que citei), faço esse wiring via construtor sem problemas. No GIN (Google Guice adaptado para o GWT) idem.
Se eu lhe entendi errado, peço que desconsidere o paragrafo acima
Entendeu certo.
Realmente temos IoC, DI e Wiring. Isso que descrevi é IoC e Wiring. A parte de DI é o método Container.populate(Object). O MentaContainer suporta as 3 coisas. Faz injeção, wiring e instanciamento de beans (IoC).
Acho que não faz muito sentido falar de IoC sem DI e vice-versa. Um meio que complementa o outro.
This message was edited 1 time. Last update was at 28/07/2010 20:44:07
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/07/2010 04:36:35
|
Sergio Lopes
Moderador
![[Avatar]](/images/avatar/8232e119d8f59aa83050a741631803a6.jpg)
Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline
|
A boa prática geral diz que injeção por construtor é bem mais elegante que por setter. Além de gerar menos código, exibe melhor a relação de dependência e não permite que o objeto esteja em estado inconsistente. É o que o pessoal chama do Good Citizen Pattern.
Aliás, achei curioso você citar uns posts aí pra cima o padrão do bom cidadão com setters. É justamente o contrário.
|
Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/07/2010 05:00:38
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2668
Localização: Chicago, EUA
Offline
|
Sergio Lopes wrote:A boa prática geral diz que injeção por construtor é bem mais elegante que por setter. Além de gerar menos código, exibe melhor a relação de dependência e não permite que o objeto esteja em estado inconsistente. É o que o pessoal chama do Good Citizen Pattern.
Eu prefiro por setter. Há vantagens e desvantagens de usar construtores versus setters.
Aliás, achei curioso você citar uns posts aí pra cima o padrão do bom cidadão com setters. É justamente o contrário.
Estava falando de injetar em campo privado (sem setter ou construtor) e não em usar setter ou construtor.
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/07/2010 07:32:12
|
magnomp
JavaBaby
Membro desde: 21/07/2009 12:43:00
Mensagens: 77
Offline
|
Como já falei, tambem prefiro injeção pelo construtor.
Se um objeto MyDao PRECISA de um objeto Connection pra funcionar, não tem por que essa dependencia não ser passada no construtor.
Quando está escrevendo testes de unidade, é muito facil esquecer de chamar um setter para colocar uma dependencia. Já se for no construtor, você nem conseguiria compilar o código.
Ou então se esquecer de configurar a dependencia no container, ele vai simplesmente te entregar o objeto em um estado inconsistente. Se fosse no construtor, o container não conseguiria instanciar o objeto e iria ocorrer uma exceção
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/07/2010 07:33:44
|
maior_abandonado
JWizard
![[Avatar]](/images/avatar/0d7c463832b871c20405a6c9296b5517.jpg)
Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline
|
parabens pela criação... parece ser bem interessante, mesmo
|
espero ter ajudado...
falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/07/2010 15:10:15
|
bobmoe
GUJ Ranger
![[Avatar]](/images/avatar/9cc25407f209e031babdac7d3c520ccb.jpg)
Membro desde: 11/07/2006 20:45:48
Mensagens: 806
Localização: Sampa
Offline
|
saoj wrote:
Sergio Lopes wrote:A boa prática geral diz que injeção por construtor é bem mais elegante que por setter. Além de gerar menos código, exibe melhor a relação de dependência e não permite que o objeto esteja em estado inconsistente. É o que o pessoal chama do Good Citizen Pattern.
Eu prefiro por setter. Há vantagens e desvantagens de usar construtores versus setters.
oi saoj,
acho q ele ta querendo dizer q quando objetos são criados eles devem estar prontos para o uso.
quando ocorre a injeção por setter vc tem uma instancia inconsistente, que na verdade é corrigida posteriormente via setter.
[]s,
bob
|
BOB - Roberto Nogueira - bobmoe.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/07/2010 15:32:47
|
djemacao
GUJ Master
Membro desde: 04/06/2007 17:47:24
Mensagens: 1030
Offline
|
Usar apenas ioc, faço na "unha"mesmo. Spring vai além do ioc, por isso o considero muito bom, quando não preciso usar EJB (e quase nunca se precisa mesmo).
|
"Quanto mais aprendo mais tenho consciência que nada sei." |
|
|
 |
|
|