스프링-구성에 대한 혼란?


9

Spring을 읽는 곳은 구성보다 편리함을 제공합니다. 그러나 Spring 사람들은 구성을 너무 많이 변경하여 XML 구성이나 주석을 사용하는 것이 실제로 혼란 스럽습니다.

XML과 주석을 사용할 때 확실한 방법론이나 경험 법칙을 제안하고 싶습니다.


SO의 예는 나와 같은 많은 초보자가 구성에 대해 혼란스러워하고 있음을 보여줍니다.

  • 링크 -1

    <context:annotation-config>및 의 기능을 파악하지 못하는 것 같습니다 <context:component-scan>.

    내가 읽은 것에서 그들은 다른 주석 (@Required, @Autowired etc vs @Component, @Repository, @Service 등)을 처리하는 것처럼 보이지만 읽은 것에서도 동일한 bean post processor 클래스를 등록합니다.

    나를 더 혼란스럽게하기 위해 annotation-config속성이 있습니다 <context:component-scan>...

  • 링크 2

    여전히 컴포넌트 스캔 태그가 있습니다.

    <context:component-scan base-package="com.mycompany.maventestwebapp" />

    그러나 다른 태그 (유사한 작업이있는 것처럼 보입니다)가 있습니다.

    <annotation-driven />

    이 두 태그의 차이점은 무엇입니까? 또 다른 "이상한"것은 이전 예제 (주석 기반 태그를 사용하지 않음)가 Spring MVC Template 프로젝트를 사용하여 STS가 만든 프로젝트와 매우 유사하지만 구성에서 주석 기반 태그를 삭제하면 프로젝트가 실행되지 않고 다음과 같은 오류가 발생합니다. HTTP 상태 404 -...

Spring 3.2는 더 이상 프록 싱을 위해 cglib가 필요하지 않지만, 낮은 버전은 cglib을 사용합니다. springsource 블로그에서 인용

이러한 프록시를 생성하기 위해 Spring은 cglib라는 타사 라이브러리를 사용합니다. 불행히도이 프로젝트는 더 이상 활성화되지 않습니다. Spring 3.2에서는 Spring이 기본적으로 Javassist를 사용할 가능성이 큽니다.

이것들은 Spring이 구성에 대한 혼란이라는 것을 제안하기에 충분합니까?


1
"봄 사람들이 구성을 너무 많이 변경하고 있습니다" -예를 들어 주시겠습니까? 그러면 독자가 문제를 더 잘 이해하고 질문에 답변하는 데 도움이됩니다.
gnat

9
문제는 그다지 좋지 않지만 제목은 재밌습니다.
Florian Margaine

1
@gnat은 봄을 가르치는 과정에서 여러 가지 방법으로 표현 된 것과 같은 것을 발견했습니다. 스프링 문서에는 일을하는 한 가지 방법이 있고, 일부 자습서에는 다른 방법이 있습니다. 둘 다 맞습니다. 학습 곡선이 너무 높습니다. 내 유일한 질문은 .. 단일 한 일을하는 모든 가능한 방법을 보여주는 명확한 문서가 있습니까? 봄에 ?

1
의견에 언급 한대로 @tito는 "문서가 있습니까?"라는 리소스 요청처럼 들립니다. 프로그래머는 리소스 요청을 환영하지 않습니다 . 내가 이해하는 한, 대신 근본적인 문제 를 제시 할 것입니다 (내가 볼 수있는 한, 질문 텍스트에서 "사용하기 혼란스러워 함")-요청 된 특정 자원으로 해결하려는 문제
gnat

2
@tito 나는 당신의 문제가 오래된 튜토리얼과 새로운 문서를 혼합하고 있다고 생각합니다. 스프링은 "컨벤션에 대한 컨벤션"이되었으며, 이전에 표현할 필요가 없습니다. 그러나 이전 자습서 (특히 3.1 이전)는 이제 많은 일을 불필요하게합니다.
Matsemann

답변:


5

Spring은 "구성에 대한 컨벤션"이있는 프레임 워크를 제공하는 것을 목표로합니다. 그러나 실제로 Spring 애플리케이션에는 일정량의 구성이 필요합니다.

Spring 2.5.x 및 이전 버전에서 일반적인 관용구는 XML을 통해이 구성을 제공하는 것이 었습니다. Spring 3.0 이상에서 관용적 인 방법은 주석을 사용하는 것입니다 (Java EE6 / 7도 권장하는 것).

참고로 주석이 달린 JPA 엔터티를 보는 것이 재미있을 수 있습니다 (단독?). 단일 필드에 4 + 이상의 주석을 추가하는 것이 쉽습니다 ....


필요한 구성 수준은 프로젝트를 완료하기 위해 N 개의 프레임 워크를 다루어야하는 저와 같은 소규모 개발자의 이해를 넘어 섰습니다.

1
나는 10 개의 주석을 가진 메소드를 가지고 있는데, 각각은 다른 유용한 기능을 수행한다.
Donal Fellows

1
반면에 클래스에 단일 @Entity 어노테이션이있는 JPA 엔티티를 가질 수도 있습니다. 이것이 구성에 대한 관습이 아니라면 나는 무엇인지 모릅니다. 모든 것이 원하는대로 정확하게 작동해야한다고 생각한다면 많은 구성이 필요하다는 불만을 제기하지 마십시오. 가능하면 기뻐하십시오.
Michael Borgwardt

2
왜 4 개의 주석이 당신을 슬프게하는지 모르겠습니다. 동등한 XML 파일은 어떻게 생겼습니까?
NimChimpsky

아, XML은 훨씬 더 나빠질 것입니다 :-)
Martijn Verburg

0
<annotation-driven />

XML 스키마를 지정해야합니다.

트랜잭션 관리자를 정의 할 때 JPA 트랜잭션 처리 전략과 관련하여 발생했을 가능성이 높습니다 ( 9.5.6. Spring 문서에서 @Transactional 사용 참조 ).

주석 중심의 트랜잭션 처리를 정의 할 때 Spring AOP는 메소드의 호출 전에 메소드가 트랜잭션을 시작 (또는 기존 체크)하기 위해 메소드의 측면을 자동으로 생성 한 다음 메소드 피벗이 종료 된 후 커밋 (또는 예외의 경우 롤백)합니다.


0

주석 기반 IoC / Bean 생성은 싱글 톤 구현이 있지만 편리하게 교체해야 할 때 유용하다는 것을 알았습니다.

다른 종속 클래스 / 인스턴스로 Bean을 반복적으로 재사용해야하는 상황과는 대조적으로.

이 경우 config에서 bean을 선언하고 일반적으로 필요한 종속성에 대한 생성자 주입을 수행합니다. 그런 다음, 콩 (들)는 상기에 사용하는 클래스 I @Autowire다음과 @Qualifier("")- 공장이 작업을 가정하는 방법입니다.

싱글 톤은 1 개의 결과 만 반환하는 팩토리 메소드입니다. 이것이 적절하게 적용되지 않으면 혼합해야 할 때입니다.

구성 요소 스캔을 사용하는 것과 비교하여 이것은 실제로 위의 기준과 좋은 판단의 대상입니다. 나는 일반적으로 패키지 구성 요소 스캔에 대해 매우 명시 적입니다. 그렇게하면 테스트를 위해 다른 IoC 설정을 테스트하면서 외부 종속성 (db와 같은)을 모의 할 수있는 다른 응용 프로그램 컨텍스트를 만들 수 있습니다.

또한 @Component프로젝트에 라이브러리 코드 가 없습니다 . 빈을 언제 / 어떻게 사용해야하는지 알 수 없으며, 빈을 @Component스캔 할 때 실수로 가져와 재사용 성을 제한 할 수 있습니다. 이 경우 일반적으로 라이브러리에 응용 프로그램 컨텍스트가 정의되어있어 기본 프로젝트 CAN이 응용 프로그램 컨텍스트로 가져올 수있는 편리한 Bean 선언 기본값이 있습니다.

여기에는 종교가 없습니다. 그냥 경험을 전달


0

Spring은 옵션을 제공하며 원래는 xml 기반 배선 만있었습니다. 나중에 주석 기반 배선이 추가되었습니다.
이제 (그리고 많은 사람들이) 두 가지를 혼합하여 사용할 수 있습니다.
Spring에 포함되어 있거나 springsource 웹 사이트에서 다운로드 할 수있는 충분한 문서가 있습니다. 전문 교육이 있으며 (아직 수행하지 않으며 보증 할 수 없음) 꽤 좋은 책이 있습니다 (APress의 Pro Spring을 좋아합니다. 사용중인 Spring 버전에 적합한 릴리스를 선택하십시오).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.