2017-04-24 9 views
2

개발자가 Apache Felix 서비스를 만드는 여러 가지 방법을 발견했습니다. 첨부 된 각 스 니펫이 작동하는 것 같습니다. 어떤 시나리오Apache Felix 서비스를 만들기위한 인터페이스를 구현하는 이유는 무엇입니까?

샘플 1에 가장 적합한 구문을 이해하는 데 도움이 필요합니다 : 서비스 인터페이스없이 서비스의

  • 선언

D를 생성

@Component 
@Service(ServiceViaClass.class) 
public class ServiceViaClass{ 
} 
  • @Reference annotation을 통한 서비스 사용

    private ServiceViaClass serviceViaClass;

샘플 2 : 서비스 구현 인터페이스. @Service 주석 없음 value 속성 - 서비스 @Reference 주석

개인 ServiceViaInterface의 serviceViaInterface를 통해 서비스를 사용

@Component 
@Service 
public class ServiceViaInterfaceImpl implements ServiceViaInterface{ 
} 
  • 선언;

샘플 3 : 서비스 @Service 주석 가치 속성을 가진 인터페이스를 구현 - 서비스 @Reference 주석

개인 ServiceViaInterface의 serviceViaInterface를 통해 서비스를 사용

@Component 
@Service(ServiceViaInterface.class) 
public class ServiceViaInterfaceImpl implements ServiceViaInterface{ 
} 
  • 선언;

답변

1

구성 요소는 인터페이스를 구현하고 해당 인터페이스에서 서비스로 자체를 게시하므로 클라이언트는 인터페이스 만 사용하여 구성 요소를 찾을 수 있습니다.

샘플 1 - 구체적인 유형의 구성 요소를 사용하여 서비스를 게시하는 - 거의 항상 쓸모가 없습니다. 이 서비스는 구체적인 유형을 사용해서 만 찾을 수 있습니다. 클라이언트가 구체적인 유형을 볼 수 있다면 서비스 레지스트리에서 인스턴스를 가져 오는 대신 직접 인스턴스화하지 않는 것이 좋습니까?

샘플 2 - 인터페이스를 구현하고 단지 @Service 주석을 추가하여 서비스를 게시는 - 당신이 일반적으로가해야 할 일이다. @Service을 사용하고 구성 요소가 인터페이스를 직접 구현하면 구성 도구는 해당 구성 요소가 해당 인터페이스에서 서비스로 게시되기를 원한다고 추론합니다.

샘플 3은 샘플 2와 마찬가지로 실행시와 똑같은 효과가 있습니다. 코드에서 좀 더 분명합니다. 그것이 명백하기 때문에 어떤 사람들은 이것을 선호합니다. 다른 사람들 (나를 포함해서)은 불필요하기 때문에 그것을 좋아하지 않습니다.