문제

사용의 장단점은 무엇입니까? @autowired 봄에 연결될 수업에서?

명확히하기 위해, 나는에 대해 구체적으로 이야기하고 있습니다 @autowired XML에서 자동으로 지우지 않는 주석.

나는 아마 그것을 이해하지 못할 것입니다. 그러나 나에게는 거의 반포 반가처럼 보입니다. 당신의 수업은 그들이 단순히 pojos가 아닌 DI 프레임 워크에 묶여 있음을 알기 시작합니다. 어쩌면 나는 처벌에 대한 글루튼 일지 모르지만 콩에 대한 외부 XML 구성을 좋아하고 명시 적 배선을 좋아하므로 어디에선 유선이 무엇인지 알고 있습니다.

도움이 되었습니까?

해결책

오랫동안 나는 우리 모두가 사용했던 XML 파일과 같이 "중앙 집중식 선언적 구성"을 갖는 데 가치가 있다고 믿었습니다. 그런 다음 파일의 대부분의 물건이 구성 - 개발 후 어느 곳에서도 변화가 없었습니다. 그런 다음 "중앙 집중화 된"은 소규모 시스템에서만 가치가 있다는 것을 깨달았습니다. 소형 시스템에서만 구성 파일을 맥주 할 수있을 것입니다. 전체적으로. 동일한 "배선"이 코드의 종속성에 의해 대부분 복제 될 때 배선을 전체적으로 이해하는 데 실제로 가치는 무엇입니까? 제가 유지 한 유일한 것은 메타 데이터 (주석)입니다. 이것들 절대 런타임에 변경하십시오 절대 누군가가 즉석에서 변경 될 "구성"데이터 - 코드에 보관하는 것이 좋다고 생각합니다.

나는 가능한 한 전체 자동 직접 사용을 사용합니다. 나는 그것을 좋아한다. 총기를 위협하지 않으면 구식 스프링으로 돌아 가지 않을 것입니다. 완전히 선호하는 이유 @Autowired 시간이 지남에 따라 변경되었습니다.

지금 당장 Autowiring을 사용하는 가장 중요한 이유는 시스템에 추적을 유지하기 위해 추상화가 하나도 없기 때문입니다. "콩 이름"은 효과적으로 사라졌습니다. XML로 인해 콩 이름이 존재합니다. 따라서 추상 간접 (Bean-name "foo"를 Bean "Bar"에 연결하는 곳)의 전체 층이 사라졌습니다. 이제 "FOO"인터페이스를 Bean에 직접 연결하고 런타임 프로파일로 구현이 선택됩니다. 이것은 나를 허용합니다 코드로 작업하십시오 의존성 및 구현을 추적 할 때. 내 코드에서 자동으로 의존성이 보이면 IDE에서 "구현으로 이동"키를 누르면 알려진 구현 목록이 나옵니다. 대부분의 경우 하나의 구현이 있는데, 나는 수업에 곧바로 들어갑니다. 그보다 훨씬 간단 할 수는 없으며 항상 알고 있습니다. 바로 그거죠 어떤 구현이 사용되고 있는지 (나는 반대가 XML 배선으로 진실에 더 가깝다고 주장한다 - 당신의 관점이 어떻게 변하는 지 재미있다!)

이제 당신은 그것이 매우 간단한 계층이라고 말할 수 있지만, 우리가 시스템에 추가하는 각 추상화 계층 증가하다 복잡성. 나는 XML이 내가 함께 일한 시스템에 실제 가치를 추가 한 적이 없다고 생각합니다.

내가 함께 일한 대부분의 시스템은 가지고 있습니다 하나 생산 런타임 환경의 구성. 테스트 등을위한 다른 구성이있을 수 있습니다.

나는 Full Autowiring이 Spring의 Ruby-on-Rails라고 말하고 싶습니다. 그것은 대부분의 사용 사례가 따르는 정상적이고 일반적인 사용 패턴이 있다는 개념을 받아들입니다. XML 구성으로 허용하다 의도 할 수있는 일관된/일관성없는 구성 사용법. 너무 많은 XML 구성이 불일치로 배 밖으로 나오는 것을 보았습니다. 코드와 함께 리팩토링 되나요? 생각하지 않았다. 이유가 있기 때문에 그 차이가 있습니까? 보통.

우리는 구성에 예선을 거의 사용하지 않으며 이러한 상황을 해결하는 다른 방법을 찾았습니다. 이것은 분명한 "단점"입니다. Repository<Customer> 인터페이스이지만 인터페이스를 만듭니다 CustomerRepository 그것은 확장됩니다 Repository<Customer>. 때로는 서브 클래싱에 관해서는 한두 가지가 있습니다. 그러나 그것은 일반적으로 더 강한 타이핑의 방향으로 우리를 지적하는 것이 거의 항상 더 나은 솔루션입니다.

그러나 그렇습니다. 당신은 대부분 봄이하는 특정 스타일의 DI에 묶고 있습니다. 우리는 더 이상 종속성을위한 공개 세터를 만들지 않습니다 (따라서 우리는 캡슐화/정보 숨기기 부서에서 +1이라고 주장 할 수 있습니다) 우리는 여전히 시스템에 XML이 여전히 있지만 기본적으로 XML은 이상이 포함되어 있습니다. Full Autowiring은 XML과 잘 통합됩니다.

우리가 지금 필요한 유일한 것은입니다 @Component, @Autowired 그리고 나머지는 JSR에 포함됩니다 (예 : JSR-250), 그래서 우리는 봄과 묶을 필요가 없습니다. 이것이 과거에 일이 일어나고있는 방식입니다 ( java.util.concurrent 물건이 떠오르는 것들), 이런 일이 다시 일어난다면 나는 완전히 놀라지 않을 것입니다.

다른 팁

나를 위해 여기서 나는 봄과 자동 승리에 대해 내가 좋아하거나 싫어하는 것입니다.

장점 :

  • 자동 지선은 불쾌한 XML 구성을 제거합니다.
  • 필드, 세터 방법 또는 생성자를 사용하여 직접 주입 할 수있는 주석을 사용하기가 훨씬 쉽습니다. 또한 주입 된 콩을 주석에 넣고 '자격'할 수 있습니다.

단점 :

  • 자동 승리 및 주석을 사용하면 XML 구성과 마찬가지로 스프링 유무에 관계없이 실행할 수있는 스프링 라이브러리에 의존 할 수 있습니다. 당신이 말했듯이, 당신은 di 프레임 워크에 묶여 있습니다.
  • 동시에 나는 콩을 '자격'할 수있는 것을 좋아합니다. 이것은 나에게 코드를 정말 지저분하게 만듭니다. 여러 곳에서 같은 콩을 주입 해야하는 경우 동일한 문자열 이름이 반복되는 것을 보았습니다. 나에게 이것은 오류의 가능성이있는 것 같습니다.

어쨌든 우리는 스프링 통합에 크게 의존하여 종속성 문제가 무의미하기 때문에 거의 독점적으로 직장에서 자동으로 배선하는 것을 사용하기 시작했습니다. 나는 자동선을 광범위하게 사용했으며 머리를 감싸기가 조금 어려웠던 Spring MVC 프로젝트에서 일했습니다.

자동 지배는 획득 된 취향이라고 생각합니다. 일단 익숙해지면 XML 구성보다 얼마나 강력하고 쉽고, 두통이 훨씬 적습니다.

우리는 큰 프로젝트에서 @autowire에서 XML 구성으로 전환하고 있습니다. 문제는 부트 스트랩 성능이 매우 낮습니다. Autowiring Scanner는 Autowiring Search ClassPath의 모든 클래스를로드하므로 스프링 초기화 중에 많은 클래스가 간절히로드됩니다.

스위칭 환경에 대한 논의는 거의 없었습니다. 내가 작업 한 대부분의 프로젝트는 우리가 작업중 인 환경에 따라 종속성을 주입하는 데 실제 문제였습니다. XML 구성을 사용하면 Spring EL과 매우 간단하며 주석이있는 멋진 솔루션을 알지 못합니다. 방금 하나를 알아 냈습니다.

    @Value("#{${env} == "production" ? realService : dummyService}")
    private SomeService service;

작동하지만 멋진 솔루션 IMHO는 아닙니다.

@autowire로 전환했습니다. 소규모 프로젝트 이외의 다른 것에서 XML 구성을 유지하는 것은 그 자체로서의 작업이되어 이해력이 빠르게 저하되었습니다.

Intellij는 봄 주석에 대한 좋은 (완벽하지 않은) 지원을 제공합니다.

이 주제에 대한 나의 주제는 XML 구성이 특히 대규모 시스템에서 코드의 명확성을 줄인다는 것입니다.

@Component와 같은 주석은 상황을 더욱 악화시킵니다. 기본 생성자를 제공해야한다는 점을 감안할 때 의존성이 더 이상 최종적으로 이루어질 수 없으므로 개발자가 객체를 변경할 수 있도록 조정합니다. 의존성은 공개 세터를 통해 주입하거나 @autowired를 통제하지 않아야합니다. [심지어 의존성 주입도 종속성을 인스턴스화하는 클래스로 손상되지만 여전히 새로 쓰여진 코드로 이것을 볼 수 있습니다!] 통제되지 않음으로써, 대규모 시스템에서, 유형의 여러 구현 (또는 어린이)을 사용할 수있게되면 구현이 @autowized인지 이해하는 것이 훨씬 더 어려워지는 것이 훨씬 더 어려워집니다. 또한 테스트 환경과 생산에 대한 프로파일이있는 것으로 보입니다. 생산 버그는 생산에서 가장 아프거나 테스트 환경에서 버그를 발견하거나 더 나은 시간을 컴파일하십시오!

나는 구성 클래스 (ES)를 선언하는 중간지면을 고수합니다 (@Configuration을 사용하여 Java 기반 스프링 구성)

구성 클래스 (ES)에서 모든 콩을 명시 적으로 선언합니다. 구성 클래스 (ES)에서만 @autowired 만 사용합니다. 목적은 스프링의 구성 클래스로 의존성을 제한하는 것입니다 (ES).

@configuration은 특정 패키지에 있습니다. 스프링 스캔이 실행되는 유일한 곳입니다. (대규모 프로젝트에서 실질적으로 시작 시간을 가속화합니다)

나는 모든 클래스, 특히 데이터 객체, JPA, 최대 절전 모드 및 스프링을 불변으로 만들기 위해 노력하고 있으며, 많은 직렬화 라이브러리가이를 훼손하는 것처럼 보입니다. 나는 세터를 제공하거나 속성 선언에서 최종 키워드를 제거하는 모든 것을 벗어나게합니다.

객체가 생성 된 후 변경 가능성을 줄이고 큰 시스템의 버그를 실질적으로 줄이고 버그가 존재할 때 버그를 찾는 시간을 줄입니다.

또한 개발자가 시스템의 다른 부분 간의 상호 작용을 더 잘 설계하도록 강요하는 것 같습니다. 문제와 버그는 점점 더 많은 컴파일 오류가되어 시간 낭비를 줄이고 생산성을 향상시킵니다.

여기에 경험이 있습니다
프로

  • @autowire 주석 만 사용할 수 있으므로 구성하기가 더 쉬워집니다.
  • 세터 메소드를 사용하고 싶지 않으므로 클래스가 더 깨끗합니다.

단점

  • 우리가 DI를 사용하고 있지만 XML 파일에 단단히 커플
  • 구현을 찾기가 어렵습니다 (그러나 Intellij와 같은 좋은 IDE를 사용하는 경우 이것을 제거 할 수 있습니다).

내 개인적인 경험에 따라 나는 @autowire 주석을 많이 사용하지 않았지만 시험 사례에서는 사용하지 않았습니다.

나는 XML 대신 주석으로 쓰기를 정말 좋아합니다. 스프링 매뉴얼과 마지막 버전에 따르면 XML과 주석은 동일한 결과를 달성했습니다.

이것은 내 목록입니다

찬성:

  • XML에서 쓸모없는 라인을 제거하십시오
  • 코드 디버깅 단순화 : 수업을 열면 클래스에있는 것을 읽을 수 있습니다.
  • 보다 빠른 개발, 400 개 이상의 XML 라인이있는 프로젝트를 읽을 수 있습니까?

단점 :

  • 표준 Java 구현은 아니지만 Java Standard API 인 @inject를 사용하도록 전환 할 수 있으므로 Bean은 Pojo로 남아 있습니다.
  • 당신은 단순히 모든 곳에서 단순히 DB 연결을 사용할 수는 없지만 의견 일뿐입니다. 모든 구성을 읽는 장소가 선호합니다.

@autowired를 이해하는 것은 인터페이스 참조를 참조하고 해당 재정의 기능을 사용하는 동안 사용하는 것이 가장 좋지만,이 문제는 때때로 런타임에 null에 할당된다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top