Java 注射工厂-如何以及为什么?

Java 注射工厂-如何以及为什么?,java,factory,factory-pattern,Java,Factory,Factory Pattern,在一次代码审查中,出现了以下评论:“我认为,您实际上是想将工厂作为实例注入,以便在需要时可以重新绑定工厂。”以及“重要提示:工厂不应该是静态的,而应该是注入的。” Test.java: Foo foo = FooFactory.get(argument); FooFactory.java: public final class FooFactory { public static Foo get(String argument) { return new Foo();

在一次代码审查中,出现了以下评论:“我认为,您实际上是想将工厂作为实例注入,以便在需要时可以重新绑定工厂。”以及“重要提示:工厂不应该是静态的,而应该是注入的。”

Test.java:

Foo foo = FooFactory.get(argument);
FooFactory.java:

public final class FooFactory {
    public static Foo get(String argument) {
        return new Foo();
    }
}

否则我该怎么做呢?在审阅者的第一条评论中,“重新绑定”是什么意思?

对于大多数依赖注入框架,您可以在运行时绑定特定的对象实现。我敢打赌,这也是评论家所指的。当然,要利用这一点,您必须注入工厂,而不是静态创建工厂。

通过这样做,您基本上忽略了依赖注入,而是使用了静态工厂。因此,如果在单元测试中,您希望工厂返回Foo的假实例而不是真实实例,那么您不能

相反,您应该使用依赖项注入(这里是Spring示例):


现在,在单元测试中,您可以注入任何您想要的FooFactory实现(通常是一个模拟)。

也许您应该询问审阅者她的意思。您是否让代码审阅者向您详细解释过?就我个人而言,我不知道他在说什么,“重新绑定”会给你带来什么?如果你的工厂不是基于接口的,我认为没有理由注入。有单元测试,所以我认为这就是审查者的意思。非常感谢你的回答!我是新来的。在这里有工厂当然很好,但是工厂将使用new关键字实例化一个Foo,这将导致Foo对象不由DI容器管理。这样行吗?我想我的问题是,什么时候一个类应该由一个容器管理,什么时候可以只使用new关键字?谢谢
public class SomeService
    private FooFactory fooFactory;

    @Autowired
    public SomeService(FooFactory fooFactory) {
        this.fooFactory = fooFactory;
    }

    public void someMethod(String arg) {
        Foo foo = fooFactory.create(arg);
        ...
    }
    ....
}