Ich versuche Frühling zu verwenden, um einen SLF4J Logger in eine Klasse zu injizieren etwa so:Spring Constructor Injektion von SLF4J Logger - Wie bekommt man Injektionszielklasse?
@Component
public class Example {
private final Logger logger;
@Autowired
public Example(final Logger logger) {
this.logger = logger;
}
}
ich die FactoryBean
Klasse gefunden habe, die ich umgesetzt habe. Aber das Problem ist, dass ich keine Informationen über die Injektion Ziel zu erreichen:
public class LoggingFactoryBean implements FactoryBean<Logger> {
@Override
public Class<?> getObjectType() {
return Logger.class;
}
@Override
public boolean isSingleton() {
return false;
}
@Override
public Logger getObject() throws Exception {
return LoggerFactory.getLogger(/* how do I get a hold of the target class (Example.class) here? */);
}
}
Sind FactoryBean auch der richtige Weg zu gehen? Bei Verwendung von Picocontainern factory injection erhalten Sie die Type
des Ziels übergeben. In guice ist es ein bisschen trickier. Aber wie schaffen Sie das im Frühling?
Ist es das wirklich wert, nur um '' LoggerFactory.getLogger() 'zu vermeiden? – skaffman
Ich mag die statische Bindung an LoggerFactory nicht, aus den gleichen Gründen, die Martin Fowler in http://martinfowler.com/articles/injection.html umreißt. Eine injizierte LoggerFactory ist eine akzeptable Lösung (nach dem Service-Locator-Muster), aber ein bisschen ausführlich. Ich nehme an, man könnte argumentieren, dass die Log-Injection einen Service-Locator verwenden muss, da eine reine Abhängigkeit ziel-agnostisch sein sollte. Aber die Locator-Lösung ist ausführlich, andere Frameworks unterstützen sie, und ich würde erwarten, dass Spring einige Informationen über das Ziel liefern könnte. Ich frage mich nur, ob das wirklich nicht möglich ist. –
Ich meine, diese Information wird an BeanPostProcessors übergeben: http://www.tzavellas.com/techblog/2007/03/31/implementing-seam-style-logger-injection-with-spring/. Kann das für die Konstruktorinjektion nicht erreicht werden? –