Gostaria de saber se é possivel fazer injeção de depencia em uma ambiente JEE de forma indireta…
algo como
1#AlgumaCoisaFace algumaCoisaFacde = container.instanceFor(AlgumaCoisaFace.class);
é possivel fazer isso? com o container CDI ?? ou a única forma é algo como
2#@Inject //ou @EJB ou @BlaBla
private AlgumaCoisaFace algumaCoisaFacde
Bom gostaria de conseguir fazer da forma 1#, tem como ?? (obs.: eu sei que da pra usar essa anotação em outro lugares como métodos, e etcs, mas gostaria mesmo era de fazer da forma 1#)
Obs.: eu sei que da pra fazer com spring, mas gostaria de fazer sem saber qual é a implementação do container do JEE
Eu faço isso com o spring. Vou postar a solucao pra você pq a única área que fica específica é a classe de configuração, o resto aparentemente é indepente do seu container IoC. Mas antes de ver minha solução, vc pode ver o @Configurable do Spring e o Salve. Ambos são solucoes para este problema.
Segue código
public interface NResources
{
<T> T locate(Class<T> type);
}
[code]import java.util.Map;
import org.springframework.context.ApplicationContext;
import com.nnoitra.services.NResources;
public class _NResources implements NResources
{
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext)
{
this.applicationContext = applicationContext;
}
@Override
@SuppressWarnings("unchecked")
public <T> T locate(Class<T> type)
{
Map<String, T> beans = applicationContext.getBeansOfType(type);
if (beans.size() == 1)
{
return beans.values().iterator().next();
}
else if (beans.isEmpty())
{
return null;
}
else
{
String msg = String.format("More than one bean of type %t in the context!", type);
throw new RuntimeException(msg);
}
}
}[/code]
[code]import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import com.nnoitra.Nnoitra;
import com.nnoitra.support._NResources;
public class NnoitraConfigurator implements ApplicationContextAware
{
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
((_NResources)Nnoitra.resources).setApplicationContext(applicationContext);
}
}[/code]
no application context
exemplo de uso
public Session session()
{
return resources.locate(SessionFactory.class).getCurrentSession();
}
ai fica a questão neste seu código… quem é ApplicationContext ??
vc só consegue pegar beans a partir dele… e ele não á parte do CDI ou é ?
não há essa interface (ou classe) no JEE
por favor posta o código com os imports ^^ preu ver meió
Eu estou utilizando Spring. ApplicationContext é onde estão todos os beans gerenciados pelo spring.
[quote=Lavieri]vc só consegue pegar beans a partir dele… e ele não á parte do CDI ou é ?
não há essa interface (ou classe) no JEE[/quote]
ApplicationContext é especifico do spring, no entanto não é exposto em sua aplicacao. A unica classe que sua aplicacao precisa conhecer é a interface NResources. A implementacao de NResources é especifico para cada container de injecao de dependencias. Aqui no caso, vc está criando sua própria abstracao para separar seu sistema do do container ioc.
Ok, eu editarei o posto anterior
Aparentemente, não existe nada do gênero para se buscar “managed beans” programaticamente. Ou é via annotations ou XML, e nada mais. Também não tem um único ponto de declaração de dependências, como o applicationScope.xml do Spring ou o Module do Guice. Por causa disso, existem um monte de conceitos complicados por cima, como os decorators e observers.
Pra falar a verdade, se eu tenho a opção de escolher, coloco Spring ou Guice na frente de CDI. Justamente por oferecer um ponto único de configuração, e por ter meios de busca programática de beans.
é para um framework… para rodar em um ambiente JEE6 … não posso supor que estou trabalhando com spring ou algo do genero…
EU consegui fazer, + ou - … funciona para a parte do CDI, mas não funciona bem de dentro dos EJBs / ManagedBeans … ainda não entendi bem o pq
[code]/**
*
-
@author Tomaz Lavieri
*/
@javax.enterprise.context.Dependent
public class ContainerImpl implements Container{
@javax.inject.Inject
private javax.enterprise.inject.Instance<Object> container;
public <T> T instanceFor(Class<T> type) {
return container.select(type).get();
}
}[/code]
funciona bem… quando estou fora do EJB
@Named("ha")
public class Bleu {
@Inject
private Container container;
public String getBla() {
return ""+container.instanceFor(ItemFacade.class).find("10").getName();
}
}
neste ponto funciona… lá na view quando coloco #{ha.bla} recebo o nome do Item de id = 10
porem c tento buscar o container dentro do EJB, levo null pointer na cara…
Acredito que a solução seja essa… e que realmente, não posso injetar algo que não é @Stateless ou @Statefull dentro do EJB… pensei que podia, mas pelo visto não pode…
mas o meu maior problema, é que o @ManageBean também não aceita a injeção… =/
na verdade eu não consegui dar @Inject em nada dentro do ManagedBean
Lavieri, li rapidamente sobre esta nova especificação e posso estar errado no que estou falando… Mas creio que este novo CDI não é suportado nem em EJBs nem em Entidades(@Entity), o que resulta no seu null… É suportado apenas nos “ManagedBeans” … (classes java comuns) …
Lavieri, li rapidamente sobre esta nova especificação e posso estar errado no que estou falando… Mas creio que este novo CDI não é suportado nem em EJBs nem em Entidades(@Entity), o que resulta no seu null… É suportado apenas nos “ManagedBeans” … (classes java comuns) …[/quote]
O fato é que o contrario funciona…
realmente não consegui injetar dentro do EJB, algo que estava fora,
mas estando fora, consigo injetar qualquer coisa, inclusive EJBs
A minha vontade é conseguir integrar um Framework ao CDI, e deixar o CDI disponivel par ao framework, para tal esse container é o primeiro passo… nele eu estou conseguindo resgatar coisas do EJB… agora falta conseguir registrar de forma programatica…
Resolvido o container… inclusive dentro dos EJB … o @Inject funciona sim em todas as partes do container, dentro do CDI e dentro do EJB, foi só implementar Serializable que tudo passou a funcionar =x
Lavieri,
Tudo bem? Este teu framework tá com código disponível?
Estou tb estudando as mesmas coisas que vc citou…