Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 弹簧和@Autowired-何时进行自动布线?_Spring_Singleton_Autowired - Fatal编程技术网

Spring 弹簧和@Autowired-何时进行自动布线?

Spring 弹簧和@Autowired-何时进行自动布线?,spring,singleton,autowired,Spring,Singleton,Autowired,我有一个这样的课程: @Component public class MyClass { @Autowired public void setDataSource(DataSource dataSource) { ... } public void doSomethingUsingDataSource() { // use autowired datasource } } My applicationContext.xml包含以下内容: <

我有一个这样的课程:

@Component
public class MyClass
{

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

  public void doSomethingUsingDataSource()
  {
    // use autowired datasource
  }
}
My applicationContext.xml包含以下内容:

<context:load-time-weaver/>
<context:component-scan base-package="mypackage" />
但是,如果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,因为数据源为空

如果以这种方式创建了我的类的新实例,Spring是否无法设置数据源?或者我需要稍微更改一下配置吗?因为第一个版本可以正常工作,所以我的配置似乎是正确的

谢谢


保罗

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

public void setApplicationContext(ApplicationContext ac) throws BeansException
{
  setDataSource((DataSource) ac.getBean("dataSource"));
}
通过这样做,我能够使用静态方法保持类a的单例


保罗

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

public void setApplicationContext(ApplicationContext ac) throws BeansException
{
  setDataSource((DataSource) ac.getBean("dataSource"));
}
通过这样做,我能够使用静态方法保持类a的单例


保罗

你的第一个例子也不应该奏效。为什么不呢?它确实有效——也许我在简化过程中遗漏了什么。你一定做了。使用
new
实例化的对象如果没有一些高级的AOP配置(如加载时编织),就不会连接它们的依赖项。你们有吗?是的,对不起,我编辑了这个问题以包含我的配置片段。这将教会我如何简化事情:)是的,mc是静态的,doSomething由某个对象调用,不是在启动或关闭期间,而是在响应用户请求时。你们的第一个示例也不应该工作。为什么不呢?它确实有效——也许我在简化过程中遗漏了什么。你一定做了。使用
new
实例化的对象如果没有一些高级的AOP配置(如加载时编织),就不会连接它们的依赖项。你们有吗?是的,对不起,我编辑了这个问题以包含我的配置片段。这将教会我尝试简化事情:)是的,mc是静态的,doSomething由某个对象调用,不是在启动或关闭期间,而是响应用户请求。