Duvida de injeção de dependencia no Guice

7 respostas
P

Com o Guice é possível injetar uma dependencia em um parametro que um método recebe. Como por exemplo:

@Inject void injectService(Service service) { ... }

Mais de qualquer maneira quando eu for executar esse método tenho que passar um objeto do tipo Service como parametro.

De que forma essa dependencia é injetada ?

7 Respostas

Getware

Também estou estudando o Guice, conssegui fazer um exemplo simples…

Interface do serviço:

public interface Validacao {
	
	public void validarCampoNumerico(String valor, boolean isCampoNulo) throws Exception;

}

Implementação do serviço:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.inject.Singleton;

@Singleton
public class ValidacaoImple implements Validacao {

    private static final String REGEX_CAMPO_NUMERICO = "^[0-9]*$";

    private static final String REGEX_CAMPO_NUMERICO_NAO_NULO = "^[0-9]+$";
    
    public ValidacaoImple() {
    	System.out.println("Instanciou......");
    }

    public void validarCampoNumerico(String valor, boolean isCampoNulo) throws Exception {
		Pattern padrao = Pattern.compile(REGEX_CAMPO_NUMERICO);
		if (!isCampoNulo) {
			padrao = Pattern.compile(REGEX_CAMPO_NUMERICO_NAO_NULO);
		}
		Matcher m = padrao.matcher(valor);
		if (m.find() == false) {
			throw new Exception("ERRO: CampoNaoNumericoException();");
		}
    }
}

E o cliente que usa o serviço…

import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

public class Teste {
	
	private final Validacao servicoVal;
	
	@Inject
	public Teste(Validacao injecao) {
		this.servicoVal = injecao;
	}
	
	public void trabalhar(String nome) {
		try {
			this.servicoVal.validarCampoNumerico(nome, false);
			System.out.println("BELAZA");
		} catch (Exception e) {
			System.out.println("RECUSADO");
		}
	}

	public static void main(String[] args) {

		Injector inj = Guice.createInjector(new Modulo());
		Teste t = inj.getInstance(Teste.class);
		t.trabalhar("38");
                               
                                Teste tb = inj.getInstance(Teste.class);
		tb.trabalhar("");
		
		Injector injc = Guice.createInjector(new Modulo());
		Teste tc = inj.getInstance(Teste.class);
		tc.trabalhar("328");
		
	}

}

E aproveitando o tópico…
Digamos que eu precise usar esse serviço em um Action. Tenho que fazer isso toda vez que quiser uma instância de um serviço?

Injector inj = Guice.createInjector(new Modulo());

Pois preciso de uma referência de Injector para obter as outras instâncias…
Se for colocar uma única referência a Injector onde devo colocar?

P

Com assim em um Action ?
Acho que o ideal seria apenas uma classe como por exemplo uma classe factory ter uma referencia para o injector e através da factory você instancia os beans.

Getware

poiati:
Com assim em um Action ?
Acho que o ideal seria apenas uma classe como por exemplo uma classe factory ter uma referencia para o injector e através da factory você instancia os beans.

Um Action do Struts por exemplo…

Certo, eu faria o Factory como? Não quero usar Singleton nem metodos staticos, por motivos obvios…

P

E nunca usei Struts portanto não tenho muita idéia do que vem a ser um Action.

É um pojo ou extende alguma classe ?

Voce mesmo que instancia ou é o framework que o faz ?

Acho que voce não precisa de métodos estaticos nem de singleton para usar o pattern factory.

Por exemplo:

public interface BeanFactory {
   
   public Object createBean(Class clazz);

}

Ai você faz uma implementação p/ usar com o Guice.

public class GuiceBeanFactory implements BeanFactory {

   private Injector injector;
   
   public GuiceBeanFactory() {
      //configuta o Injector.
   }   

   public Object createBean(Class clazz) {
      return injector.getInstance(clazz);
   }
 
}
Getware

poiati:
E nunca usei Struts portanto não tenho muita idéia do que vem a ser um Action.

É um pojo ou extende alguma classe ?

Voce mesmo que instancia ou é o framework que o faz ?

Acho que voce não precisa de métodos estaticos nem de singleton para usar o pattern factory.

Por exemplo:

public interface BeanFactory {
   
   public Object createBean(Class clazz);

}

Ai você faz uma implementação p/ usar com o Guice.

public class GuiceBeanFactory implements BeanFactory {

   private Injector injector;
   
   public GuiceBeanFactory() {
      //configuta o Injector.
   }   

   public Object createBean(Class clazz) {
      return injector.getInstance(clazz);
   }
 
}

O framework que instância…

Bem, a implementação do seu exemplo de Factory de qualquer forma no construtor sempre estarei executando o mesmo cádigo.

Injector inj = Guice.createInjector(new Modulo());

Opa… no exemplo ficou faltando a classe Modulo… ai vai:

import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Scopes;

public class Modulo implements Module {

	public void configure(Binder binder) {

		binder.bind(Validacao.class).to(ValidacaoImple.class).in(Scopes.SINGLETON);

	}

}
P

É verdade mais a criaçao do Injector tem que ser executada de qualquer forma. Não tem como escapar disso.

No caso dos Action do struts e ManagedBeans do JSF não sei como podemos aplicar o Guice já que é o proprio framework que instancia o objeto.

Getware

Tava terminando de ver a documentação e percebi que para o Struts 2 temos como usar o Guice pra DI… sem precisar ficar configurando o modulo…

Criado 20 de abril de 2007
Ultima resposta 20 de abr. de 2007
Respostas 7
Participantes 2