我使用@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;
}
告诉我有什么区别,什么是对的?
答案 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对象管理的内容(例如,模拟)。
如果您没有被迫使用场注射,请选择构造函数注入。