2012-12-11 4 views
1

어느 것이 좋습니까? 봄 MVC에서는 모든 Controller 클래스에 @Controller을 사용합니다. 그들은 마커 인터페이스를 사용할 수 있습니까? 어노테이션 접근 방식을 선택한 이유는 무엇입니까? component-scan과 비슷한 controller-scan과 비슷한 것을 가질 수 있으므로 패키지의 모든 클래스를 Controller 클래스로 가정 할 수 있습니다. 마찬가지로 service-scanrepository-scan을 xml로 정의 할 수 있습니다.Annotation vs Spring MVC의 마커 인터페이스

+2

맛/스타일의 문제 일지라도 좋은 질문입니다. 주석은 무거운 반성을 요구하면서'instanceof'를 사용하여 마커 인터페이스를 쉽게 발견 할 수 있습니다. –

답변

7

마커 인터페이스와 기술적으로 동일한 효과가있을 것이라고 생각합니다. 문제는 마커 인터페이스가 클래스로 제한되어 속성이나 메소드에 사용할 수 없다는 것입니다.

스프링은 메타 데이터를 속성 (예 : @Autowired) 또는 메소드 (예 : @RequestMapping 또는 @Transactional)에 추가하는 데 주석을 사용하고 있습니다. 클래스 (예 : @Controller 또는 @Service)에 메타 데이터를 추가 할 때 동일한 접근 방식을 사용하는 것이 일관성이 있습니다.

Spring은 제공된 주석을 사용하도록 강요하지 않습니다. @Controller@RequestMapping은 핸들러 매핑을 정의하는 기본 방법 일뿐입니다. 이론적으로 들어오는 요청을 메소드 호출에 매핑하는 고유 한 방식을 제안 할 수 있습니다.

3

둘 다 처음에는 같은 목적으로 사용됩니다. 마킹 및 발견.

주석은 더 직접적인 표시를하기위한 것입니다. 마커 인터페이스는 실제로 유형을 정의하지만, 해당 유형의 변수를 선언 할 때 수행 할 수있는 것은 없습니다. 주석은 유형을 만들지 않으며 주석을 처리하는 코드에 따라 달라 지므로 의미를 부여합니다.

궁극적으로 이것은 맛의 문제입니다.

주석에는 추가 메타 데이터를 저장할 수 있다는 장점이 있습니다. @Named ("foo")와 같습니다. 마커 인터페이스는 모든 항목에 마커 인터페이스가 있음을 보장하는 컬렉션을 만드는 이점이 있습니다. 예 : 일반 또는 변수 유형에 특정 주석이 있어야한다는 제약 조건이 없습니다.

인터페이스의 메소드 대 메소드에 대한 주석의 경우 인터페이스의 메소드가 구현을 필요로한다는 문제가 있습니다 (Java 8에서는 더 이상 엄격하게 요구되지 않음) 클래스를 신속하게 다루기가 어렵게 만드는 반면 주석은 일률적으로 적용 할 수 있으며, 그러나 컴파일러는 올바른 메소드 서명을 시행 할 수 없습니다. 일부 주석에는 void foo (Bar bar)와 같은 메서드 서명이 필요하지만이 사실은 문서 (있는 경우)에서 조회해야합니다.