有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建非辅助依赖关系?

假设我有一个第三方类,如下所示:

public class MyObject {
    @Inject
    public MyObject(Foo foo, Bar bar) { ... }
}

现在假设我有这样一个工厂界面:

public interface MyObjectFactory {
    public MyObject build(Bar bar);
}

我的想法是希望有一个MyObjectFactory为固定的Foo构建一个MyObject,也就是说,本质上是从外部在Bar构造函数参数上添加^{}注释。当然,手动实现MyObjectFactory始终是可能的:

public class MyObjectFactoryImpl implements MyObjectFactory {
    @Inject private Provider<Foo> foo;

    @Override
    public MyObject build(Bar bar) { return new MyObject(foo.get(), bar); }
}

但是假设有一些条件要求我拥有Guice buildMyObject实例——例如,方法拦截器。这似乎是“注射注射器”的工作:

public class MyObjectFactoryImpl implements MyObjectFactory {
    @Inject private Injector injector;

    @Override
    public MyObject build(Bar bar) {
        Injector child = injector.createChildInjector(new AbstractModule() {
            @Override
            protected void configure() {
                bind(Bar.class).toInstance(bar);
                // Set up method interceptors for MyObject here...
            }
        });
        return child.getInstance(MyObject.class);
    }
}

这听起来很邪恶,很简单,所以我想知道是否有其他的实现和/或让Guice生成工厂impl的方法


共 (1) 个答案

  1. # 1 楼答案

    实际上是的。看看Assisted Inject

    包括

            <dependency>
                <groupId>com.google.inject.extensions</groupId>
                <artifactId>guice-assistedinject</artifactId>
                <version>${guice.version}</version>
            </dependency>
    

    辅助注射更新

    public class MyInjectedObject extends MyObject implements MyIntf {
    @Inject
    public MyObject(Foo foo, @Assisted Bar bar) { super(foo,bar); }
    }
    

    您必须再添加一个接口:

    public interface MyIntf {}
    

    在模块中,将通用工厂绑定到接口

        install(new FactoryModuleBuilder()
                .implement(MyIntf.class, MyInjectedObject.class)
                .build(MyObjectFactory.class)
    );
    

    现在你可以在任何你想要的地方注入MyObjectFactory

    MyObject obj = myObjectFactory.build(bar);