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

问题描述 投票:1回答:1

我有以下代码示例

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变为null。

如何制作MyService单例并让变量myDao自动注入而不改变MyService的构造函数?

java dependency-injection guice
1个回答
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对象添加setter是更好的解决方案。如果你必须在没有注射的情况下创建你的对象,甚至不得不改变注射框架,这将为你节省不可思议的时间。

© www.soinside.com 2019 - 2024. All rights reserved.