2012-08-16 2 views
1

EJB3를 사용하여 다음을 수행 할 수 있는지 궁금합니다.EJB 3 동일한 인터페이스의 다중 상태 비 저장 세션 빈 구현

interface DateParser { 
    Date parseDate(String input); 
    String getType(); 
} 

그런 다음 나는 getType로 설정 방법에 주어진 정보에 따라 서로 다른 형식을 처리했다 인터페이스의 여러 구현이 있습니다

나는 다음과 같은 인터페이스를 가지고있다. Bean이 시작되면 DateParser의 구현 세트가 작성되고 날짜를 구문 분석해야 할 때 세트를 반복하여 어느 것이 일치하는지 확인한다. 일치하는 경우 해당 날짜를 구문 분석하는 데 사용됩니다. 일치하지 않으면 기본 전략을 적용합니다. 나는 새로운 전략을 추가 할 때마다 빈에서 코드 변경이 필요하기 때문에 위임자를 인스턴스화하지 않으려 고합니다.

배포 할 때 발견 한 모든 구현을 컨테이너가 주입하도록하는 것이 훨씬 좋습니다. 이것을 달성하기위한 합리적인 방법이 있습니까?

감사합니다.

+1

당신은 그 자체가 코드 변경 (새로운 전략 클래스)입니다 아마 있는지, 새로운 전략을 추가하는 경우? 전략 수업이 공장에 등록되어야하고 기본 프로세서가 일치하는 구현을 제공하도록 공장에 요청할 수 있어야하는 것 같습니다. –

+0

매우 사실. 간단히 공장에 등록 할 수 있습니다. 목표는 자동으로 등록되도록하는 것입니다. – babernathy

답변

1

이 인터페이스의 구현은 빈이 아닌 일반 클래스 여야합니다. EJB는 비즈니스 서비스를위한 것입니다. 구문 분석 날짜가 IMHO이므로 콩에 비해 너무 세밀합니다.

배포시 찾은 모든 구현을 컨테이너에 주입하는 것이 좋습니다.

나는 그렇게 할 표준 방법이 없다고 생각합니다. 인스턴스를 사용하여 세트를 동적으로 채우는 두 가지 옵션 만 보았습니다.

  1. 클래스 이름 목록과 함께 외부 구성 파일을 사용하십시오. 각 클래스 이름에 도달하고 반영하는 인스턴스 하나를 인스턴스화하십시오 (Class.forName, Class.newInstance). 그런 다음 세트에 추가하십시오.

  2. DateParser의 구현을 식별하는 클래스 경로의 모든 클래스에 대해 반복합니다. 그런 다음 그것을 반사적으로 인스턴스화하고 세트에 추가하십시오. 로드 가능한 클래스를 반복하는 것은 다소 까다 롭습니다 (this answer 참조).

는 그것을 큰 혼란 만드는 콩의 코드 변경이 필요합니다.

클래스에는 코드 변경이 필요하지만 bean 자체는 변경하면 안됩니다. Bean은 집합의 생성, 파서의 식별 등을 다른 클래스 인 IMHO에 위임해야합니다.

+0

귀하의 답변에 동의합니다. 내 마지막 해결책은 일치를 기반으로 파서를 반환하는 팩토리 클래스를 구현하는 것이 었습니다. 이는 새로운 파서 유형을 팩토리 클래스에 추가하는 것과 관련된 변경 사항을 격리합니다. – babernathy

0

예,이 샘플을 볼 수 있습니다.

@EJB(beanName = "yourSessionEJB") 
    DateParser dateParser; 

당신은 beanName에 속성에 다른 세션 빈의 이름을 변경할 수 있습니다. 그러나 하나의 세션 빈을 사용하는 하나의 로컬 인터페이스가 권장되고 혼동되지 않습니다.

+0

내가 찾던 내용이 아닙니다. 전략 패턴에서는 동일한 인터페이스에 대해 여러 구현을 시도하고 달성하려는 대상을 기반으로 적절한 인터페이스에 위임합니다. 귀하의 예제는 하나의 인터페이스 만 주입합니다. – babernathy

0

일부 인터페이스의 모든 구현을 가져 오려면 @Any annotation with Instance 인터페이스를 사용할 수 있습니다.

이 한 번 봐 : https://goo.gl/Kbn0bP

관련 문제