我有一个 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();

没有任何问题。

09-30 15:39
查看更多