Dúvida IoC Spring

Fala pessoal beleza?

Seguinte… pintou uma dúvida quanto a utilização do IoC do Spring em relação à “boas práticas”

Possuo uma classe, User que possue um Repositório:

   public class User{
       RepositoryUser repositoryUser;
       ... // outros atributos
   }

E estou exatamente com o mesmo problema postado neste tópico: http://www.guj.com.br/posts/list/70275.java#369569
Ou seja, preciso injetar um objeto em repositoryUser. Danado que não ví a solução no tópico a não ser via aspecto.

A pergunta é: seria muito tosco, toda vez que precisar manipular uma nova classe User eu utilizar o Spring ao invés do “new” e injetar um objeto em “userRepository”? :oops:

    User user = (User)getSpringContext().getBean("user"); // levando em consideração que "user" estaria declarado com scope="prototype"

O problema é que para todas as minhas entidades, eu teria que declarar no arquivo do Spring.
Se for muito tosco, como eu faria para ao utilizar um “new User()”, automaticamente um objeto seja injetado em repositoryUser?

Obrigado pela ajuda.

putz… citei meu próprio tópico sem querer… foi mal.

joca_java,

Eu não acho que o User precise de uma referência ao repositório como se fosse um atributo da classe User.

Principalmente, eu NÃO acho que você deva usar o Spring para instanciar Entidades de Negócio. O Spring deve ser usado apenas como uma ‘cola’ para ligar os Serviços, Repositorios etc.

A solução que eu usaria seria a seguinte:

  1. Crie um Service Locator que retorna uma referência ao seu repositório.
  2. Na classe User, ou em qualquer outra classe que precise acessar objetos da classe User, conforme necessário, faça: RepositoryUser repository = ServiceLocator.getInstance().getRepositoryUser()
    Assim seu design fica bem mais simples e o Spring fica restrito a onde deveria estar!

Vi o pessoal fazer com aspectos também, interceptando o ‘new’ da classe de entidade.

Edit: Err, agora que li teu topico completo e vi que já tinha visto isso. hehe!

[quote=domingos.neto]joca_java,

Eu não acho que o User precise de uma referência ao repositório como se fosse um atributo da classe User.

Principalmente, eu NÃO acho que você deva usar o Spring para instanciar Entidades de Negócio. O Spring deve ser usado apenas como uma ‘cola’ para ligar os Serviços, Repositorios etc.

A solução que eu usaria seria a seguinte:

  1. Crie um Service Locator que retorna uma referência ao seu repositório.
  2. Na classe User, ou em qualquer outra classe que precise acessar objetos da classe User, conforme necessário, faça: RepositoryUser repository = ServiceLocator.getInstance().getRepositoryUser()
    Assim seu design fica bem mais simples e o Spring fica restrito a onde deveria estar![/quote]

Oi Domingos, pode exemplificar como o Spring está sendo usado no seu exemplo?

Acho que o padrão Factory (DDD) é a resposta que eu daria a esse problema. Eu faria a injeção do UserRepository na UserFactory.

Eu não usaria um factory apenas para as entidades, eu faria como vc mostrou no tópico msm…
Claro que seria mais legal interceptar o ‘new’, mas dá mais trabalho :lol:

PS: Se fo só pra IoC, prefiro o Guice.