我有一个类似的课程:
@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是否无法设置数据源?或者我需要稍微改变一下配置?由于第一个版本有效,看起来我的配置是正确的。
谢谢,
保
答案 0 :(得分:0)
最后,我通过删除自动装配来解决这个问题。我让我的类实现ApplicationContextAware并在setApplicationContext方法中设置数据源,如下所示:
public void setApplicationContext(ApplicationContext ac) throws BeansException
{
setDataSource((DataSource) ac.getBean("dataSource"));
}
通过这样做,我能够使用静态方法保持我的班级单身。
保