2014-01-10 6 views
0

"DbService"인터페이스를 가진 "코어"모듈이 있습니다. 해당 인터페이스의 구현은 (서로 다른 목적을 위해 내가 "DbService"많은 구현을, 그래서 난 그냥 내 프로그램을 실행하기 전에 "오른쪽"대신에 "오른쪽"단지 배치) 다른 모듈 "MsSqlDbService"내부다른 jar에서 인터페이스 구현을 추가하십시오.

는 "DbService"을로드하려면 나는 그래서 궁금 표준 자바 서비스 로더에게 java.util.ServiceLoader<DbService>

를 사용하여 내 스프링 컨테이너가 "DbService"을 관리 할 수있는 방법이 있나요? 이제 스프링 컨테이너가 "DbService"자체를 관리하는 대신 실제로 "DbService"구현을로드하는 클래스를 관리합니다.

+0

은 봄에 의해 관리되는 MsSqlDbService입니까? – dhamibirendra

답변

1

(서로 다른 목적을 위해 내가 "DbService"많은 구현을, 그래서 난 그냥 자리에 DbService의 (필요한) 구현 클래스를 넣어 내 오른쪽 프로그램을 실행하기 전에 "올바른"병에있는 "오른쪽"항아리)

내가 이해한다면 다시 말하면, 당신은 모두 같은 인터페이스의 구현을 포함하고있는 여러 개의 JAR을 가지고있다. 배포 할 때 classpath에있는 Spring을 픽업하여 모든 것을 자동으로 autowire하면됩니까?

<import resource="classpath:applicationContext-dbService.xml"/>

: 당신의 상황이 추가

1) 메인 프로젝트에서 :

봄은 확실히 이런 종류의 물건을 달성하기 위해 "가난한 사람의 플러그인 프레임 워크"로 사용할 수 있습니다 2) 각 JAR에서 applicationContext-dbService.xml이라는 파일을 작성하십시오. 당신이 제공 한 SQL Server 예제에서 이와 비슷한 모습을 보일 것입니다.

<bean id="msSqlDbService" class="com.foo.MsSqlDbServiceImpl"/> 

3) 메인 컨텍스트가로드되면 봄이 applicationContext-dbService.xml라는 이름의 파일에 대한 클래스 경로를 검색 한 다음에 정의 된 모든 콩을 처리합니다. 배포시 classpath에 하나의 "Plugin"JAR 만 있다고 가정하면 DbService의 인스턴스를 기본 프로젝트의 모든 항목에 autowire 할 수 있습니다.

+0

그것은 작동합니다. 감사. "가난한 사람의 플러그인 프레임 워크"에 대해 - 다른 방법으로 수행해야한다고 생각합니까?내 말은 ... 이런 식으로 일하는 것이 드문 일일까요? 왜냐하면 나는 자바 세계에 익숙하지 않았기 때문에 어떻게해야할지 모르기 때문에이 방법을 독자적으로 생각해 냈다. – nikopol86

+0

스프링을 사용하여 똑같은 일을하는 몇 가지 프로젝트가 있습니다. 완벽하게 정상적인 방법으로 일을합니다. 그것이 당신을 위해 작동한다면, 계속해서 걱정없이 사용하십시오. "가난한 사람의 플러그인 프레임 워크"가 의미하는 바는이 접근 방식이 OSGi와 같은 완전한 기능을 갖추고 있지 않다는 것입니다. 예를 들어, 플러그인 버전 관리, 플러그인 간 종속성 또는 수명주기 이벤트 (플러그인 시작/중지/제거)는 처리하지 않습니다. 그러나 1) 당신은 그러한 기능에 대한 요구 사항이 있다는 것을 나타내지 않았다. 2) 프로젝트에 OSGi와 같은 것을 추가하는 것이 훨씬 더 많은 노력이 필요할 것이다. –

0

DbService 인터페이스를 클래스의 구성원으로 정의 할 수 있습니다.

class Demo{ 

@Autowired 
@Qualifier("msSqlDbService") 
private DbService dbService; 

//Setter and getter 
} 

이제 스프링의 XML 설정

<bean id="msSqlDbService" class="xxxx.MsSqlDbService"/>//xxxx is the package name. 
+0

MsSqlDbService는 별도의 jar (모듈)의 클래스이며 "코어"내부의 패키지는 아닙니다. 그래서 불가능합니다. 그러나 어쨌든 고마워. – nikopol86

+0

나는 당신이 의미하는 것을 얻지 못했습니다. 항아리의 클래스를 사용해야하는 경우 응용 프로그램의 클래스 경로에 입력해야합니다. 어떻게 불가능합니까? –

관련 문제