복붙노트

[SPRING] @Service 주석은 어디에 보관해야합니까? 인터페이스 또는 구현?

SPRING

@Service 주석은 어디에 보관해야합니까? 인터페이스 또는 구현?

Spring을 사용하여 응용 프로그램을 개발 중입니다. @Service 주석을 사용해야합니다. 나는 ServiceImpl이 ServiceI를 구현하도록 ServiceI와 ServiceImpl을 가지고있다. @Service 주석을 어디에 보관해야하는지 여기에서 혼란스러워합니다.

@Service를 사용하여 인터페이스 또는 구현에 주석을 추가해야합니까? 이 두 가지 접근 방식의 차이점은 무엇입니까?

해결법

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

    1.기본적으로 @Service, @Repository, @Component 등의 주석은 모두 같은 목적으로 사용됩니다.

    기본적으로 @Service, @Repository, @Component 등의 주석은 모두 같은 목적으로 사용됩니다.

    내 경험에 비추어 볼 때 항상 @Service 주석을 @Component 및 @Repository와 같은 인터페이스 또는 추상 클래스 및 주석에 사용하고 있습니다. @Component annotation 기본 목적을 제공하는 클래스, 간단한 스프링 빈, 그 이상은 사용하지 않습니다. @Repository annotation 예를 들어, DAO 레이어에서 사용하고 있습니다. 데이터베이스와 통신해야하고 트랜잭션이 필요한 경우

    따라서 기능에 따라 @Service 및 다른 레이어로 인터페이스에 주석을 달 것을 제안합니다.

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

    2.@Component (또는 @Service, ...)를 인터페이스에 두지 않습니다. 인터페이스가 쓸모 없기 때문입니다. 이유를 설명해 드리겠습니다.

    @Component (또는 @Service, ...)를 인터페이스에 두지 않습니다. 인터페이스가 쓸모 없기 때문입니다. 이유를 설명해 드리겠습니다.

    청구항 1 : 인터페이스가있는 경우 주입 점 유형에 해당 인터페이스를 사용하려고합니다.

    청구항 2 : 인터페이스의 목적은 여러 구현에 의해 구현 될 수있는 계약을 정의한다는 것이다. 다른쪽에는 주사 점 (@Autowired)이 있습니다. 단 하나의 인터페이스와 그것을 구현하는 단 하나의 클래스를 갖는 것은 쓸모없고 YAGNI를 위반합니다.

    사실 : 당신이 넣을 때 :

    그럼 당신은 얻을 것이다 NoUniqueBeanDefinitionException (또는 환경, 프로파일 또는 한정자와 함께 매우 특별한 구성 설정 ...)

    결론 : 인터페이스에서 @Component (또는 @Service, ...)를 사용하는 경우 최소한 두 개의 클랜 중 하나를 위반해야합니다. 따라서 인터페이스 레벨에 @Component를 두는 것이 (드문 시나리오를 제외하고는) 유용하지 않다고 생각합니다.

    Spring-Data-JPA 저장소 인터페이스는 완전히 다른 것입니다.

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

    3.@Component, @Service, @Controller 및 @Repository 주석은 인터페이스가 아닌 구현 클래스에서만 사용했습니다. 그러나 인터페이스가있는 @Autowired 주석은 여전히 ​​나를 위해 일했습니다.

    @Component, @Service, @Controller 및 @Repository 주석은 인터페이스가 아닌 구현 클래스에서만 사용했습니다. 그러나 인터페이스가있는 @Autowired 주석은 여전히 ​​나를 위해 일했습니다.

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

    4.@Service에 주석을 추가하는 장점은 그것이 서비스라는 힌트를 제공한다는 것입니다. 구현 클래스가 기본적으로이 어노테이션을 상속하는지 여부는 알 수 없습니다.

    @Service에 주석을 추가하는 장점은 그것이 서비스라는 힌트를 제공한다는 것입니다. 구현 클래스가 기본적으로이 어노테이션을 상속하는지 여부는 알 수 없습니다.

    Con 측면에서는 스프링 특정 주석을 사용하여 특정 프레임 워크, 즉 Spring과 인터페이스를 연결하는 것입니다.                                   인터페이스가 구현과 분리되어야하기 때문에 인터페이스의 특정 Annotation이나 객체 부분을 사용하는 것은 권장하지 않습니다.

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

    5.간단히 말하면 다음과 같습니다.

    간단히 말하면 다음과 같습니다.

    @Service는 서비스 계층에 대한 스테레오 타입 어노테이션입니다.

    @Repository는 지속 레이어에 대한 스테레오 타입 주석입니다.

    @Component는 Spring에게 Application Context에서 객체의 인스턴스를 생성하도록 지시하기 위해 사용되는 일반적인 스테레오 타입 주석이다. 가능하다.  인스턴스의 이름을 정의하십시오. 기본값은 낙타의 경우처럼 클래스 이름입니다.

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

    6.봄의 한 가지 이점은 서비스 (또는 다른) 구현을 쉽게 전환하는 것입니다. 이를 위해 인터페이스에 주석을 달고 다음과 같이 변수를 선언해야합니다.

    봄의 한 가지 이점은 서비스 (또는 다른) 구현을 쉽게 전환하는 것입니다. 이를 위해 인터페이스에 주석을 달고 다음과 같이 변수를 선언해야합니다.

    @Autowired
    private MyInterface myVariable;
    

    그렇지 않은 경우 :

    @Autowired
    private MyClassImplementationWhichImplementsMyInterface myVariable;
    

    첫 번째 경우와 마찬가지로 고유 한 순간부터 삽입 할 구현을 활성화 할 수 있습니다 (단 하나의 클래스 만 인터페이스를 구현 함). 두 번째 경우에는 모든 코드를 리팩터링해야합니다 (새 클래스 구현은 다른 이름을 가짐). 결과적으로 주석은 인터페이스에 가능한 한 많이 있어야합니다. 게다가 JDK 프록시는 이것에 매우 적합합니다 : CGlib 프록시와 달리 런타임 유형이 사전에 알려져 있기 때문에 애플리케이션 시작시 생성되고 인스턴스화됩니다.

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

    7.봄 콩 만들기에 사용할 수있는 5 개의 주석이 있습니다. 아래에 답변을 나열하십시오.

    봄 콩 만들기에 사용할 수있는 5 개의 주석이 있습니다. 아래에 답변을 나열하십시오.

    인터페이스가 정말로 필요합니까? 각 서비스 인터페이스에 대해 하나의 구현을 사용하려는 경우 클래스를 사용하십시오. 물론, RMI가 없거나 인터페이스 프록시가 필요한 경우.

    @ 보관실 - 귀하의 DAO 계층 클래스를 주입하는 데 사용합니다.

    @Service - 서비스 계층 클래스를 주입하는 데 사용합니다. 서비스 계층에서도 db 트랜잭션 관리를 위해 @Transactional 어노테이션을 사용해야 할 수도 있습니다.

    @Controller - Spring Bean으로 주입하는 JSF 관리 빈과 같은 프론트 엔드 계층 컨트롤러에 사용합니다.

    @RestController - 스프링리스 컨트롤러 용으로 사용하면 나머지 메소드에 @ResponseBody 및 @RequestBody 주석을 추가 할 때마다 피할 수 있습니다.

    @Component - 컨트롤러, 서비스 또는 DAO 클래스가 아닌 스프링 빈을 삽입해야하는 경우에 사용하십시오

  8. from https://stackoverflow.com/questions/16351780/where-should-service-annotation-be-kept-interface-or-implementation by cc-by-sa and MIT license