#java #spring #logback
#java #spring #обратный вход
Вопрос:
Мы используем Spring для получения всех наших подключений JDBC, а также части нашей платформы сохранения. Однако для того, чтобы написать наше собственное пользовательское приложение DB (оно должно быть пользовательским, поскольку нам не разрешено использовать DBAppender по умолчанию из-за стандартов имен таблиц). Как я могу получить ссылку на spring beans / использовать autowire на этом этапе из пользовательского приложения? Я бы предпочел оставаться в spring вместо использования обычного JDBC.
Пользовательское приложение:
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class CustomDBAppender extends AppenderBase<ILoggingEvent> {
protected void append(ILoggingEvent event) {
}
}
Ответ №1:
Вот как я решил проблему — я получаю DataSource
внутри start
метода приложения через JNDI, а затем создаю свой 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
}
}
Я не знаю, столкнетесь ли вы с такой же проблемой, но мне пришлось использовать многоступенчатую конфигурацию (как описано здесь), потому что я получал сообщение об ошибке SLF4J «substitue logger» (описанное здесь).).
Ответ №2:
Способ, которым я это делаю, заключается в использовании AutowiredAnnotationBeanPostProcessor.
В конструкторе вашего приложения вы просите AutowiredAnnotationBeanPostProcessor ввести «это».
Мои комментарии в конце этой статьи подробно описывают технику. В статье рассказывается об аналогичном методе автоматического подключения объектов гибернации.
Ответ №3:
Здесь ваши возможности ограничены, но вы можете использовать SingletonBeanFactoryLocator
материал (см. Руководство Spring, Glue code и злой синглтон) и эту запись в блоге SpringSource.