Guice-如何制作一个没有args构造函数单例的类并让变量自动注入?

时间:2019-03-15 03:15:19

标签: java dependency-injection guice

我有以下代码示例

public interface MyDao {
    ...
}

public class MyDaoImpl implements MyDao {
    ...
}

public class MyService {
    @Inject
    private MyDao myDao;

    ...
}

public class MyModule extends AbstractModule {
    @Override
    public void configure() {
        bind(MyDao.class).to(MyDaoImpl.class).in(Singleton.class);
    }
}

在上课时,我有

Injector injector = Guice.createInjector(new MyModule());
MyService myService = injector.getInstance(MyService.class);
MyService myService2 = injector.getInstance(MyService.class);

myServicemyService2是不同的对象。

如果我在MyModule中添加以下代码

@Provides
@Singleton
public MyService getMyService() {
    return new MyService();
}

myServicemyService2成为同一对象,但变量myDao变为空。

如何在不更改MyService的构造函数的情况下使myDao单身并让变量MyService自动注入?

1 个答案:

答案 0 :(得分:2)

在您给出的示例中,您是通过简单地调用其构造函数而不是注入来生成MyService的。

要解决您的问题,您可以将服务绑定到配置中,并通过调用getInstance

来创建
public class MyModule {
    @Override
    public void configure() {
        bind(MyDao.class).to(MyDaoImpl.class).in(Singleton.class);
        bind(MyService.class).in(Singleton.class);
    }
}

请注意,如chrylis所述,在MyDao类中更改MyService对象的构造函数或添加设置器将是更好的解决方案。如果您不得不在不进行注入的情况下创建对象,甚至不得不更改注入框架,那将为您节省无数的时间。