2

私はそのように機能するクラスを持っています:

@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();

次に、dataSourceがnullであるため、NPEを取得します。

クラスの新しいインスタンスがこの方法で作成された場合、Springはデータソースを設定できませんか?または、構成を少し変更する必要がありますか?最初のバージョンが機能しているので、私の構成は正しいようです。

ありがとう、

ポール

4

1 に答える 1

0

最後に、自動配線を削除して解決しました。クラスに ApplicationContextAware を実装し、setApplicationContext メソッドでデータ ソースを次のように設定しました。

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

これを行うことで、クラスを静的メソッドを持つシングルトンに保つことができました。

ポール

于 2011-04-01T00:11:47.093 に答える