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由某个对象调用,不是在启动或关闭期间,而是响应用户请求。