Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Acoplamento com Spring

Boa noite!

Eu tenho um grande nó na cabeça quando eu tento assimilar o que eu aprendo aqui com o desenvolvimento de aplicações web com Spring e toda aquelas injeção de dependência e milhares de usuários acessando ao mesmo tempo e a performance em cima disso tudo.

O objetivo desse tópico é saber se eu estou pensando na maneira correta de fazer o exemplo dessa aula, e se alguém tiver algum material de SOLID/Design Patterns + Spring, por favor, me envie!

Vou exemplificar de uma maneira bem tosca:

Aqui a classe principal

@Service
public class GeradorNota {

    private List<Acoes> acoes;

    @Autowired
    public GeradorNota(NFDao nfDao, EmailService emailService) {
        acoes.add(emailService);
        acoes.add(nfDao);

        //ou....
        acoes = Arrays.asList(nfDao,emailService);
    }

Aqui um DAO de NF, que já contém vários métodos de NF

public interface NFDao extends Acoes {

    public Object buscarNf();
    public void salvarNf(Object o);
}

Aqui a implementação

@Repository
public class NFDaoImpl extends AbstractDAO implements NFDao {

    @Autowired
    public NFDaoImpl(NamedParameterJdbcTemplate template) {
        super(template);
    }

    @Override
    public void executa(Object nf) {
    }

    @Override
    public Object buscarNf() {
        return null;
    }
    @Override
    public void salvarNf(Object o) {

    }
}

E aqui vamos imaginar um cara que dispara e-mail

@Service
public class EmailService implements Acoes {

    @Override
    public void executa(Object nf) {

    }

}

Estou imaginando da maneira correta? Fora que ficou horrível eu ter um método executa no meu DAO, igual ao outro tópico aberto aqui no forum, no caso a melhor solução seria a mesma que ele usou?

@Service
public class PersisteNota implements Acoes {

    @Autowired
    private NFDao dao;

    @Override
    public void executa(Object nf) {
        dao.salvarNf(nf);
    }
}
2 respostas
solução!

Nesse caso que vc possui várias ações, eu iria com a classe PersisteNota mesmo... Mesmo ela parecendo besta, vc está mantendo a semântica do sistema. Um DAO realmente não parece implementar o conceito de ação da sua regra...

Por sinal, vc pode até receber assim:

@AutoWired
List<Acao> acoes

Ele já pega todas as implementações e te injeta como lista.

Performance eu ficaria de boa... No startup do projeto já está tudo mapeado.. Se alguma coisa falhar a chance maior é que tenha sido erro nosso do que do framework :).

Obrigado pela resposta. Os nomes das classes e métodos ficaram meio ruim, mas acho que deu pra entender a ideia né?

Sobre anotar a lista com @Autowired eu confesso que nunca usei!

@AutoWired
List<Acao> acoes

Acho que devo apenas tomar um certo cuidado quando eu não quero que todas as ações do meu contexto vá para essa lista.

Sobre o tópico, eu creio que apenas formulando minha pergunta eu consegui entender melhor o conceito! Hahaha

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software