복붙노트

[SPRING] 세터 DI 대. DI 빌더는 봄?

SPRING

세터 DI 대. DI 빌더는 봄?

Spring은 DI의 두 가지 유형 인 setter DI와 construction DI를 가지고있다.

생성자 기반 DI는 종속성을 주입해야하는 순서를 수정합니다. 세터 기반 DI는 이것을 제공하지 않습니다.

Setter 기반 DI는 필요할 때만 종속성을 주입하는 데 도움이됩니다.

두 가지 유형의 스프링 DI가 동일한 기능을 제공하기 때문에 다른 중요한 차이점은 없습니다. setter와 생성자 DI가 코드 시작시 종속성을 주입합니다. 부여 된 생성자 DI는 생성자를 통해이를 수행하지만 설정자 DI는 객체를 생성 한 직후 설정자를 통해 수행하지만 성능과 관련하여 개발자에게는 아무런 차이가 없습니다. 둘 다 또한 순서를 지정하는 수단을 제공합니다 의존성 주입에 대해서도 마찬가지입니다.

나는 하나가 다른 것보다 뚜렷한 이점을 제공하거나 하나의 유형이 완전히 사용할 수없는 경우를 찾고있다.

해결법

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

    1.스프링과 관련된 장단점 :

    스프링과 관련된 장단점 :

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

    2.툴 (스프링) 고려 사항이 아닌 디자인 고려 사항을 기반으로 결정해야합니다. 안타깝게도 Spring은 원래 setter injection을 사용하도록 훈련 시켰습니다. 원래 생각할 때, Java에서는 "annotation"과 XML에서 setter injection 작업이 훨씬 더 잘 보이기 때문입니다. 오늘날 우리는 이러한 제약 조건에서 벗어나 다시 설계 결정을 내릴 수있게되었습니다. 빈은 선택 사항 인 의존성을 위해 bean과 setter injection에 필요한 의존성에 대해 생성자 삽입을 사용해야하며, OOD가 처음부터 우리에게 알려준 것처럼 다소의 합리적인 기본값을가집니다.

    툴 (스프링) 고려 사항이 아닌 디자인 고려 사항을 기반으로 결정해야합니다. 안타깝게도 Spring은 원래 setter injection을 사용하도록 훈련 시켰습니다. 원래 생각할 때, Java에서는 "annotation"과 XML에서 setter injection 작업이 훨씬 더 잘 보이기 때문입니다. 오늘날 우리는 이러한 제약 조건에서 벗어나 다시 설계 결정을 내릴 수있게되었습니다. 빈은 선택 사항 인 의존성을 위해 bean과 setter injection에 필요한 의존성에 대해 생성자 삽입을 사용해야하며, OOD가 처음부터 우리에게 알려준 것처럼 다소의 합리적인 기본값을가집니다.

  3. ==============================

    3.생성자 삽입 : 생성자를 통해 종속성을 주입합니다.

    생성자 삽입 : 생성자를 통해 종속성을 주입합니다.

    일반적으로 필수 종속성에 사용할 수 있습니다.

    생성자 삽입을 사용하는 경우 "순환 종속성"이라는 단점이 있습니다.

    순환 의존성 : A와 B를 가정해라. A는 B.에 의존한다. B는 A.에 의존한다.이 생성자에서 주입은 실패 할 것이다. 그 당시 세터 주입이 유용합니다.

    Object 상태가 일관되지 않으면 Object를 만들지 않습니다.

    Setter Injection : 우리는 Setter 메서드를 통해 종속성을 주입합니다.

    이것은 필수가 아닌 종속성에 유용합니다.

    Setter Injection을 사용하여 종속성을 다시 주입 할 수 있습니다. 생성자 삽입에서는 불가능합니다.

  4. ==============================

    4.봄 5 이후부터 spring.io의 내용에 따라

    봄 5 이후부터 spring.io의 내용에 따라

    위 인용문 링크입니다.

    그러나 모든 주사 유형을 사용할 수 있으며 그 중 어느 것도 사용되지 않습니다. 높은 수준에서 모든 주입 유형에 대해 동일한 기능을 얻을 수 있습니다.

    즉, 팀과 프로젝트에 가장 적합한 분사 유형을 선택하십시오.

    Spring 팀 및 독립적 인 블로그 게시물의 권장 사항은 시간이 지남에 따라 다릅니다. 굳건한 규칙은 없습니다.

    특정 주사 스타일을 Spring 팀에서 권장하지 않은 경우이를 사용하지 않거나 더 이상 사용하지 않는 것으로 표시합니다. 어떤 주입 스타일에도 해당하지 않습니다.

  5. ==============================

    5.세터 주입을 선호합니다.

    세터 주입을 선호합니다.

    Ryan이 지적한대로 봄이 없으면 어떻게 될지 생각하십시오. 생성자에서 종속성을 전달 하시겠습니까? 종속성이 너무 많으면 잘못되었습니다. 반면에 생성자는 객체의 유효한 상태를 적용하는 데 사용할 수 있습니다. 모든 종속성이 필요하며 객체가 null이 아닌지 확인해야합니다.

    프록시는 또 다른 것입니다 (Tomasz가 지적했듯이) - 전체 아이디어를 무효화하는 더미 생성자가 필요합니다.

    세 번째 옵션 인 btw - field injection이 있습니다. 비록 여분의 세터를 저장하기 때문에 그것은 좋은 디자인 결정이 아니지만 그것을 사용하는 경향이 있지만, 이것이 봄의 밖에서 사용된다면 세터를 추가해야 할 것입니다.

  6. ==============================

    6.Constructor DI와 Setter 기반 DI를 모두 섞을 수 있기 때문에 필수 종속성에 대한 생성자 인수와 선택적 종속성에 대한 설정자를 사용하는 것이 좋습니다.

    Constructor DI와 Setter 기반 DI를 모두 섞을 수 있기 때문에 필수 종속성에 대한 생성자 인수와 선택적 종속성에 대한 설정자를 사용하는 것이 좋습니다.

    setter에 @Required 어노테이션을 사용하면 setter에 필요한 종속성을 만들 수 있습니다.

  7. ==============================

    7.아니, 심지어 Constructor Injection도 발생하지만, 주입은 여전히 ​​작동하지만 제한된 초기화, setter 주입은 선택 사항이며 유연합니다. 일반적으로 매개 변수 클래스의 경우, 다른 스프링 콩을 가진 스프링 콩

    아니, 심지어 Constructor Injection도 발생하지만, 주입은 여전히 ​​작동하지만 제한된 초기화, setter 주입은 선택 사항이며 유연합니다. 일반적으로 매개 변수 클래스의 경우, 다른 스프링 콩을 가진 스프링 콩

  8. from https://stackoverflow.com/questions/7779509/setter-di-vs-constructor-di-in-spring by cc-by-sa and MIT license