2016-11-30 3 views
0

는이 같은 @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; 
} 

의 차이와 무슨 일이 옳은 일을 말해?

+1

[Setter DI 대 생성자 DI의 중복 가능성?] (http://stackoverflow.com/questions/7779509/setter-di-vs-constructor-di-in-spring) – Jesper

답변

1

두 방법 모두 정확합니다. docs

봄이 포함

에서,하지만 생성자 삽입을 사용하여 모든 종속성이 세터 주입을 사용할 때 정의되는 것을 보장하기위한 메커니즘을 제공, 당신은 용기 무관 한 방식으로 종속성에 대한 요구 사항을 주장 "당신의 스프링 컨테이너가 마침내 그 클래스에 대한 여러분의 빈을 생성 할 때 필요한 모든 종속성을해야합니다 생성자 수준의 보장에

@Autowire.

1

Setter injection 대신에 constructor inject를 사용하는 것으로 보입니다. 일반 용도로는 큰 차이가 없습니다.

우리는 일반적으로 다른 모든 속성에 대해 모든 필수 공동 작업자와 세터 주입에 대해 생성자 삽입을 사용하는 것이 좋습니다. 다시 말하면, 생성자 삽입은 모든 필수 속성이 만족되었는지를 확인하며, 잘못된 상태 (객체가 공동 작업자를 통과하지 않은 상태)로 객체를 인스턴스화하는 것은 불가능합니다. 즉, 생성자 주입을 사용하는 경우 필수 속성이 설정되도록하기 위해 전용 메커니즘을 사용할 필요가 없습니다 (일반적인 Java 메커니즘 제외). 여기

는 문서가 Setter injection versus constructor injection and the use of @Required

또한에 유래에서 꽤 많은 질문/답변을 얻을 수 있습니다 설명하는 것입니다. Setter DI vs. Constructor DI in Spring?

0

예, 제대로 사용됩니다. 이를 생성자 삽입이라고합니다.

생성자 삽입을 사용하면 원하는 수정자를 final 사용할 수 있으며 Spring 객체 (예 : mocks)가 관리하지 않는 자신의 것을 쉽게 전달할 수 있습니다.

필드 주입을 사용하지 않으려는 경우 생성자 주입을 선택하십시오.

관련 문제