Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并与Java中的构造函数注入进行了比较_Java_Dependency Injection - Fatal编程技术网

并与Java中的构造函数注入进行了比较

并与Java中的构造函数注入进行了比较,java,dependency-injection,Java,Dependency Injection,我见过几个倾向于使用方法注入的框架,例如: public abstract class MyClass { /** Create the class here */ protected abstract Prototype createPrototype(); public void doSomething() { createPrototype().foo(); } public void doSomethingElse() {

我见过几个倾向于使用方法注入的框架,例如:

public abstract class MyClass {
    /** Create the class here */
    protected abstract Prototype createPrototype();

    public void doSomething() {
        createPrototype().foo();
    }
    public void doSomethingElse() {
        createPrototype().bar();
    }
}
他们可能会使用匿名内部类来添加自定义功能/创建您的首选对象:

   new MyClass() {
      createPrototype() {
        return prototype;
      }
   }
还有其他支持构造函数注入的,比如guice


与构造函数注入相比是否有优势,使用方法注入是否是一种良好的实践

在一些罕见的情况下,基于构造函数的依赖项注入是不可能的,但是我认为通常认为使用基于构造函数的DI比使用基于方法的DI更好,因为这样你的对象就可以在一切就绪的情况下初始化,如果缺少了什么,那么您可以在对象构造中一次抓住它。另外,您通常不希望在设置依赖项之后弄乱它们,因此为它们添加一堆setter在某种程度上破坏了封装。如果你从来都不想使用setter,那么拥有setter有什么意义呢?

现在还不清楚你在问什么。您的第一个示例不是方法注入,您也没有提供任何上下文(有时一个或另一个显然更好,而且越来越多的字段直接通过反射设置)。我认为构造函数注入和字段注入是一个更有趣的问题,因为它们在用例中的差异更大。第一个示例来自方法注入的spring示例。使用方法注入没有重大问题或危害?@BerlinBrown再次阅读了这个问题,我发现您指的是spring的查找方法注入spring使用字节码生成来创建一个工厂方法,该方法返回原型范围的bean,以便您可以在单例范围的bean中使用它。我对竞争对手(guice等)了解不够,无法进行比较。我不确定将它与构造函数注入相比较是否有意义。我不一定是在谈论spring的查找。我只是举了他们的例子。我对使用这种方法更感好奇。你提供了很好的信息。@BerlinBrown好的。我认为关键的是,在这个例子中,使用了这个技术,因为如果不是这样的话;不可能有一个在其中使用原型范围bean的单例bean。如果有一个面向构造函数的替代方案来解决sam问题,那么我不知道。干杯:)