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

然后我得到一个 NPE,因为 dataSource 为空。

如果以这种方式创建我的类的新实例,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 回答