@Component
, @Repository
및 @Service
주석은 Spring에서 상호 교환 적으로 사용될 수 있습니까 ?
즉, Service 클래스가 있고 주석을에서 @Service
로 변경해 @Component
도 여전히 같은 방식으로 작동합니까?
아니면 주석이 클래스의 동작과 기능에도 영향을 줍니까?
@Component
, @Repository
및 @Service
주석은 Spring에서 상호 교환 적으로 사용될 수 있습니까 ?
즉, Service 클래스가 있고 주석을에서 @Service
로 변경해 @Component
도 여전히 같은 방식으로 작동합니까?
아니면 주석이 클래스의 동작과 기능에도 영향을 줍니까?
답변:
에서 봄 문서 :
@Repository
주석 (또한 데이터 액세스 개체 또는 DAO로 알려진) 저장소의 역할이나 고정 관념을 충족하는 모든 클래스에 대한 마커입니다. 이 마커의 사용 사이에 기술 된 바와 같이, 예외의 자동 번역 인 예외 번역 .봄은 더 스테레오 타입 주석을 제공합니다
@Component
,@Service
하고@Controller
.@Component
Spring 관리 컴포넌트의 일반적인 스테레오 타입입니다.@Repository
,@Service
및@Controller
의 특수화이다@Component
(각각, 지속성 서비스, 및 프레젠테이션 층)의보다 구체적인 사용 사례. 따라서 귀하의 구성 요소 클래스에 주석을 달 수 있습니다@Component
그들을 주석에 의해, 그러나@Repository
,@Service
또는@Controller
대신에, 당신의 클래스가 더 적절 도구에 의해 처리 또는 측면과 연관 적합합니다.예를 들어 이러한 스테레오 타입 주석은 포인트 컷에 이상적인 대상이됩니다.
@Repository
,@Service
그리고@Controller
또한 Spring 프레임 워크의 향후 릴리스에 추가 의미를 수행 할 수 있습니다. 따라서 서비스 계층을 사용@Component
하거나@Service
서비스 계층 중@Service
하나를 선택하는 것이 더 나은 선택입니다. 마찬가지로 앞서 언급했듯이@Repository
지속성 계층에서 자동 예외 변환에 대한 마커로 이미 지원됩니다.
┌──────────────┬─────────────────────────────────────────────────────┐
│ Annotation │ Meaning │
├──────────────┼─────────────────────────────────────────────────────┤
│ @Component │ generic stereotype for any Spring-managed component │
│ @Repository │ stereotype for persistence layer │
│ @Service │ stereotype for service layer │
│ @Controller │ stereotype for presentation layer (spring-mvc) │
└──────────────┴─────────────────────────────────────────────────────┘
@Service
입니다 또한 @Component
(때문에 @Service
자체로 주석이 주석 @Component
). 내가 아는 한 Spring 프레임 워크의 어떤 것도 무언가가라는 사실을 명시 적으로 사용하지 @Service
않으므로 그 차이는 실제로 개념적 일뿐입니다.
많은 답변이 이미 이러한 주석이 사용되는 것을 나타내므로 여기서는 약간의 차이점에 중점을 둘 것입니다.
먼저 유사점
다시 강조해야 할 첫 번째 사항 은 BeanDefinition의 스캔 자동 감지 및 종속성 주입과 관련하여 이러한 모든 주석 (즉, @Component, @Service, @Repository, @Controller)이 동일하다는 것입니다. 우리는 다른 것을 대신해서 사용할 수 있으며 여전히 길을 갈 수 있습니다.
@구성 요소
클래스가 스프링 컴포넌트임을 나타내는 범용 스테레오 타입 어노테이션입니다.
@Component에 대해 특별한 무엇입니까
<context:component-scan>
만을 검사@Component
및 위해 보이지 않는@Controller
,@Service
그리고@Repository
일반적으로. 로 주석이 붙어 있기 때문에 스캔됩니다@Component
.
그냥 봐 가지고 @Controller
, @Service
및 @Repository
주석의 정의 :
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
따라서, 그 말을 잘못 아니다 @Controller
, @Service
및 @Repository
특수 유형의 @Component
주석. <context:component-scan>
로 주석을 달듯이 마치 다음 클래스를 Bean으로 등록합니다 @Component
.
특수 유형 주석도 주석으로 @Component
주석 이 붙어 있기 때문에 스캔됩니다. 이는 또한 주석이기도 @Component
합니다. 자체 맞춤 주석을 정의하고로 주석을 달면 다음과 같이 @Component
스캔됩니다.<context:component-scan>
@저장소
이것은 클래스가 데이터 저장소를 정의 함을 나타냅니다.
@Repository의 특별한 점은 무엇입니까?
이는 것을, 지적뿐만 아니라 구성 기반 주석이 , @Repository
의 작업은 플랫폼 특정 예외를 잡으려고하고 봄의 통일 체크되지 않는 예외의 하나로서 그들을 재 - 던져. 이를 위해 다음 PersistenceExceptionTranslationPostProcessor
과 같이 Spring의 애플리케이션 컨텍스트에 추가해야합니다.
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
이 bean post processor는 주석이 달린 모든 bean에 권고자를 추가하여 @Repository
플랫폼 별 예외를 포착 한 다음 Spring의 점검되지 않은 데이터 액세스 예외 중 하나로 다시 생각합니다.
@제어 장치
@Controller
주석은 특정 클래스가 컨트롤러의 역할을 역할을 나타냅니다. @Controller
주석은 역할을 나타내는 주석 클래스에 대한 스테레오 타입 역할을합니다.
@Controller의 특별한 점은 무엇입니까?
우리는 같은 다른와이 주석을 전환 할 수 없습니다 @Service
또는 @Repository
그들이 동일하게 표시에도 불구하고. 디스패처는 어노테이션이있는 클래스를 스캔하고 어노테이션이있는 @Controller
메소드를 감지 @RequestMapping
합니다. @RequestMapping
클래스에 주석이 달린 메소드에서만 on / in을 사용할 수 있으며 , 등에서 @Controller
는 작동 하지 않습니다 .@Component
@Service
@Repository
참고 : 클래스가 이미 통해처럼, 어떤 다른 방법을 통해 빈으로 등록되어있는 경우 @Bean
또는를 통해 @Component
, @Service
등 ... 주석, 다음 @RequestMapping
클래스도 주석 경우 뽑힐 수 @RequestMapping
주석. 그러나 그것은 다른 시나리오입니다.
@서비스
@Service
Bean은 저장소 계층에서 비즈니스 로직 및 호출 메소드를 보유합니다.
@Service의 특별한 점은 무엇입니까?
비즈니스 로직을 보유하고 있음을 나타내는 데 사용된다는 사실 외에도이 주석에는 눈에 띄는 것이 없습니다. 그러나 누가 알더라도 Spring은 앞으로 몇 가지 예외를 추가 할 수 있습니다.
또 뭐요?
위에서와 마찬가지로, 미래에 봄은 특별한 기능을 추가 할 수 있습니다 @Service
, @Controller
그리고 @Repository
자신의 레이어링 규칙에 따라. 따라서 컨벤션을 존중하고 레이어에 맞춰 사용하는 것이 좋습니다.
@Controller
주석 에 대한 약간의 잘못된 정보가 있습니다. 클래스에 주석을 달고 @RequestMapping
어떤 방식 으로든이 클래스의 Bean을 작성 하는 경우 필요하지 않습니다 . @Controller
OR로 주석이 달린 빈 @RequestMapping
은 Spring MVC의 요청 매핑에 참여할 것이다. 예를 들어 컨트롤러를 프로그래밍 방식으로 (예 : @Bean
메소드를 사용하여 ) 작성 하는 동시에 패키지 스캔으로 패키지를 작성하지 못하도록하는 데 유용합니다 ( 패키지를 스캔에서 제외 할 수없는 경우).
그들은 거의 동일합니다-모두 클래스가 스프링 콩임을 의미합니다. @Service
, @Repository
및@Controller
있는 전문 @Component
들. 그들과 함께 특정 작업을 수행하도록 선택할 수 있습니다. 예를 들면 다음과 같습니다.
@Controller
콩은 spring-mvc에서 사용됩니다.@Repository
빈은 지속성 예외 번역에 적합합니다.또 다른 것은 구성 요소를 의미 적으로 다른 계층으로 지정한다는 것입니다.
제공하는 한 가지는 @Component
다른 주석에 주석을 달고 다음과 같은 방식으로 사용할 수 있다는 것입니다.@Service
입니다.
예를 들어 최근에 만들었습니다.
@Component
@Scope("prototype")
public @interface ScheduledJob {..}
따라서 주석이 달린 모든 클래스 @ScheduledJob
는 스프링 콩이며 그 외에도 석영 작업으로 등록됩니다. 특정 주석을 처리하는 코드 만 제공하면됩니다.
@Component는
<bean>
@Service, @Controller, @Repository = {@ 컴포넌트 + 더 특별한 기능}
이는 서비스, 컨트롤러 및 리포지토리가 기능적으로 동일하다는 것을 의미합니다.
세 개의 주석은 애플리케이션에서 "레이어" 를 분리하는 데 사용됩니다 .
이제 왜 그것들을 분리 해야하는지 물을 수 있습니다. (AOP-Aspect Oriented Programming을 알고 있다고 가정합니다)
DAO 계층의 활동 만 모니터링한다고 가정 해 봅시다. DAO의 모든 메소드가 호출되기 전후에 로깅을 수행하는 Aspect (클래스) 클래스를 작성합니다. AOP를 사용하면 3 개의 개별 레이어가 있고 혼합되지 않으므로 AOP를 사용하여 수행 할 수 있습니다.
따라서 DAO 메소드 "around", "before"또는 "after"를 DAO 로깅 할 수 있습니다. 당신은 처음에 DAO를 가지고 있기 때문에 그렇게 할 수 있습니다. 방금 달성 한 것은 우려 또는 작업의 분리입니다.
@Controller 주석이 하나만 있다고 가정하면이 구성 요소에는 디스패치, 비즈니스 로직 및 액세스 데이터베이스가 모두 혼합되어 더러워진 코드가 있습니다!
위에서 언급 한 매우 일반적인 시나리오는 세 가지 주석을 사용해야하는 경우가 더 많다는 것입니다.
@Respository
자동 예외 번역 기능도 있습니다. 예외가 예외에서 발생할 때와 같이 @Repository
일반적으로 해당 예외에 대한 핸들러가 있으며 DAO 클래스에 try catch 블록을 추가 할 필요가 없습니다. 이것은 PersistenceExceptionTranslationPostProcessor와 함께 사용됩니다
봄 @Component
, @Service
, @Controller
, 및@Repository
스테레오 타입 주석에 사용되는 :
@Controller:
귀하의 경우 요청 프리젠 테이션 페이지에서 매핑 할 즉, 프리젠 테이션 층은 다른 파일로 이동하지 않습니다이 직접 진행 @Controller
에 요청 경로를 클래스와 검사 @RequestMapping
필요한 경우 메서드 호출 이전에 작성된 주석.
@Service
: 모든 비즈니스 로직은 여기에 있습니다. 즉 데이터 관련 계산 및 모두. 사용자가 지속성 메소드를 직접 호출하지 않으므로이 주석을 사용하여이 메소드를 호출하는 비즈니스 계층의 주석입니다. 사용자 요청에 따라 @Repository를 요청합니다.
@Repository
: 데이터베이스에서 데이터를 가져 오는 데 사용되는 응용 프로그램의 지속성 계층 (데이터 액세스 계층)입니다. 즉, 모든 데이터베이스 관련 작업은 리포지토리에서 수행됩니다.
@Component
-컴포넌트 스테레오 타입으로 다른 컴포넌트 (예 : REST 자원 클래스)에 주석을 답니다.
주석이 달린 클래스가 " 컴포넌트 " 임을 나타냅니다 . 이러한 클래스는 주석 기반 구성 및 클래스 경로 검색을 사용할 때 자동 감지의 후보로 간주됩니다.
다른 클래스 수준 주석은 구성 요소, 일반적으로 특별한 종류의 구성 요소를 식별하는 것으로 간주 될 수 있습니다 (예 : @Repository 주석 또는 AspectJ의 @Aspect 주석).
Spring 2.5에는 @Component, @Service 및 @Controller와 같은 추가 스테레오 타입 주석이 도입되었습니다. @Component는 모든 Spring 관리 구성 요소에 대한 일반적인 고정 관념으로 사용됩니다. 반면 @Repository, @Service 및 @Controller는보다 구체적인 사용 사례 (예 : 지속성, 서비스 및 프레젠테이션 계층 각각)에 대한 @Component 전문화 역할을합니다. 이는 컴포넌트 클래스에 @Component로 주석을 달 수 있지만, 대신 @Repository, @Service 또는 @Controller로 주석을 달면 클래스를 도구로 처리하거나 측면과 연관시키는 데 더 적합합니다. 예를 들어 이러한 스테레오 타입 주석은 포인트 컷에 이상적인 대상이됩니다. 물론 @Repository, @Service 및 @Controller는 향후 스프링 프레임 워크 릴리스에서 추가 의미를 가질 수 있습니다. 그러므로, 서비스 계층에 @Component 또는 @Service를 사용하기로 결정한 경우 @Service가 더 나은 선택입니다. 마찬가지로 위에서 언급했듯이 @Repository는 이미 퍼시스턴스 레이어에서 자동 예외 변환을위한 마커로 지원됩니다.
@Component – Indicates a auto scan component. @Repository – Indicates DAO component in the persistence layer. @Service – Indicates a Service component in the business layer. @Controller – Indicates a controller component in the presentation layer.
참조 : -Spring Documentation-Java를 사용한 클래스 경로 스캔, 관리되는 구성 요소 및 쓰기 구성
기술적으로 @Controller
, @Service
, @Repository
모두 동일합니다. 그들 모두 확장됩니다 @Component
.
스프링 소스 코드에서 :
주석이 달린 클래스가 "컴포넌트"임을 나타냅니다. 이러한 클래스는 주석 기반 구성 및 클래스 경로 검색을 사용할 때 자동 감지의 후보로 간주됩니다.
우리는 직접 사용할 수있는 @Component
많은 응용 프로그램의 이해 및 유지 관리에 대한하지만, 각각의 모든 콩을 위해, 우리가 사용하는 @Controller
, @Service
,@Repository
.
각 주석의 목적 :
@Controller
-> 주석이 달린 클래스는 클라이언트 측에서 요청을 받도록 고안되었습니다. 첫 번째 요청은 Dispatcher Servlet으로옵니다. 여기서 요청은 다음 값을 사용하여 특정 컨트롤러에 요청을 전달합니다.@RequestMapping
주석 .@Service
-> 주석이 달린 클래스는 클라이언트에서 받거나 데이터베이스에서 가져 오는 데이터를 조작하기위한 것입니다. 데이터에 대한 모든 조작은이 계층에서 수행해야합니다.@Repository
-> 주석이 달린 클래스는 데이터베이스에 연결하기위한 것입니다. DAO (Data Access Object) 레이어로 간주 될 수도 있습니다. 이 계층은 CRUD (만들기, 검색, 업데이트, 삭제) 작업으로 만 제한되어야합니다. 조작이 필요한 경우 데이터를 @Service 계층으로 다시 보내야합니다.우리는 (사용 자신의 위치를 교환하는 경우 @Repository
대신에 @Controller
), 우리의 응용 프로그램이 잘 작동합니다.
서로 다른 세 가지를 사용하는 주요 목적은 @annotations
엔터프라이즈 응용 프로그램에 더 나은 모듈성을 제공하는 것입니다.
controller and repository
데이터베이스 연결 관점에서 사용 @Service
및 @Repository
주석은 중요합니다.
@Service
DB 연결의 모든 웹 서비스 유형@Repository
모든 저장된 프로 시저의 DB 연결을위한적절한 주석을 사용하지 않으면 롤백 트랜잭션으로 인해 커밋 예외가 발생할 수 있습니다. JDBC 트랜잭션 롤백과 관련된 스트레스로드 테스트 중 예외가 표시됩니다.
@Repository
지속성 레이어와 작동하도록 특별히 설계되었습니다. 나머지 API를 사용하는 경우 DAO가 아닌 DTO를 사용하는 것입니다.
@Repository @Service 및 @Controller 는 @Service를 @Component로 대체 할 수 있지만이 경우 전문화를 잃을 수있는보다 구체적인 사용을 위해 @Component의 전문화 역할을합니다.
1. **@Repository** - Automatic exception translation in your persistence layer.
2. **@Service** - It indicates that the annotated class is providing a business service to other layers within the application.
이 모든 주석은 스테레오 유형의 주석 유형이며,이 세 주석의 차이점은
- @Component를 추가하면 클래스의 역할이 컴포넌트 클래스임을 알려줍니다.이 클래스는 논리를 구성하는 클래스임을 의미하지만 클래스가 특정 비즈니스 또는 지속성 또는 컨트롤러 논리를 포함하는지 여부를 알려주지 않으므로 사용하지 않습니다. 이 @Component 주석을 직접
- @Service 주석을 추가하면 비즈니스 로직을 구성하는 클래스의 역할을 알려줍니다.
- 클래스 위에 @Repository를 추가하면 지속성 논리로 구성된 클래스를 알려줍니다
- 여기서 @Component는 @ Service, @ Repository 및 @Controller 주석에 대한 기본 주석입니다.
예를 들어
package com.spring.anno;
@Service
public class TestBean
{
public void m1()
{
//business code
}
}
package com.spring.anno;
@Repository
public class TestBean
{
public void update()
{
//persistence code
}
}
@Service
or @Repositroy
또는 @Controller
주석을 추가 할 때마다 @Component
클래스 상단에 존재합니다.봄, 그들이 자동차 부품 검사 주석의 네 가지 유형을 제공 @Component
, @Service
, @Repository
및@Controller
. 기술적으로는 차이점이 없지만 모든 자동 구성 요소 스캔 주석은 특수 목적과 정의 된 레이어 내에서 사용해야합니다.
@Component
: 기본 자동 구성 요소 스캔 주석이며 주석이 달린 클래스가 자동 스캔 구성 요소임을 나타냅니다.
@Controller
: 주석이 달린 클래스는 컨트롤러 컴포넌트이며 주로 프리젠 테이션 레이어에서 사용됨을 나타냅니다.
@Service
: 주석이 달린 클래스가 비즈니스 계층의 서비스 구성 요소임을 나타냅니다.
@Repository
: 지속성 계층 내에서이 주석을 사용해야하며 데이터베이스 저장소처럼 작동합니다.
@Component
이 주석에는 앞으로 특정 동작이 포함될 수 있으므로 클래스에 주석을 달면서 보다 특수한 형식을 선택해야합니다 .
우리는 자바 표준에 따라 이것에 대답 할 수 있습니다
을 참조하면 JSR-330
이제 스프링에 의해 지원되는, 만 사용할 수 있습니다 @Named
빈을 (어떻게 든 정의 @Named=@Component
). 따라서이 표준에 따르면 카테고리 Bean에 스테레오 타입 (예 @Repository
: @Service
,, @Controller
)을 정의 할 필요가없는 것 같습니다 .
그러나 스프링 사용자는 이러한 특수 주석을 특정 용도에 따라 다르게 사용하십시오.
aspect-oriented
경우 이것에 대한 좋은 후보가 될 수 있습니다. pointcuts
)@Repository
주석은 Bean에 일부 기능을 추가합니다 (일부 Bean Persistence 계층으로 자동 예외 변환).@RequestMapping
하는 경우로 주석이 달린 클래스에만 추가 할 수 있습니다 @Controller
.사이에는 차이가 없습니다 @Component
, @Service
, @Controller
, @Repository
.
@Component
MVC의 구성 요소를 나타내는 일반 주석입니다. 그러나 서비스 계층 구성 요소, 지속성 계층 구성 요소 및 프레젠테이션 계층 구성 요소와 같은 MVC 응용 프로그램의 일부로 여러 구성 요소가 있습니다. 따라서 봄 사람들은 다른 세 가지 주석도 제공했습니다.
@Repository
@Service
@Controller
@Component
은 그들 모두를 위해 사용할 수 있습니다.Spring 4의 최신 버전 :
@Repository 어노테이션은 리포지토리의 역할 또는 스테레오 타입 (데이터 액세스 오브젝트 또는 DAO라고도 함)을 충족하는 모든 클래스의 마커입니다. 이 마커의 사용 중에는 20.2.2 절“예외 변환”에 설명 된 예외의 자동 번역이 있습니다.
Spring은 추가 스테레오 타입 어노테이션을 제공합니다 : @Component, @Service 및 @Controller. @Component는 Spring 관리 컴포넌트의 일반적인 스테레오 타입입니다. @Repository, @Service 및 @Controller는 각각 지속성, 서비스 및 프레젠테이션 계층과 같은보다 구체적인 사용 사례에 대한 @Component의 전문화 영역입니다. 따라서 @Component로 컴포넌트 클래스에 주석을 달 수 있지만 대신 @Repository, @Service 또는 @Controller로 주석을 달면 클래스가 도구로 처리하거나 측면과 연관시키는 데 더 적합합니다. 예를 들어 이러한 스테레오 타입 주석은 포인트 컷에 이상적인 대상이됩니다. @Repository, @Service 및 @Controller는 향후 스프링 프레임 워크 릴리스에서 추가 의미를 가질 수 있습니다. 그러므로, 서비스 계층에 @Component 또는 @Service를 사용하도록 선택하는 경우 @Service가 더 나은 선택입니다. 마찬가지로 위에서 언급했듯이 @Repository는 이미 퍼시스턴스 레이어에서 자동 예외 변환을위한 마커로 지원됩니다.
@Component : 클래스에 주석을 달면 @Component
최대 절전 모드에서 Bean임을 알립니다.
@Repository : 클래스에 주석을 달면 @Repository
DAO 클래스 인 최대 절전 모드에이를 DAO 클래스로 취급합니다. 확인되지 않은 예외 (DAO 메소드에서 발생)를 Spring으로 변환 할 수있게 함을 의미합니다 DataAccessException
.
@Service : 이것은 최대 절전 모드에 @Transactional
서비스 계층 주석 이있는 서비스 클래스임을 알려주 므로 최대 절전 모드는이를 서비스 구성 요소로 취급합니다.
플러스 @Service
는입니다 @Component
. Bean 클래스 이름을로 가정 CustomerService
하십시오. XML Bean 구성 방법을 선택하지 않았으므로 Bean으로 주석을 달아 Bean에 주석을 달았습니다 @Component
. Bean 객체를 가져 오는 동안 CustomerService cust = (CustomerService)context.getBean("customerService");
기본적으로 Spring은 컴포넌트의 첫 문자 인 'CustomerService'에서 'customerService'를 소문자로 사용합니다. 이름이 'customerService'인이 구성 요소를 검색 할 수 있습니다. 그러나 @Service
Bean 클래스에 주석을 사용하면 다음과 같이 특정 Bean 이름을 제공 할 수 있습니다.
@Service("AAA")
public class CustomerService{
그리고 당신은 콩 객체를 얻을 수 있습니다
CustomerService cust = (CustomerService)context.getBean("AAA");
A는 @Service
봄 문서를 인용하기
주석이 달린 클래스는 " 도메인 기반 디자인 (Evans, 2003)에 의해 원래 정의 된 상태로 모델에 독립된 인터페이스로 제공되는 작업"으로 정의 된 "서비스"임을 나타냅니다 . 클래스가 "비즈니스 서비스 외관"(핵심 J2EE 패턴 의미) 또는 이와 유사한 것임을 나타낼 수도 있습니다. 이 주석은 범용 고정 관념이며 개별 팀은 의미를 좁히고 적절하게 사용할 수 있습니다.
에릭 에반스의 도메인 주도 디자인을 보면,
SERVICE는 ENTITIES 및 VALUE OBJECTS와 같이 캡슐화 상태없이 모델에서 독립적 인 인터페이스로 제공되는 작업입니다. 서비스는 기술 프레임 워크에서 일반적인 패턴이지만 도메인 계층에도 적용될 수 있습니다. 이름 서비스는 다른 개체와의 관계를 강조합니다. ENTITIES 및 VALUE OBJECTS와는 달리 클라이언트에 대해 수행 할 수있는 기능 측면에서 순수하게 정의됩니다. SERVICE는 엔티티가 아닌 활동, 즉 명사가 아닌 동사로 명명되는 경향이 있습니다. 서비스는 여전히 추상적이고 의도적 인 정의를 가질 수 있습니다. 그것은 단지 객체의 정의와 다른 풍미를 가지고 있습니다. 서비스는 여전히 정의 된 책임이 있어야하며, 그 책임과이를 수행하는 인터페이스는 도메인 모델의 일부로 정의되어야합니다. 조작 이름은 유비쿼터스 언어에서 가져 오거나 도입해야합니다. 매개 변수 및 결과는 도메인 개체 여야합니다. 서비스는 신중하게 사용해야하며 모든 행동의 개체 및 가치있는 물건을 제거해서는 안됩니다. 그러나 작업이 실제로 중요한 도메인 개념 인 경우 SERVICE는 MODEL-DRIVEN DESIGN의 자연스러운 부분을 형성합니다. 실제로 어떤 것도 나타내지 않는 가짜 객체가 아닌 서비스로 모델에서 선언 된 독립형 작업은 다른 사람을 오도하지 않습니다. 서비스는 모델 중심 디자인의 자연스러운 부분을 형성합니다. 실제로 어떤 것도 나타내지 않는 가짜 객체가 아닌 서비스로 모델에서 선언 된 독립형 작업은 다른 사람을 오도하지 않습니다. 서비스는 모델 중심 디자인의 자연스러운 부분을 형성합니다. 실제로 어떤 것도 나타내지 않는 가짜 객체가 아닌 서비스로 모델에서 선언 된 독립형 작업은 다른 사람을 오도하지 않습니다.
그리고 Repository
에릭 에반스에 따라,
REPOSITORY는 특정 유형의 모든 객체를 개념 집합 (일반적으로 에뮬레이션)으로 나타냅니다. 보다 정교한 쿼리 기능을 제외하고는 컬렉션처럼 작동합니다. 적절한 유형의 오브젝트가 추가 및 제거되고 REPOSITORY 뒤에있는 기계가 오브젝트를 삽입하거나 데이터베이스에서 삭제합니다. 이 정의는 초기 수명주기에서 끝까지 AGGREGATES의 근본에 대한 액세스를 제공하는 일관된 책임 세트를 수집합니다.
구성 요소 저장소 서비스 주석 사이의 차이점을 설명하기에 충분한 대답이 있습니다. 나는 차이점을 공유하고 싶습니다@Controller & @RestController
@Controller
vs RestController
@RestController
:@Controller
추가
@Controller
되고@ResponseBody
으로 자동으로 주석 됩니다. 따라서 @ResponseBody
매핑 방법 을 추가 할 필요가 없습니다 . 이는 @ResponseBody
기본적으로 활성화되어 있음을 의미
합니다.@RestController
하면 뷰를 반환 할 수 없습니다 (
Viewresolver
Spring / Spring-Boot에서 사용)@RestController
또한에 대한 응답으로 변환 JSON/XML automatically
으로 @ResponseBody
몸에있을 수있는 일에 반환 된 객체를 만든다을,e.g. JSON or XML
@Controller
@Controller
클래스를 Spring MVC Controller로 표시하는 데 사용됩니다. 이 주석은@Component
클래스 경로 스캔을 기반으로 컨트롤러 클래스를 자동 감지 할 수 있습니다.@Controller
Spring web MVC에서 뷰를 반환 할 수 있습니다.리포지토리 및 서비스 는 구성 요소 주석의 하위입니다 . 그래서 그것들은 모두 Component 입니다. 리포지토리 및 서비스 가 확장되었습니다. 정확히 어떻게? 서비스 는 이념적 차이 만 있습니다 : 우리는 서비스를 위해 서비스를 사용합니다. 리포지토리 에는 특정 예외 처리기가 있습니다.
고정 관념 설명 :
@Service
-모든 서비스 클래스에 @Service로 주석을 답니다. 이 계층은 작업 단위를 알고 있습니다. 모든 비즈니스 로직은 서비스 클래스에 있습니다. 일반적으로 서비스 계층의 방법은 트랜잭션에 포함됩니다. 한 트랜잭션이 실패하면 모든 트랜잭션이 롤백되어야합니다. 서비스 메소드에서 여러 DAO 호출을 수행 할 수 있습니다.@Repository
-@Repository로 모든 DAO 클래스에 주석을 답니다. 모든 데이터베이스 액세스 로직은 DAO 클래스에 있어야합니다.@Component
-컴포넌트 스테레오 타입으로 다른 컴포넌트 (예 : REST 자원 클래스)에 주석을 답니다.@Autowired
-@Autowired 주석을 사용하여 Spring이 다른 bean을 클래스에 자동으로 연결하도록하십시오. @Component
Spring 관리 컴포넌트의 일반적인 스테레오 타입입니다. @Repository
, @Service
및 @Controller
의 전문 분야입니다@Component
구체적인 사용 예에 대한, 예를 들어, 각각 지속성 서비스, 및 프리젠 테이션 층이다.
@Component, @Repository, @Controller 및 @Service 주석의 차이점
@Component – 일반이며 응용 프로그램에서 사용할 수 있습니다.
@Service – 서비스 계층 수준에서 클래스에 주석을 답니다.
@Controller – Spring MVC에서 주로 사용되는 프리젠 테이션 레이어 레벨의 클래스에 주석을 달 수 있습니다.
@Repository – 지속성 계층에서 클래스에 주석을 달면 데이터베이스 저장소로 작동합니다.
@Controller
= @Component (내부 주석) + 프리젠 테이션 계층 기능
@Service
= @Component (내부 주석) + 서비스 계층 기능
@Component
= 실제 컴포넌트 (Beans)
@Repository
= @Component (내부 주석) + 데이터 계층 기능 (도메인 Bean 처리에 사용)
스프링 프레임 워크에서 스테레오 타입 주석이라고하는 특수한 유형의 주석을 제공합니다. 이들은 다음과 같습니다 :-
@RestController- Declare at controller level.
@Controller – Declare at controller level.
@Component – Declare at Bean/entity level.
@Repository – Declare at DAO level.
@Service – Declare at BO level.
위에서 선언 한 주석은 <context:component-scan>
xxx-servlet.xml 파일에 추가 할 때 컨텍스트 생성 /로드 단계에서 주석으로 주석이 달린 클래스의 객체를 자동으로 생성 하기 때문에 특별 합니다.
@Component
, @ Repository
, @ Service
, @Controller
:
@Component
에 의해 관리되는 구성 요소에 대한 일반적인 관념은 봄 @Repository
, @Service
하고 @Controller
있는 @Component
보다 구체적인 사용하는을위한 전문 :
@Repository
지속성을 위해@Service
서비스 및 거래@Controller
MVC 컨트롤러 용왜 사용 @Repository
, @Service
, @Controller
이상@Component
? 컴포넌트 클래스를 @Component로 표시 할 수 있지만, 대신 예상되는 기능에 맞는 대안을 사용합니다. 우리 수업은 각각의 특정한 경우에 예상되는 기능에 더 적합합니다.
주석이 달린 클래스 @Repository
는 org.springframework.dao.DataAccessException으로 더 나은 번역 및 읽기 쉬운 오류 처리 기능을 갖습니다. 데이터에 액세스하는 컴포넌트 (DataAccessObject 또는 DAO)를 구현하는 데 이상적입니다.
@Controller
Spring Web MVC 애플리케이션에서 컨트롤러 역할을 하는 주석이 달린 클래스
@Service
비즈니스 로직 서비스에서 주석이 달린 클래스 , 예를 들어 DAO 관리자의 Facade 패턴 (Facade) 및 트랜잭션 처리
여기에 제시된 답변은 대부분 기술적으로 정확하지만 응답 목록이 길고 맨 아래에 있지만 실제로 누군가가 그것을 넘어서서 가치있는 것을 배우는 경우를 대비하여 실제로 올바른 응답을 넣을 가치가 있다고 생각했습니다. 그것. 나머지 답변이 잘못되었다는 것이 아니라 단지 그들이 옳지 않다는 것입니다. 그리고 트롤 무리를 막기 위해, 기술적으로 이러한 주석은 사실상 똑같으며 봄 5까지도 가장 상호 교환이 가능하다는 것을 알고 있습니다.
이 세 가지 주석은 완전히 다른 것으로 상호 교환 할 수 없습니다. 하나가 아닌 세 개가 있기 때문에 알 수 있습니다. 그것들은 상호 교환 가능하도록 의도 된 것이 아니며, 우아하고 편리하지 않은 방식으로 구현되었습니다.
현대 프로그래밍은 다양한 비율로 발명, 예술, 기술 및 커뮤니케이션입니다. 통신 비트는 일반적으로 코드가 작성된 것보다 훨씬 자주 읽히기 때문에 매우 중요합니다. 프로그래머는 기술적 인 문제를 해결하려고 할뿐만 아니라 코드를 읽는 미래의 프로그래머에게 의사를 전달하려고합니다. 이 프로그래머들은 모국어 나 사회 환경을 공유하지 않을 수도 있으며, 향후 50 년 동안 코드를 읽을 수도 있습니다 (생각할 것 같지는 않습니다). 미래까지 효과적으로 의사 소통하기는 어렵습니다. 그러므로 우리가 사용할 수있는 가장 명확하고 효율적이며 정확하고 의사 소통적인 언어를 사용하는 것이 중요합니다.
예를 들어, @Repository
우리가 아닌 저장소를 작성할 때 사용되는 것이 중요합니다 @Component
. 후자는 저장소를보고 있음을 나타내지 않기 때문에 저장소에 대한 주석의 선택이 매우 좋지 않습니다. 리포지토리도 스프링 빈이라고 가정 할 수 있지만 구성 요소가 리포지토리 인 것은 아닙니다. 와@Repository
우리가 우리의 언어로 명확하고 구체적인되고있다. 우리는 이것이 저장소라는 것을 분명히 밝히고 있습니다. 와@Component
우리는 읽고있는 구성 요소 유형을 결정하기 위해 독자에게 맡기고 있으며, 의미를 유추하기 위해 전체 클래스 (및 서브 클래스 및 인터페이스 트리)를 읽어야합니다. 이 클래스는 먼 미래에 리포지토리가 아닌 것으로 독자에 의해 잘못 해석 될 수 있으며, 이것이 리포지토리라는 것을 완전히 알고있는 우리가 언어에 구체적으로 설명하지 못했기 때문에이 실수에 대해 부분적으로 책임을 졌을 것입니다 우리의 의도를 효과적으로 전달하십시오.
다른 예제는 다루지 않겠지 만 최대한 명확하게 설명하겠습니다. 이러한 주석은 완전히 다른 것이므로 의도에 따라 적절하게 사용해야합니다. @Repository
스토리지 저장 소용이며 다른 주석이 올바르지 않습니다. @Service
서비스 용이며 다른 주석이 맞지 않습니다. @Component
repostories 나 service가 아닌 구성 요소를위한 것이며 이들 중 하나를 대신 사용하는 것도 올바르지 않습니다. 컴파일 될 수도 있고 테스트를 실행하고 통과 할 수도 있지만 잘못된 것이므로이 작업을 수행하는 경우 (전문적으로) 덜 생각할 것입니다.
봄 내내 (및 일반적으로 프로그래밍)에 대한 예가 있습니다. @Controller
REST API를 작성할 때 사용할 수 없으므로 사용해서는 안됩니다 @RestController
. @RequestMapping
when @GetMapping
is a valid alternative를 사용해서는 안됩니다 . 기타 등 기타 독자에게 의도를 전달할 수있는 가장 정확하고 정확한 언어를 선택 해야합니다 . 그렇지 않으면 시스템에 위험을 초래할 수 있으며 위험에는 비용이 발생합니다.
이 그림을 단순화하기 위해, 우리가 사용 사례에 의해 전문적를 생각해 보자,이 주석을 주입하는 데 사용됩니다 및 말했듯이 문자 그대로 " 주입하는 데 사용됩니다 사용하는 방법을 알고있는 경우에, 그 말은," 의존성 삽입 (Dependency Injection) "DI" 당신을 그런 다음 항상 이러한 주석을 찾아야하며 이러한 스테레오 유형으로 클래스에 주석을 달아 DI 컨테이너에 스캔하여 다른 장소에 주입 할 준비가되었는지를 알려주십시오 . 이것이 실제 목표입니다.
이제 각각으로 이동하자; 첫 번째 @Service , 특정 비즈니스 사례에 대한 논리를 작성하는 경우 비즈니스 논리가 포함될 장소에서 분리 해야하는 경우이 서비스는 일반 클래스이거나 원하는 경우 인터페이스로 사용할 수 있으며 다음과 같이 작성됩니다 이
@Service
public class Doer {
// Your logic
}
// To use it in another class, suppose in Controller
@Controller
public class XController {
// You have to inject it like this
@Autowired
private Doer doer;
}
@Repository 를 주입 할 때 모두 동일한 방식입니다 .Repository 는 Repository Pattern Repository 디자인 패턴에 대한 구현을 적용하는 인터페이스 이며 일반적으로 일부 데이터 저장소 또는 데이터베이스를 처리 할 때 사용되며 여러 항목이 포함되어 있음을 알 수 있습니다 데이터베이스 작업을 처리 할 수있는 준비된 구현. CrudRepository , JpaRepository 등이 될 수 있습니다 .
// For example
public interface DoerRepository implements JpaRepository<Long, XEntity> {}
마지막으로 @Component , 이것은 Spring에서 등록 된 빈의 일반적인 형식입니다. 스프링은 항상 @Component로 표시된 빈을 찾고 있습니다. 그런 다음 @Service와 @Repository는 @Component의 특별한 경우이지만 일반적인 사용 사례입니다 구성 요소는 직접적인 비즈니스 사례를 다루지 않는 순수한 기술적 인 것을 만들 때입니다! 날짜 형식 지정 또는 특수 요청 직렬화 메커니즘 등을 전달합니다.
@Component 는 구성 클래스에서 @Bean 주석으로 작동하고 스프링 컨텍스트에서 Bean을 등록합니다. 또한 @Service, @Repository 및 @Controller 주석의 부모입니다.
@Service , @Component 주석을 확장하며 이름 차이 만 있습니다.
@ Repository-@Component 주석을 확장하고 모든 데이터베이스 예외를 DataAccessException 으로 변환합니다 .
@ Controller-MVC 패턴에서 컨트롤러 역할을합니다. 디스패처는 이러한 주석이 달린 클래스에서 매핑 된 메소드를 검색하여 @RequestMapping 주석을 감지합니다.
@Component
@Controller
@Repository
@Service
@RestController
이것들은 모두 StereoType 주석입니다. 이것은 클래스를 ioc 컨테이너에서 스프링 빈으로 만드는 데 유용합니다.