是否有新的'优于Spring Autowire

时间:2016-08-13 21:31:06

标签: java spring dependency-injection

是否有理由更喜欢使用新关键字?例如,假设我有一个只在另一个类中调用一次的类。在这种情况下,最好使用new关键字。或者首选Autowire,为什么?

例如,假设我的代码只需要调用其他几个类中的一个,具体取决于条件。此外,Autowired类可能有也可能没有其他类在其中自动装配。

class MyClass {

    @Autowire
    Obj1 obj1;

    @Autowire
    Obj2 obj2;

    @Autowire
    Obj3 obj3;

    public ResponseObj myMethod() {
        ResponseObj responseObj;

        if (some condition) {
            responseObj = obj1.someMethod();  //any reason to use 'new' here instead?
        } else if (some other condition) {
            responseObj = obj2.someOtherMethod();
        } else
            responseObj = obj3.anotherMethod();
        }

        return responseObj;

    }

}

2 个答案:

答案 0 :(得分:1)

如果一个类没有重依赖(很容易构造)并且你永远不需要换掉它的实现(比如测试它与客户端的交互,甚至),那么当然可以使用一个来创建对象。构造函数。

您不会将Integer或BigDecimal注入类中。你用新的创建它们。您也可以使用DTO(数据传输对象)执行相同的操作。

与在数组列表中存储状态的类相同。您通常在创建类时使用new创建列表。注入列表实例不会带来任何好处,阅读代码的人会惊讶地看到你使用DI。

但是,如果从方法返回Json字符串,则需要将对象映射器注入类中。两者都具有灵活性和便于测试。

此外,您需要注入的任何内容都需要在spring配置文件中创建,或者作为类的注释创建。您希望Spring配置文件能够反映您的应用程序结构,而不是充斥着无关的对象声明。如果你正在使用注释,你会发现很难公开像数组列表那样的东西:)。

请记住,弹簧创建的对象是您不必的,但是您不会将它用于所有内容。您将在编写更多代码时学习。

答案 1 :(得分:0)

  

此外,Autowired类可能有也可能没有其他类   在他们内部自动装配。

这是一个重点。如果您使用new Obj3(),那么它将不会成为Spring托管的bean,因此您必须手动创建和设置所有obj3的依赖项以及它的依赖性'依赖。等等。如果您想在对象图中更改几个级别的共享依赖项的实现,该怎么办?如果您使用了new,那么您必须手动搜索代码并将new Obj3()的所有匹配项更改为new Obj3B()等,这样会破坏自动装配的目的。如果您要使用自动装配,最好一直使用它并避免使用new