Spring和@Autowired - 什么时候自动装配?

时间:2011-03-28 17:55:40

标签: spring singleton autowired

我有一个类似的课程:

@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 :(得分:0)

最后,我通过删除自动装配来解决这个问题。我让我的类实现ApplicationContextAware并在setApplicationContext方法中设置数据源,如下所示:

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

通过这样做,我能够使用静态方法保持我的班级单身。