특히 OSGi와 관련하여 프레임 워크 코드에서 애플리케이션 코드를 분리하는 모범 사례 또는 패턴을 알고 싶습니다.OSGi loose-coupling best practice
나는 example from the Felix SCR pages
예제 서비스를 사용하는거야는 그것을 집중하고 간결한 것), 비교기 (
package sample.service;
import java.util.Comparator;
public class SampleComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
return o1.equals(o2) ? 0 : -1;
}
}
위의 코드는 어떤 프레임 워크 배관을 포함하지 않습니다. OSGi를 사용할 때이를 응용 프로그램에서 사용할 수 있도록하려면 서비스 레지스트리에 등록해야합니다. 링크 된 Felix 페이지에 설명 된 것과 같은 한 가지 방법은 Service Component Runtime을 사용하는 것입니다.
Service-Component: OSGI-INF/sample.xml
// OSGI-INF/sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<component name="sample.component" immediate="true">
<implementation class="sample.service.SampleComparator" />
<property name="service.description" value="Sample Comparator Service" />
<property name="service.vendor" value="Apache Software Foundation" />
<service>
<provide interface="java.util.Comparator" />
</service>
</component>
및
모든 좋은 사랑스러운, 내 서비스 구현은 OSGI에 전혀 연결이 없습니다. 나는 또한 추가 할 필요가 SCR 이벤트 전략을 사용protected void activate(ComponentContext context) {
Comparator c = (Comparator) context.locateService("sample.component");
}
: 나는 프레임 워크 전용 메소드를 추가 할 필요가 SCR 조회 전략을 사용
지금이 서비스를 사용하려면 ...
package sample.consumer;
import java.util.Comparator;
public class Consumer {
public void doCompare(Object o1, Object o2) {
Comparator c = ...;
}
}
프레임 워크 만의 방법 :
protected void bindComparator(Comparator c) {
this.c = c;
}
protected void unbindComparator(Comparator c) {
this.c = null;
}
나는 당신이 위스콘신 이러한 종류의 코드가 클래스에서 중복되어 상당한 양의 필터링을 수행 할 수 있습니다.
내가 볼 수있는 가능한 해결책 중 하나는 OSGi 특정 클래스를 사용하여보다 전통적인 방법과 프레임 워크를 통해 소비자를 중재하는 것입니다.
package sample.internal;
public class OsgiDependencyInjector {
private Consumer consumer;
protected void bindComparator(Comparator c) {
this.consumer.setComparator(c);
}
protected void unbindComparator(Comparator c) {
this.consumer.setComparator(null);
}
}
SCR 구성에서 어떻게 구성 할 지 모르겠습니다.
org.apache.felix.scr.annotations도 있습니다 만, 이는 maven-scr-plugin으로 빌드하는 경우에만 모두 작동한다는 것을 의미합니다. 그렇게 나쁜 것은 아니고 AFAICT는 런타임에 아무런 영향을 미치지 않습니다.
이제 모든 것을 읽었습니다. 프레임 워크 코드로 '오염 된'애플리케이션 코드없이 OSGi가 제공하는 서비스를 사용하는 가장 좋은 방법은 무엇이라고 생각하십니까?