Nous utilisons le ressort pour obtenir toutes nos connexions JDBC ainsi que partie de notre cadre de persistance. Cependant, afin d'écrire notre propre appendeur DB personnalisé (il doit être personnalisé car nous ne sommes pas autorisés à utiliser le dbappender par défaut dû aux normes de noms de table). Comment puis-je obtenir une référence aux haricots de printemps / utilisez AutoWire à ce stade de l'intérieur de l'accenceur personnalisé? Je préférerais rester au printemps au lieu d'utiliser un JDBC uni.
Appender personnalisé: P>
import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; public class CustomDBAppender extends AppenderBase<ILoggingEvent> { protected void append(ILoggingEvent event) { } }
3 Réponses :
Vos options sont limitées ici, mais vous pouvez utiliser le singletonbeanfactoryLocator code> Stuff (voir manuel de ressort, Code colle et le mal singleton ), et Cette entrée de blog Springsource . P>
La façon dont je le fais est d'utiliser AUTOWIREDANNOTATIONBEANPOSTROCESSOR. P>
Dans le constructeur de votre Appender, vous demandez à l'AutoWairAnnotationBepoCrocessor d'injecter "Ceci". P>
Mes commentaires à la fin de Cet article Détails de la technique. L'article parle d'une méthode similaire d'entités hibernées de mise en forme d'automne. P>
Voici comment j'ai résolu le problème - je reçois un datasource code> à l'intérieur de la méthode code> Démarrer code> via JNDI, puis créez ma plaquette JDBCTemplate. Cela a bien fonctionné pour moi - pas de problèmes du tout.
public class MyAppender extends AppenderBase<ILoggingEvent>
{
private String _jndiLocation;
private JDBCTemplate _jt;
public void setJndiLocation(String jndiLocation)
{
_jndiLocation = jndiLocation;
}
@Override
public void start()
{
super.start();
if (_jndiLocation == null)
{
throw new IllegalStateException("Must have the JNDI location");
}
DataSource ds;
Context ctx;
try
{
ctx = new InitialContext();
Object obj = ctx.lookup(_jndiLocation);
ds= (DataSource) obj;
if (ds == null)
{
throw new IllegalStateException("Failed to obtain data source");
}
_jt = new JDBCTemplate(ds);
}
catch (Exception ex)
{
throw new IllegalStateException("Unable to obtain data source", ex);
}
}
@Override
protected void append(ILoggingEvent e)
{
// log to database here using my JDBCTemplate instance
}
}