À l'aide de CDI dans un pattern singleton
Je suis en train d'injecter un objet logger dans une classe qui est mis en œuvre à la suite d'un singleton approche.
Le code ressemble presque à ce:
Logger
classe:
public class LoggerFactory {
@Produces
public Logger getLogger(InjectionPoint caller){
return Logger.getLogger(caller.getMember().getDeclaringClass().getName());
}
}
Puis-je créer une classe qui a besoin d'enregistreur et implémente le Pattern Singleton:
public class MySingleton{
@Inject
private Logger logger;
private MySingleton instance;
/*
* Private constructor for singleton implementation
*/
private MySingleton(){
logger.info("Creating one and only one instance here!");
}
public MySingleton getInstance(){
if(instance == null) {
instance = new MySingleton();
}
return instance;
}
}
Si j'exécute le code (sur Glassfish 3.1.2.2), je reçois un NPE dès que j'essaie d'utiliser l'enregistreur.
Ce que je fais mal (beans.xml
fichier est en place)?
J'ai aussi essayé d'utiliser @Inject
avec une méthode de définition de la Logger
objet, mais avec pas de chance.
Les Injections qui se passe après la construction. Si vous ne pouvez pas l'utiliser dans le constructeur
Pourquoi on utilise un singleton au lieu de injectin il whre vous en avez besoin, et laissez-CDI en faire un singleton dans l'étendue du haricot?
Je ne sais pas beaucoup au sujet de CDI mais ne devriez-vous pas utiliser votre injecteur pour créer votre objet ? Avec le Printemps, l'injection se fait uniquement lors de la création d'objet à l'aide d'un Contexte d'Application et avec Guice, uniquement lors de l'utilisation d'un Injecteur.
Vous devriez être en utilisant
la vôtre est la bonne réponse de l'OMI. Soins à reposter comme une réponse?
Pourquoi on utilise un singleton au lieu de injectin il whre vous en avez besoin, et laissez-CDI en faire un singleton dans l'étendue du haricot?
Je ne sais pas beaucoup au sujet de CDI mais ne devriez-vous pas utiliser votre injecteur pour créer votre objet ? Avec le Printemps, l'injection se fait uniquement lors de la création d'objet à l'aide d'un Contexte d'Application et avec Guice, uniquement lors de l'utilisation d'un Injecteur.
Vous devriez être en utilisant
@Singleton
pour indiquer au conteneur CDI que la même instance d'un bean devrait toujours être injecté.la vôtre est la bonne réponse de l'OMI. Soins à reposter comme une réponse?
OriginalL'auteur fabpicca | 2013-02-28
Vous devez vous connecter pour publier un commentaire.
Injections qui se passe après la construction. Si vous ne pouvez pas l'utiliser dans le constructeur.
Une façon est d'ajouter une méthode annotée @PostConstruct qui pourront vous être invoquée après les injections.
Sur une note je Pense que vous êtes aprouching le problème dans le mauvais sens. Le CDI a une belle singleton soutien
créer une classe annotée @Singleton
Ci-dessus suppose que vous utilisez CDI pour java ee (JSR-299).
Si vous utilisez la JSR 330 Injection de Dépendance (guice, etc.) lien
Vous pouvez utiliser le constructeur de l'injection:
Parlez-vous javax.injecter.Singleton ou javax.ejb.Singleton ici? <gosh ils ont fait cette confusion>
OriginalL'auteur Aksel Willgert
Cela ne fonctionnera pas, parce que l'injection, comme déjà mentionné, sera effectué après le constructeur est appelé.
Méthodes annotées avec
@PostConstruct
sont appelés après l'injection a été terminée et avant que l'objet lui-même sera fourni à un autre endroit.Cependant, l'injection ne fonctionne que si l'instance de votre classe est fourni par l'injection elle-même. Cela est dû à l'injection en fonction de l'utilisation de proxy.
Par conséquent, vous aurez besoin d'injecter de votre MySingleton partout où vous en avez besoin. Pour être sûr qu'il est un singleton, de les annoter
@Singleton
et le conteneur de travail que pour vous.Addiotnally attention, singleton en termes de CDI spec ne signifie pas seulement un instanciation, mais plutôt un initialiation de
@PostConstruct
.OriginalL'auteur omilke