Usando PicoContainer

3 respostas
louds

Resolvi finalmente usar o pico. Da raiva de como é facil usar. Porem me surgiram umas dúvidas.

O quao leve é uma instancia do DefaultPicoContainer? Pergunto isso para saber se não vou criar 1 carroça colocando pico em todo canto que preciso de injeção de dependencias.

Tem alguma forma de roubar um pouco e usar o Pico como uma factory? Digo, coloco todas dependencias e uso como factory para um dos componentes dele.

3 Respostas

cv1

Um DefaultPicoContainer eh hiper-ultra-mega-leve. Pode esbanjar instancias dele numa boa (melhor ainda se vc criar pequenos “kits” de componentes e colar eles com hierarquias de PicoContainers, passando um Pico pro construtor do outro).

Sobre a factory, é só bolar um ComponentAdapter e passar no construtor do teu MutablePicoContainer ou DefaultPicoContainer :wink:

Ironlynx

PicoContainer

What kind of shit is this?Pra q serve?

louds

“cv”:

Sobre a factory, é só bolar um ComponentAdapter e passar no construtor do teu MutablePicoContainer ou DefaultPicoContainer ;)

Quase isso.

Resolvi ler o fonte do pico já que a documentação me deixou na mão, quando entendi como funciona a implementalção padrão do pico, saiu o seguinte:

import java.util.HashSet;
import java.util.Set;

import org.picocontainer.ComponentAdapter;
import org.picocontainer.Parameter;
import org.picocontainer.PicoIntrospectionException;
import org.picocontainer.defaults.AssignabilityRegistrationException;
import org.picocontainer.defaults.ComponentAdapterFactory;
import org.picocontainer.defaults.DefaultComponentAdapter;
import org.picocontainer.defaults.NotConcreteRegistrationException;
import org.picocontainer.defaults.TransientComponentAdapter;

/**
 * @author Rodrigo Kumpera
 */
public class TransientComponentAdapterFactory implements ComponentAdapterFactory {
	private Set transientComponents = new HashSet(); 
	
	public TransientComponentAdapterFactory() {
	}
	
	public void registerTransientComponent(Object key) {
		transientComponents.add(key);
	}

	public ComponentAdapter createComponentAdapter(Object key, Class clazz, Parameter[] params) throws PicoIntrospectionException, AssignabilityRegistrationException, NotConcreteRegistrationException {
		if(transientComponents.contains(key))
			return new TransientComponentAdapter(key, clazz, params);
		else
			return new DefaultComponentAdapter(key, clazz, params);
	}
}

Feito isso, basta usar essa factory com o seu DefaultPicoContainer e registrar na factory quais componentes devem ser instanciados toda vez.

Algo assim:

TransientComponentAdapterFactory factory = new TransientComponentAdapterFactory ();

factory.registerTransientComponent(Product.class);

DefaultPicoContainer pico = new DefaultPicoContainer(factory);

pico.registerComponentImplementation(Product.class, ProductImpl.class);
pico.registerComponentImplementation(Dependency.class, DependencyImpl.class);
....

Product product1 = pico.getComponentInstance(Product.class);
Product product2 = pico.getComponentInstance(Product.class);
assertNotEqual(product1, product2);
Criado 15 de janeiro de 2004
Ultima resposta 17 de jan. de 2004
Respostas 3
Participantes 3