Spring 주석은 다음 @Controller
과 동일 @Service
합니까?
비즈니스 논리 @Controller
를 URL
매핑하고 호출하는 데 사용할 수있는 방법 에 대해 알고 있습니다 .
동안 @Service
비즈니스 로직을 포함 주석을 서비스 클래스에 사용.
@Controller
대신 @Service
서비스 클래스에 주석을 달 수 있습니까 ?
답변:
아니요, 그들은 서로 상당히 다릅니다.
둘 다 @Component 주석 의 다른 전문화 (실제로는 동일한 인터페이스의 두 가지 다른 구현 임)이므로 둘 다 클래스 경로 스캔에서 발견 할 수 있습니다 (XML 구성에서 선언 한 경우).
@Service 주석은 서비스 계층에서 사용되며 서비스 작업을 수행하는 클래스에 주석을 추가합니다. 종종 사용하지 않지만 대부분의 경우이 주석을 사용하여 모범 사례를 나타냅니다. 예를 들어, DAO 클래스를 직접 호출하여 데이터베이스에 개체를 유지할 수 있지만 이것은 끔찍합니다. DAO를 호출하는 서비스 클래스를 호출하는 것은 꽤 좋습니다. 이것은 관심 패턴의 분리를 수행하는 좋은 것입니다.
@Controller 주석은 Spring MVC 프레임 워크 (웹 애플리케이션 구현에 사용되는 Spring Framework의 구성 요소)에서 사용되는 주석입니다. @Controller 주석은 특정 클래스가 컨트롤러의 역할을 수행함을 나타냅니다. @Controller 어노테이션은 어노테이션이있는 클래스의 스테레오 타입으로 작동하여 역할을 표시합니다. 디스패처는 매핑 된 메서드에 대해 이러한 주석이 달린 클래스를 스캔하고 @RequestMapping 주석을 감지합니다.
따라서 Spring MVC 아키텍처를 살펴보면 모든 HTTP 요청을 적절한 컨트롤러 클래스 (@Controller로 주석 처리)로 전달하는 프런트 컨트롤러를 나타내는 DispatcherServlet 클래스 (XML 구성에서 선언)가 있습니다. 이 클래스는 해당 메서드에 의해 비즈니스 논리를 수행하고 서비스를 호출 할 수 있습니다. 이러한 클래스 (또는 해당 메서드)는 일반적으로 컨트롤러 및 해당 메서드에 의해 처리되는 HTTP 요청을 지정하는 @RequestMapping 주석 으로 주석 처리됩니다.
예를 들면 :
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
private final AppointmentBook appointmentBook;
@Autowired
public AppointmentsController(AppointmentBook appointmentBook) {
this.appointmentBook = appointmentBook;
}
@RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
}
이 클래스는 컨트롤러입니다.
이 클래스는 "/ appointments" "folder"에 대한 모든 HTTP 요청을 처리하며 특히 get 메서드는 "/ appointments"폴더에 대한 모든 GET HTTP 요청을 처리하기 위해 호출되는 메서드입니다.
이제 더 명확 해 지길 바랍니다.
@Controller
, @Service
주석 의 정의를 살펴보면 특수한 유형의 @Component
주석 임을 알 수 있습니다 .
@Component
public @interface Service {
….
}
@Component
public @interface Controller {
…
}
그렇다면 차이점은 무엇입니까?
@제어 장치
@Controller
주석은 특정 클래스가 컨트롤러의 역할을 역할을 나타냅니다. @Controller
주석은 역할을 나타내는 주석 클래스에 대한 스테레오 타입 역할을합니다.
@Controller의 특별한 점은 무엇입니까?
당신처럼 다른과이 주석을 전환 할 수 없습니다 @Service
또는 @Repository
그들이 동일하게 표시에도 불구하고. 디스패처 @Controller
는 @RequestMapping
주석이 달린 클래스를 스캔하고 그 안의 주석을 감지 합니다. 만 사용할 수 있습니다 @RequestMapping
에 @Controller
주석 클래스.
@서비스
@Services
저장소 계층에 비즈니스 로직 및 호출 방법을 보유합니다.
@Service의 특별한 점은 무엇입니까?
그것이 비즈니스 로직을 보유하고 있음을 나타내는 데 사용된다는 사실 외에도이 주석이 제공하는 눈에 띄는 전문성은 없지만 누가 알겠습니까? 스프링은 미래에 추가 예외를 추가 할 수 있습니다.
연결된 답변 : Spring의 @Component, @Repository 및 @Service 주석의 차이점은 무엇입니까?
@Service 대 @Controller
@Service : 클래스는 "비즈니스 서비스 외관"(핵심 J2EE 패턴 의미에서) 또는 이와 유사한 것입니다.
@Controller : 주석이 달린 클래스가 "Controller"(예 : 웹 컨트롤러)임을 나타냅니다.
---------- 주요 스테레오 타입에 대한 유용한 정보 찾기 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html
@interface 구성 요소
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
public @interface Component
주석이 달린 클래스가 구성 요소임을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 스캔을 사용할 때 자동 감지 후보로 간주됩니다.
@ 인터페이스 컨트롤러
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
주석이 달린 클래스가 "컨트롤러"(예 : 웹 컨트롤러)임을 나타냅니다.
@ 인터페이스 서비스
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Service
어노테이션이있는 클래스가 원래 Domain-Driven Design (Evans, 2003)에서 "캡슐화 된 상태가없는 모델에서 독립적 인 인터페이스로 제공되는 작업"으로 정의 된 "서비스"임을 나타냅니다. 클래스가 "Business Service Facade"(핵심 J2EE 패턴 의미) 또는 이와 유사한 것임을 나타낼 수도 있습니다. 이 주석은 범용 고정 관념이며 개별 팀은 의미를 좁히고 적절하게 사용할 수 있습니다.
@interface 저장소
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Repository
주석이 달린 클래스가 원래 Domain-Driven Design (Evans, 2003)에서 "객체 컬렉션을 에뮬레이트하는 저장, 검색 및 검색 동작을 캡슐화하기위한 메커니즘"으로 정의 된 "저장소"임을 나타냅니다. "Data Access Object"와 같은 전통적인 J2EE 패턴을 구현하는 팀도이 스테레오 타입을 DAO 클래스에 적용 할 수 있지만 그렇게하기 전에 데이터 액세스 객체와 DDD 스타일 저장소 간의 차이점을 이해해야합니다. 이 주석은 범용 고정 관념이며 개별 팀은 의미를 좁히고 적절하게 사용할 수 있습니다.
이렇게 주석이 달린 클래스는 PersistenceExceptionTranslationPostProcessor와 함께 사용될 때 Spring DataAccessException 번역에 적합합니다. 어노테이션이있는 클래스는 도구, 측면 등의 목적을 위해 전체 애플리케이션 아키텍처에서 역할에 대해서도 명확합니다.
Spring 2.5부터이 어노테이션은 @Component의 특수화 역할도하여 구현 클래스가 클래스 경로 스캔을 통해 자동 감지되도록합니다.
나는 이미 여기 에서 비슷한 질문에 대답했습니다.
둘 다 다르지 않습니다.
@Service 주석은 다른 용도로 사용되며 @Controller는 다른 용도로 사용됩니다. 실제로 Spring 프레임 워크에서 클래스 경로 스캔을 사용하여 자동 빈 감지에 Spring @Component, @Service, @Repository 및 @Controller 주석이 사용되지만 모든 기능이 동일하다는 의미는 아닙니다. @Service : 주석이 달린 클래스가 비즈니스 계층의 서비스 구성 요소임을 나타냅니다.
@Controller : 주석이 달린 클래스는 컨트롤러 구성 요소이며 주로 프레젠테이션 레이어에서 사용됨을 나타냅니다.
봄의 행동
보시다시피이 클래스는 @Controller로 주석 처리됩니다. 그 자체로 @Controller는 많은 일을하지 않습니다. 주요 목적은이 클래스를 구성 요소 스캔을위한 구성 요소로 식별하는 것입니다. HomeController는 @Controller로 주석 처리 되었기 때문에 Spring의 컴포넌트 스캐닝은 자동으로이를 발견하고 Spring 애플리케이션 컨텍스트에서 Bean으로 HomeController의 인스턴스를 작성합니다.
실제로 @Component, @Service 및 @Repository를 포함한 몇 가지 다른 주석은 @Controller와 유사한 용도로 사용됩니다. 다른 어노테이션으로 HomeController에 효과적으로 어노테이션을 작성할 수 있었으며 여전히 동일하게 작동했을 것입니다. 그러나 @Controller의 선택은 응용 프로그램에서이 구성 요소의 역할을 더 설명합니다.
@service 를 @Controller 로 선언 할 수 있습니다 .
@Controller 를 @Service 로 선언 할 수 없습니다.
@서비스
규칙적입니다. 클래스를 컴포넌트로 선언하고 있습니다.
@제어 장치
Component보다 조금 더 특별합니다. 디스패처 를 검색합니다 @RequestMapping 여기. 따라서 @Controller로 주석이 달린 클래스는 API가 호출되는 URL을 선언하는 권한이 추가로 부여됩니다.