我们使用Spring来获取所有JDBC连接以及持久性框架的一部分。但是,为了编写我们自己的自定义数据库appender(它必须是自定义的,因为由于表名标准,我们不允许使用默认的DBAppender)。如何从Custom Appender内部获取spring bean的参考/使用autowire?我宁愿呆在春天而不是使用普通的JDBC。
Custom Appender:
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class CustomDBAppender extends AppenderBase<ILoggingEvent> {
protected void append(ILoggingEvent event) {
}
}
答案 0 :(得分:3)
以下是我解决问题的方法 - 我通过JNDI在appender的DataSource
方法中获得start
,然后创建我的JDBCTemplate。它对我很有用 - 没有任何麻烦。
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
}
}
我不知道你是否会遇到同样的问题,但我不得不使用多步配置(如described here),因为我收到了SLF4J的“替代记录器”错误消息(described here )。
答案 1 :(得分:1)
您的选项仅限于此,但您可以使用SingletonBeanFactoryLocator
内容(请参阅Spring手册,Glue code and the evil singleton)和this SpringSource blog entry。
答案 2 :(得分:1)
我这样做的方法是使用AutowiredAnnotationBeanPostProcessor。
在你的appender的构造函数中,你要求AutowiredAnnotationBeanPostProcessor注入“this”。
我在this article末尾的评论详述了这项技术。本文讨论了一种自动装配Hibernate实体的类似方法。