Использование Spring из пользовательского приложения для обратной регистрации?

#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.