2
respostas

Injeção de dependência

Bom tem uma duvida que eu tenho eu tenho com o spring boot relacionado a injeção de dependencia

Bom eu sei que dependencia é qualquer tipo de relacionamento, e para injetarmos a dependencia existe o meio convencional (sem ser spring) pelos construtor e metodo setter. Ex: new Algo(obj) ; setAlgo(obj)

no Spring Boot a injeção de dependencia é uma unica instancia em toda a aplicação que é feito com a anotação @Autowired

a duvida é, vou usar como exemplo uma classe cliente que tem compra algo

public class Cliente{
    private Compra compra;

    /* getter e setter omitidos */
}
public class ClienteController{
    @Autowired
    private Compra compra;

    @Autowired
    private Cliente cliente;

    public void fazAlgo(){
        cliente.setCompra(compra);
    }
}

A duvida é,só tem esse jeito de fazer a injeção, não tem outro jeito tp

public void metodoTeste(){

    @Autowired 
    Compra compra;
    cliente.setCompra(compra)
}

ou até mesmo pelo construtor de alguma forma

por que essa pergunta, assim numa controller não parece fazer nenhuma diferença, porém eu fiz um caso usando um mapa, e ficou uma coisa bem esquisita

public class Facade{
    private Map<String,StrategyToCalc> rn = new HashMap<String, StrategyToCalc>();

    @Autowired private CalculoInss calculoInss;
    @Autowired private CalculoIcms calculoIcms;

    public Facade(){
    }
    private void startMaps(){
        rn.put("inss",calculoInss);
        rn.put("icms",calculoIcms);
    }
    public void executeStrategy(String param){
        startMaps();
        StrategyToCalc strategy = rn.get(param);
    }

}

moral eu tive que criar um metodo para injetar as dependencias dentro do mapa e tenho q ficar lembrando, sendo que sem a injeção de dependencia eu poderia fazer o new direto dentro do construtor.

Não sei se ficou bem explicado o porque de eu estou fazendo isso.

2 respostas

Bom descobri um outro jeito de fazer isso.

Seguindo a ideia do curso de Servlet 2.

O instrutor cria uma interface Ação e a Classe que implementa essa ação com o método executar.

No getParameter ele pega o parâmetro da tela que tem o mesmo nome da classe, Ele pega o parâmetro junta com o package e monta o Full qualified name e atribui a uma classe usando o class.forname. Em seguida pega a classe criada, instancia o objeto usando o newInstance() e assim pega o objeto e faz cast para o tipo Ação (interface)

Usei a mesma estratégia, porém com o spring boot não dá para criar a instância, já q ela é inicalizada junto com a aplicação descobri a interface Application context, injeto ela na classe e uso o metodo getBean()

Com isso consegui fazer a mesma coisa sem usar esses 300 mapas aí na aplicação

Olá Douglas, tudo bem?

Obrigado por compartilhar sua solução :)