Dependency Injection into your Singleton

dependency-injection, singleton, spring

Solution

Here is a solution, create a class with a static factory method:

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();
    }
}

and use spring to initilize it:

  <bean class="my.path.MyService" factory-method="createInstance" scope="singleton">
    <constructor-arg ref="reference.to.myDao" />
  </bean>

and now you should be able to do:

MyService.getInstance().doSomething();

without any problems.

Problem

I have a singleton that has a spring injected Dao (simplified below): ``` 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); } } ``` My spring config will probably look like this: ``` <bean id="service" class="MyService" factory-method="getInstance"/> ``` But this will instantiate the MyService during startup. Is there a programmatic way to do a dependency injection of MyDao into MyService, but not have spring manage the MyService? Basically I want to be able to do this from my code: ``` MyService.getInstance().doSomething(); ``` while having spring inject the MyDao for me.

Original source