복붙노트

[SPRING] 봄 @ 자동 사용

SPRING

봄 @ 자동 사용

@Autowired를 Spring에서 유선으로 사용할 클래스에서 장단점은 무엇입니까?

명확히하기 위해 XML에서 자동 배선이 아닌 @Autowired 주석에 대해 구체적으로 말하고 있습니다.

아마 이해할 수 없지만, 나에게 그것은 거의 반 패턴처럼 보입니다. 수업은 단지 POJO가 아닌 DI 프레임 워크에 묶여 있음을 인식하기 시작합니다. 어쩌면 저는 처벌에 대한 열광적 인 사람 이겠지만 콩에 대한 외부 XML 설정을 좋아하고 명시적인 배선을 원합니다. 그래서 정확히 어디에 배선되어 있는지를 알고 있습니다.

해결법

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

    1.오랜 시간 동안 나는 우리가 사용하던 XML 파일과 같이 "중앙 집중적이고 선언적 인 구성"을 갖는 것이 가치 있다고 믿었습니다. 그렇다면 파일의 대부분은 구성이 아니라는 것을 깨달았습니다. 개발 후 어디서나 변경되지 않았습니다. 그런 다음 "중앙 집중식"은 아주 작은 시스템에서만 가치가 있음을 깨달았습니다. 소형 시스템에서만 구성 파일을 전체적으로 숨길 수 있습니다. 그리고 같은 "배선"이 대부분 코드의 종속성에 의해 복제 될 때 전체적으로 배선을 이해할 가치는 무엇입니까? 그래서 제가 보관해온 유일한 것은 메타 데이터 (주석)입니다. 이것은 여전히 ​​선언적입니다. 이들은 런타임에 절대로 변하지 않으며 누군가가 즉석에서 변경되는 "구성"데이터가 결코 아닙니다. 따라서 코드에 유지하는 것이 좋습니다.

    오랜 시간 동안 나는 우리가 사용하던 XML 파일과 같이 "중앙 집중적이고 선언적 인 구성"을 갖는 것이 가치 있다고 믿었습니다. 그렇다면 파일의 대부분은 구성이 아니라는 것을 깨달았습니다. 개발 후 어디서나 변경되지 않았습니다. 그런 다음 "중앙 집중식"은 아주 작은 시스템에서만 가치가 있음을 깨달았습니다. 소형 시스템에서만 구성 파일을 전체적으로 숨길 수 있습니다. 그리고 같은 "배선"이 대부분 코드의 종속성에 의해 복제 될 때 전체적으로 배선을 이해할 가치는 무엇입니까? 그래서 제가 보관해온 유일한 것은 메타 데이터 (주석)입니다. 이것은 여전히 ​​선언적입니다. 이들은 런타임에 절대로 변하지 않으며 누군가가 즉석에서 변경되는 "구성"데이터가 결코 아닙니다. 따라서 코드에 유지하는 것이 좋습니다.

    최대한 자동 배선을 사용합니다. 나는 그것을 좋아한다. 나는 총을 위협하지 않는 한 옛날 스타일의 봄으로 되돌아 가지 않을 것이다. 완전히 @Autowired를 선호하는 이유가 시간이 지남에 따라 변했습니다.

    지금 당장 필자는 자동 와이어 링을 사용하는 가장 중요한 이유는 시스템에서 추적 할 수있는 추상화가 하나도 없다는 것입니다. "빈 이름"은 효과적으로 사라졌습니다. bean 이름은 xml 때문에 만 존재합니다. 그래서 추상적 인 방향 전환 (bean-name "foo"를 bean "bar"에 연결하는 곳)의 전체 계층은 없어졌습니다. 이제 "Foo"인터페이스를 직접 내 bean에 연결하고 구현은 런타임 프로파일에 의해 선택됩니다. 따라서 의존성과 구현을 추적 할 때 코드로 작업 할 수 있습니다. 내 코드에서 자동 종속성을 보았을 때 IDE에서 "구현으로 이동"키를 누르면 알려진 구현 목록이 나타납니다. 대부분의 경우 구현이 하나뿐이므로 수업에 곧바로 들어갈 수 있습니다. 그보다 훨씬 단순 할 수는 없으며, 정확히 어떤 구현이 사용되고 있는지를 항상 알고 있습니다. (필자는 XML 배선을 통해 그 반대가 진실에 가깝다고 주장합니다 - 당신의 관점이 어떻게 변화하는지 재미 있습니다!)

    이제는 단순한 레이어라고 말할 수 있지만 시스템에 추가되는 추상화의 각 계층은 복잡성을 증가시킵니다. 나는 정말로 xml이 내가 사용 해본 시스템에 어떤 실질적인 가치도 추가하지 못했다고 생각한다.

    필자가 작업 한 대부분의 시스템에는 프로덕션 런타임 환경의 구성이 하나만 있습니다. 테스트 등을위한 다른 구성이있을 수 있습니다.

    완전한 autowiring은 봄의 루비 - 레일 (ruby-on-rails)이라고 말할 수 있습니다. 대부분의 유스 케이스가 따르는 정상적이고 공통적 인 사용 패턴이 있다는 개념을 포용합니다. XML 구성을 사용하면 일관성 있고 일관성없는 많은 구성 사용이 가능할 수도 있고 그렇지 않을 수도 있습니다. 너무 많은 xml 구성이 불일치로 넘어 섰다는 것을 보았습니다 - 코드와 함께 리팩토링 되었습니까? 생각하지 않았다. 그 이유는 무엇입니까? 일반적으로 아닙니다.

    우리는 환경 설정에서 한정어를 거의 사용하지 않고 이러한 상황을 해결하는 다른 방법을 찾았습니다. 이것은 우리가 마주 치게되는 명백한 "단점"입니다 : 우리는 autowiring으로 더 부드럽게 상호 작용하도록 코드를 변경했습니다. 고객 저장소는 더 이상 일반 Repository 인터페이스를 구현하지 않지만 Repository 인터페이스를 확장하는 CustomerRepository 인터페이스를 만듭니다. 고객>. 때로는 서브 클래 싱에 관해서도 트릭이나 두 가지가 있습니다. 그러나 일반적으로 더 강한 타이핑의 방향으로 우리를 안내 할뿐입니다.

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

    우리가 필요로하는 것은 @Component, @Autowired 및 나머지를 JSR (JSR-250과 같은)에 포함시키기위한 것이므로 봄에 연계 할 필요가 없습니다. 이것은 과거에 일어났던 일들입니다 (java.util.concurrent stuff는 마음에 떠오른다). 그래서 이것이 다시 일어난다면 나는 전혀 놀라지 않을 것이다.

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

    2.나를 위해 여기 스프링과 자동 배선에 대해 내가 싫어하는 점이있다.

    나를 위해 여기 스프링과 자동 배선에 대해 내가 싫어하는 점이있다.

    장점 :

    단점 :

    우리는 의존성 문제가 부적절하다는 이유로 스프링 통합에 너무 많이 의존하기 때문에 직장에서 거의 독점적으로 자동 배선을 사용하기 시작했습니다. 필자는 자동 배선을 광범위하게 사용하는 스프링 MVC 프로젝트에서 일했고 내 머리를 감싸기가 약간 어려웠습니다.

    Auto-wiring은 일단 익숙해지면 익숙해지면 XML 설정보다 얼마나 강력하고, 쉽고, 덜 골칫거리인지 깨닫게됩니다.

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

    3.우리는 큰 프로젝트에서 @Autowire를 XML 구성으로 다시 바 꾸었습니다. 문제는 매우 낮은 부트 스트랩 성능입니다. 자동 와이어 링 스캐너는 autowiring 검색 클래스 경로에서 모든 클래스를로드하므로, 많은 클래스가 Spring 초기화 중에 열심히로드됩니다.

    우리는 큰 프로젝트에서 @Autowire를 XML 구성으로 다시 바 꾸었습니다. 문제는 매우 낮은 부트 스트랩 성능입니다. 자동 와이어 링 스캐너는 autowiring 검색 클래스 경로에서 모든 클래스를로드하므로, 많은 클래스가 Spring 초기화 중에 열심히로드됩니다.

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

    4.스위칭 환경에 대한 논의는 거의 없습니다. 필자가 작업 한 대부분의 프로젝트는 우리가 작업하고있는 환경에 따라 의존성을 주입하는 실제적인 문제였습니다. xml 설정을 사용하면 Spring EL에서 사용하기가 매우 쉽습니다. 주석이 포함 된 좋은 해결책을 알지 못합니다. 나는 단지 하나를 알아 냈다.

    스위칭 환경에 대한 논의는 거의 없습니다. 필자가 작업 한 대부분의 프로젝트는 우리가 작업하고있는 환경에 따라 의존성을 주입하는 실제적인 문제였습니다. xml 설정을 사용하면 Spring EL에서 사용하기가 매우 쉽습니다. 주석이 포함 된 좋은 해결책을 알지 못합니다. 나는 단지 하나를 알아 냈다.

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

    그것은 작동해야하지만 좋은 해결책은 아닙니다.

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

    5.나는 @Autowire로 전환했다. 소규모 프로젝트가 아닌 다른 것에 XML 구성을 유지하는 것은 자신의 권리와 이해력이 빠르게 저하되는 작업이되었습니다.

    나는 @Autowire로 전환했다. 소규모 프로젝트가 아닌 다른 것에 XML 구성을 유지하는 것은 자신의 권리와 이해력이 빠르게 저하되는 작업이되었습니다.

    IntelliJ는 Spring 어노테이션에 대한 완벽한 (완벽하지는 않은) 지원을 제공합니다.

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

    6.필자가이 주제를 다룰 때, xml 설정은 코드의 명확성을 줄이는데, 특히 대형 시스템에서 그렇습니다.

    필자가이 주제를 다룰 때, xml 설정은 코드의 명확성을 줄이는데, 특히 대형 시스템에서 그렇습니다.

    @Component와 같은 주석은 상황을 더욱 악화시킵니다. 개발자가 객체를 변경할 수 있도록 조정합니다. 기본 생성자를 제공해야하므로 종속성을 더 이상 사용할 수 없기 때문입니다. 종속성은 공용 설정자를 통해 주입되거나 @Autowired를 통해 제어되지 않아야합니다. [심지어 더 나쁜 의존성 주입은 의존성을 인스턴스화하는 클래스로 손상되었지만, 나는 여전히 새로 작성된 코드에서이를 볼 수 있습니다!]. 통제가 안된다면, 대형 시스템에서 여러 유형의 구현 (또는 하위)을 사용할 수있는 경우 구현을 @Autowired로 이해하는 것이 훨씬 복잡해 지므로 버그를 훨씬 더 세밀하게 조사하게됩니다. 또한 테스트 환경을위한 프로파일과 프로덕션을위한 프로파일을 가지고 있다고 가정 할 때 프로덕션 버그는 테스트 환경에서 버그를 발견 할 수있는 것이 아니라 프로덕션에서 가장 많이 손상된 경우에만 발생합니다. 컴파일 시간!

    내 구성 클래스를 선언하는 중간 지점에 충실합니다 (@Configuration을 사용하는 Java 기반 스프링 구성).

    모든 bean을 구성 클래스에 명시 적으로 선언합니다. 구성 클래스에서 @Autowired 만 사용합니다. 목적은 Spring에 대한 종속성을 구성 클래스 (들)로 제한하는 것입니다.

    @Configuration은 스프링 스캔이 실행되는 유일한 장소 인 특정 패키지에 있습니다. (이것은 대규모 프로젝트에서 시작 시간을 상당히 단축시킨다)

    나는 모든 클래스를 불변으로 만들려고 노력한다. 특히 데이터 객체, JPA, Hibernate, Spring뿐만 아니라 많은 직렬화 라이브러리가 이것을 훼손하는 것처럼 보인다. 나는 세터에게 제공하도록 강요하는 물건에서 벗어나거나 재산 신고에서 최종 키워드를 삭제합니다.

    객체를 만든 후 객체를 변경하는 가능성을 줄이면 대용량 시스템의 버그가 크게 줄어들뿐만 아니라 버그가있을 때 버그를 찾는 시간이 줄어 듭니다.

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

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

    7.여기 몇 가지 경험이 있습니다. 찬성

    여기 몇 가지 경험이 있습니다. 찬성

    단점

    필자의 개인적인 경험에서 필자는 @AutoWire 주석을 테스트 케이스에서 사용하지 않았다.

  8. ==============================

    8.XML 대신 주석으로 작성하는 것이 좋습니다. Spring 매뉴얼과 마지막 버전에 따르면, XML과 Annotation은 같은 결과를 얻었다.

    XML 대신 주석으로 작성하는 것이 좋습니다. Spring 매뉴얼과 마지막 버전에 따르면, XML과 Annotation은 같은 결과를 얻었다.

    이것은 내 목록이다.

    대상 :

    단점 :

  9. ==============================

    9.내 이해를 위해 @Autowired는 인터페이스 참조를 참조하고 override funtions를 사용하는 동안 사용하는 것이 가장 좋지만이 문제는 런타임에 null로 할당되는 경우가 있습니다.

    내 이해를 위해 @Autowired는 인터페이스 참조를 참조하고 override funtions를 사용하는 동안 사용하는 것이 가장 좋지만이 문제는 런타임에 null로 할당되는 경우가 있습니다.

  10. from https://stackoverflow.com/questions/633158/spring-autowired-usage by cc-by-sa and MIT license