@Inject seulement pour Pojo créé par conteneur CDI?
Je veux juste confirmer que j'ai bien compris les conditions préalables pour le CDI de travail. Si j'ai une classe A:
public class A {
@Inject private B b;
}
Maintenant, quand j'instancie cette classe à l'aide de:
A a = new A();
Dans ce cas, A. b sera nulle.
Mais si je définir dans une autre classe d'un membre:
@Inject A a;
et servir par la suite, une.b sera correctement rempli?
N'CDI ne fonctionne que si la classe nécessitant un effort a également été créée par conteneur CDI? Ou ce qui me manque si les injections à son tour d'être null lors de la création d'un POJO à l'aide d'ordinaire instanciation avec le nouveau (oui, j'en ai beans.xml en place)?
OriginalL'auteur Sebi | 2012-08-22
Vous devez vous connecter pour publier un commentaire.
Tandis que d'autres ont déclaré à juste titre que, pour la plupart, DI conteneurs de ne pas injecter des dépendances dans les fèves qu'ils n'ont pas instancier ce n'est pas tout à fait vrai.
Le printemps est une merveilleuse fonctionnalité autowire le haricot lorsque vous créez à l'aide de
new A()
.Vous avez juste à utiliser AspectJ et la marque de votre bean avec le
@Configurable
annotation.Sa fait genre une superbe fonctionnalité de cause, vous pouvez faire d'Active Record de style POJO alors qu'elle n'en honorant vos DI (sa en fait comment Spring Roo t-il).
Vous devez également savoir qu'avec le Printemps, vous pouvez autowire un bean par programme après son été instancié avec la AutowireCapableBeanFactory. C'est de cette façon généralement autowires Cas de Test JUnit Classes parce que JUnit crée les classes de test.
Oui le Printemps n'est pas de CDI mais en théorie, vous pouvez écrire votre propre
@Configurable
pour CDI ou il y a probablement un CDI façon de faire de la ci-dessus.Que dit ci-dessus est une sorte de fonctionnalités sophistiquées (et une sorte de hack) et comme @JanGroth mentionné understaning la cycle de vie du haricot de gestion du conteneur est essentiel de savoir si son CDI, Printemps, Guice, etc.
Je ne pensais pas que j'allais être marquée correcte. Je viens de mettre ma réponse au cas où quelqu'un voulait faire DI avec
new *()
... j'ai aussi un peu de deviner qu'il a vraiment envie, mais j'ai peut-être confondu plus. Vous pouvez toujours -1 mon post 🙂No worries mate, je suis plus que heureux de +1, vous avez pour élever cet aspect intéressant 🙂
Le truc, c'est que presque toutes les réponses étaient correctes. J'ai donc choisi celui qui m'a donné la plupart des idées.
OriginalL'auteur Adam Gent
Oui, c'est assez bien. Le cycle de vie d'un
ManagedBean
est contrôlée par le conteneur et ne doit jamais être instancié avec lanew
mot-clé (BTW: le même est vrai pour les Ejb & beans Spring). Si vous avez besoin de créer un nouveau ManagedBean vous aurez probablement besoin d'utiliser un producteur méthode.Ce n'est pas tout à fait vrai que les nouvelles ne seront pas injecter. Vous pouvez faire
new
injecter avec le printemps: Voir le Printemps @ConfigurableJ'ai été en espérant arriver au printemps, et s'en tenir à la pure JEE6 pour le CDI. Mais je pense que le CDI est calme limitée. Par exemple, si j'ai une servlet contexte, je ne peux pas injecter quoi que ce soit géré par le CDI comme la classe de servlet n'est pas créées par conteneur CDI. Je suppose que c'est là que le Printemps serait utile.
En ce qui concerne votre commentaire à propos de la CDI et des conteneurs de servlet. Votre compréhension est erronée. Vous pouvez heureusement Injecter un CDI fève dans une servlet w/JavaEE6. Une servlet, ou un filtre de servlet est une "géré" objet du conteneur CDI. Cela s'applique également à JAX-RS / Maillot de ressources de sorte que vous pouvez injecter dans. Vous pouvez également injecter un EJB dans un servlet.
De ma compréhension de l'OP est (était) en ignorant complètement le récipient de prendre la responsabilité d'un bean cycle de vie. C'est pourquoi je continue de penser que
new Foo()
n'est pas une bonne idée pour un hello world tentative avec l'injection de dépendance - même si la plupart des conteneurs (y compris les CDI) vous offre des moyens de contourner cette limitation.OriginalL'auteur jan groth
Oui, @Inject ne fonctionne qu'à l'intérieur d'un conteneur, car il est fait à l'aide de séparateurs sur les appels de méthode. Lorsque le conteneur crée un haricot, il wrappes dans intercepteurs qui effectuer l'injection, et dans le cas de l'instanciation à l'aide de nouveau pas intercepteurs seront appelés lors de haricot invocation de méthode, et il n'y aura pas d'injection.
Non, @Inject ne fonctionne pas avec les intercepteurs - il fonctionne avec des proxys (principalement pour des raisons de performances). Découvrez l'excellente documentation de Soudure pour obtenir l'image complète.
OriginalL'auteur March
Vous pouvez utiliser
BeanProvider.injectFields(myObject);
de Apache DeltaSpike.OriginalL'auteur user3661280
Voici les conditions nécessaires pour qu'une classe d'un bean géré (et, donc, pour l'annotation @Inject de travailler sur ses champs/méthodes):
http://docs.oracle.com/javaee/6/tutorial/doc/gjfzi.html
OriginalL'auteur Shivan Dragon