Ich versuche, ein Logger-Objekt in einer Klasse zu injizieren, die nach einem Singleton-Ansatz implementiert wird.Verwenden von CDI in einem Singleton-Muster
Der Code sieht fast wie folgt aus:
Logger
Klasse:
public class LoggerFactory {
@Produces
public Logger getLogger(InjectionPoint caller){
return Logger.getLogger(caller.getMember().getDeclaringClass().getName());
}
}
Dann erstelle ich eine Klasse, die Logger und implementiert das Singleton Pattern benötigt:
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;
}
}
Wenn ich den Code (auf Glassfish 3.1.2.2) ausführen, erhalte ich eine NPE sobald ich versuche den Logger zu benutzen. Was mache ich falsch (beans.xml
Datei ist vorhanden)? Ich habe auch versucht, @Inject
mit einer Setter-Methode für die Logger
Objekt, aber ohne Glück.
Injektionen geschieht nach dem Konstrukt. Sie können es also nicht im Konstruktor verwenden. –
Warum verwenden Sie normalerweise einen Singleton anstelle von injetin, wo Sie es brauchen, und CDI machen es zu einem Singleton-Bereich Bohne? –
Ich weiß nicht viel über CDI, aber sollten Sie nicht Ihren Injektor verwenden, um Ihr Objekt zu erstellen? Mit Spring wird die Injektion nur ausgeführt, wenn ein Objekt mit einem Anwendungskontext und mit Guice nur bei Verwendung eines Injektors erstellt wird. –