@Autowired注释是否正确使用?

时间:2016-11-30 09:23:55

标签: spring autowired

我使用@Autowired这样的注释:

@Autowired
private MyService1 myService1;

@Autowired
private MyService2 myService2;

但新的Intellij IDE 2016(3)建议并建议替换:

private final MyService1 myService1;
private final MyService2 myService2;;

@Autowired
public MyClass(MyService1 myService1, MyService2 myService2) {
    this.myService1= myService1;
    this.myService2= myService2;
}

告诉我有什么区别,什么是对的?

3 个答案:

答案 0 :(得分:1)

这两种方法都是正确的。

来自docs

  

包含Spring,提供了一种机制,用于确保在使用Setter Injection时定义所有依赖项,但是通过使用Constructor Injection,您可以以容器无关的方式声明对依赖项的要求“

构造函数级别的

@Autowire保证当spring容器最终为该类创建bean时,您将拥有所有必需的依赖项。

答案 1 :(得分:1)

建议使用构造函数注入而不是使用Setter注入。对于正常使用,没有太大的不同。

  

我们通常建议人们对所有强制协作者使用构造函数注入,并为所有其他属性使用setter注入。同样,构造函数注入确保已满足所有必需属性,并且根本无法实例化处于无效状态的对象(未通过其协作者)。换句话说,在使用构造函数注入时,您不必使用专用机制来确保设置所需的属性(除了普通的Java机制)。

这是一篇解释它的文章Setter injection versus constructor injection and the use of @Required

此外,您可以在stackoverflow中获得相当多的问题/答案。 Setter DI vs. Constructor DI in Spring?

答案 2 :(得分:0)

是的,它使用正确。这称为构造函数注入。

构造函数注入允许您使用您选择的final修饰符,并轻松传递您自己不受Spring对象管理的内容(例如,模拟)。

如果您没有被迫使用场注射,请选择构造函数注入。