복붙노트

[SPRING] 의존성 주입을 제대로하는 법 (Spring)? [복제]

SPRING

의존성 주입을 제대로하는 법 (Spring)? [복제]

저는 Spring을 사용하여 클래스에 객체를 주입하는 것에 대해 의문의 여지가 있습니다. 내 프로젝트에서 이런 종류의 코드를 사용했다.

@Resource // or @Autowired even @Inject
private PersonRepository personRepository;

다음과 같이 메소드에서 정상적으로 사용됩니다.

personRepository.save(p);

그렇지 않다면 나는 스프링 예제에서 생성자를 주입했다.

private final PersonRepository personRepository;

@Autowired
public PersonController(PersonRepository personRepository) {
  this.personRepository = personRepository;
}

그래서 둘 다 맞습니까? 아니면 각각의 속성과 용도가 있습니까?

해결법

  1. ==============================

    1.후자는 정확하고 이것은 봄이나 의존성 주입 컨테이너 때문에 그리 많지는 않지만 객체 지향 클래스 디자인 원칙입니다.

    후자는 정확하고 이것은 봄이나 의존성 주입 컨테이너 때문에 그리 많지는 않지만 객체 지향 클래스 디자인 원칙입니다.

    유형은 유효한 상태에있는 인스턴스 만 만들 수 있도록 디자인되어야합니다. 이를 위해 해당 유형의 모든 필수 종속성은 생성자 인수가되어야합니다. 즉, 이러한 종속성을 Null-Check하여 최종 필드에 할당하여 불변성을 높일 수 있습니다. 그 외에도 코드 작업을 할 때 해당 인스턴스의 호출자 (또는 작성자)가 제공해야하는 종속성 (즉, API 문서를 건너 뛰거나 IDE에서 코드 완성을 사용하여)을 즉시 알 수 있습니다.

    이 모든 것은 필드 주입으로는 불가능합니다. 당신은 외부로부터의 의존성을 보지 못합니다. 여러분은 의존성을 주입시키는 흑 마술이 필요합니다. 당신이 맹목적으로 컨테이너를 신뢰한다는 것을 제외하고는 당신이 결코 null이 아니라는 것을 확신 할 수 없습니다.

    마지막으로 중요하지 않은 부분은 실제로 필드 주입으로 클래스에 많은 종속성을 추가하는 것이 덜 고통 스럽다는 것입니다. 이는 자체적으로 디자인 문제입니다. 훨씬 더 아프게되는 생성자로 인해 클래스 디자인에 대해 알려주는 좋은 일이 있습니다. 클래스에는 너무 많은 책임이 있습니다. 처음에 메트릭을 계산할 필요가 없으므로이를 확장하려고 할 때 느낍니다.

    어쨌든 당신이 용기에 의지 할 수있는 학문적 헛소리라고 사람들은 종종 주장합니다. 여기 내 걸릴이 :

    롬복 (Lombok)은 각 최종 필드에 대한 매개 변수를 취하는 생성자를 생성하고 할당하기 전에 주어진 매개 변수에서 null을 확인합니다. 따라서 현장 주입의 간결함과 생성자 주입의 설계 이점을 효과적으로 얻을 수 있습니다.

    필자는 최근에 생성자 DI에 "주입"이라는 용어를 사용하여 몹시 혼란스러워했던 일부 비 Java 사람들과 토론의 일부였습니다. 사실 그들은 생성자를 통해 의존성을 넘기는 것은 객체를 다른 사람들에게 넘겨주는 가장 자연스러운 방법이기 때문에 (모든 종류의 주입과는 완전히 대조적으로) 생성자를 통해 의존성을 전달하는 것은 전혀 주입되지 않는다고 주장했습니다.

    우리는 그런 종류의 스타일에 대해 다른 용어를 사용해야할까요? 종속성 먹이, 아마도?

  2. ==============================

    2.학계에서는 생성자가 단순히 객체를 만드는 더 좋은 방법이라는 데 동의합니다. 그러나 Java bean 스펙은 반영을 쉽게하기 위해 mutator의 premis에 빌드됩니다. 너무 많은 도구와 프레임 워크가 이러한 쉬운 패러다임을 기반으로 구축되었습니다. 서비스, ​​DAO 및 다른 싱글 톤 시나리오의 경우에는 뮤 테이타가 "친구 만 개인적인 부분을 볼 수있는"오래된 규칙을 어기는 생성자 주입 만 사용해야한다고 생각합니다.

    학계에서는 생성자가 단순히 객체를 만드는 더 좋은 방법이라는 데 동의합니다. 그러나 Java bean 스펙은 반영을 쉽게하기 위해 mutator의 premis에 빌드됩니다. 너무 많은 도구와 프레임 워크가 이러한 쉬운 패러다임을 기반으로 구축되었습니다. 서비스, ​​DAO 및 다른 싱글 톤 시나리오의 경우에는 뮤 테이타가 "친구 만 개인적인 부분을 볼 수있는"오래된 규칙을 어기는 생성자 주입 만 사용해야한다고 생각합니다.

  3. from https://stackoverflow.com/questions/24337486/how-to-properly-do-dependency-injection-in-spring by cc-by-sa and MIT license