Spring и @Autowired - когда происходит автоматическое подключение? - PullRequest
2 голосов
/ 28 марта 2011

У меня есть класс, который работает следующим образом:

@Component
public class MyClass
{

  @Autowired
  public void setDataSource(DataSource dataSource)
  {
    ...
  }

  public void doSomethingUsingDataSource()
  {
    // use autowired datasource
  }
}

Мой applicationContext.xml содержит это:

<context:load-time-weaver/>
<context:component-scan base-package="mypackage" />

Это прекрасно работает, если я создаю экземпляр MyClass в другом классе:

MyClass mc = new MyClass();
mc.doSomethingUsingDataSource();

Однако, если вместо MyClass используется одиночный код:

@Component
public class MyClass
{
  private static MyClass mc;

  @Autowired
  public void setDataSource(DataSource dataSource)
  {
    ...
  }

  private void doSomethingUsingDataSource()
  {
    // use autowired datasource
  }

  public static void doSomething()
  {
    if (mc == null)
    {
      mc = new MyClass();
    }
    mc.doSomethingUsingDataSource();
  }
}

, и я звоню

MyClass.doSomething();

, тогда я получаю NPE, поскольку dataSource равен нулю.

Может ли Spring установить источник данных, если таким образом создается новый экземпляр моего класса?Или мне нужно немного изменить мою конфигурацию?Поскольку первая версия работает, похоже, моя конфигурация верна.

Спасибо,

Пол

1 Ответ

0 голосов
/ 01 апреля 2011

В конце концов я разобрался, убрав автопроводку.Я заставил свой класс реализовать ApplicationContextAware и установил источник данных в методе setApplicationContext следующим образом:

public void setApplicationContext(ApplicationContext ac) throws BeansException
{
  setDataSource((DataSource) ac.getBean("dataSource"));
}

Таким образом я смог сохранить свой класс в одиночном состоянии со статическими методами.

Пол

...