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

Guice - How to make a class with no args constructor singleton and let the variables auto injected?

我有以下代码示例

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

主要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 的构造函数的情况下使 MyService 成为单例并让变量 myDao 自动注入?

在您提供的示例中,您通过简单地调用其构造函数而不是注入来生成 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 所述,更改构造函数或为 MyService 中的 MyDao 对象添加 setter 将是更好的解决方案class。如果您必须在没有注入的情况下创建对象,甚至必须更改注入框架,那将为您节省大量时间。