Guice injectMembers方法

Abi*_*idi 7 guice

我理解使用构造函数注入优于setter注入的好处,但在某些情况下,我必须坚持使用基于setter的注入.我的问题是如何使用injector.injectMembers()方法注入所有基于setter的注入类的成员?

//I am calling this method in init method of my application
private static final Injector injector = Guice.createInjector(new A(), new B());

//Injecting dependencies using setters of all classes bound in modules A and B
injector.injectAllMembers()??
Run Code Online (Sandbox Code Playgroud)

Pav*_*vel 11

为什么需要手动注入依赖项?

Guice自动将依赖项注入字段和方法.使用:

YourClass yourClass = injector.getInstance(YourClass.class);
Run Code Online (Sandbox Code Playgroud)

Guice文档:

每当Guice创建一个实例时,它会自动执行此注入(在首次执行构造函数注入之后),因此如果您能够让Guice为您创建所有对象,则永远不需要使用此方法.

您需要将成员自己注入到手动创建的实例中,如下所示:

YourClass yourClass = new YourClass();
injector.injectMembers(yourClass);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用类似的东西:

public class YourClassProvider implements Provider<YourClass> {

    private final Injector injector;

    @Inject
    public YourClassProvider(Injector injector) {
        this.injector = injector;
    }

    public YourClass get() {

        YourClass yourClass = new YourClass();
        injector.injectMembers(yourClass);

        return yourClass;
    }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,YourClass的setter应该用@Inject注释.