我有一个 Spring 注入(inject)了Dao的单例(以下简化):
public class MyService<T> implements Service<T> {
private final Map<String, T> objects;
private static MyService instance;
MyDao myDao;
public void set MyDao(MyDao myDao) {
this. myDao = myDao;
}
private MyService() {
this.objects = Collections.synchronizedMap(new HashMap<String, T>());
// start a background thread that runs for ever
}
public static synchronized MyService getInstance() {
if(instance == null) {
instance = new MyService();
}
return instance;
}
public void doSomething() {
myDao.persist(objects);
}
}
我的spring配置可能看起来像这样:
<bean id="service" class="MyService" factory-method="getInstance"/>
但这将在启动期间实例化MyService。
有没有一种编程方式可以将MyDao依赖注入(inject)到MyService中,而没有Spring管理MyService?
基本上,我希望能够从我的代码中执行此操作:
MyService.getInstance().doSomething();
在 Spring 给我注入(inject)MyDao时。
最佳答案
这是一个解决方案,使用静态工厂方法创建一个类:
public class MyService {
private static MyService instance;
private MyDao myDao;
public static MyService createInstance(final MyDao myDao) {
instance = new MyService(myDao);
return instance;
}
private MyService(final MyDao myDao) {
this.myDao = myDao;
}
public static synchronized MyService getInstance() {
return instance;
}
public void doSomething() {
// just do it!
myDao.justDoIt();
}
}
并使用spring对其进行初始化:
<bean class="my.path.MyService" factory-method="createInstance" scope="singleton">
<constructor-arg ref="reference.to.myDao" />
</bean>
现在您应该可以执行以下操作:
MyService.getInstance().doSomething();
没有任何问题。