1. StoreManager 번들 정리하기.

- Activator를 없애버립니다.
- ServiceTracker도 없애버립니다.

둘다 일단 MENIFEST.MF의 Dependencies에서 제거하고 소스코드도 제거합니다.
이 번들이 필요한 건 오직 Store 번들의 Service 패키지에 있는 Greeting이라는 인터페이스 뿐입니다.

StoreManager의 MENIFEST.MF 파일이 다음과 같으면 깨끗하게 정리가 된 것입니다.

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: StoreManager Plug-in
Bundle-SymbolicName: StoreManager
Bundle-Version: 1.0.0
Import-Package: service
Eclipse-LazyStart: true

2. 구현하기

Keesun이라는 클래스를 하나 만들고 다음과 같이 구현했습니다.

public class Keesun {

    private Greeting greeting;

    public void setGreeting(Greeting greeting) {
        this.greeting = greeting;
    }

    public void start(){
        System.out.println(greeting.hi("기선"));
    }
}

Setter Injection을 사용하기로 했고, start() 메소드는 제대로 세팅됐나 확인하기 위해 만들어 뒀습니다.

3. Bean 설정하기

META-INF 폴더에 spring 폴더를 만들고 스프링 설정 파일 하나를 만듭니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:osgi="http://www.springframework.org/schema/osgi"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">

    <bean class="storemanager.Keesun" init-method="start">
        <property name="greeting" ref="greeting" />
    </bean>

    <osgi:reference id="greeting" interface="service.Greeting" />

</beans>

Keesun 클래스에 start라는 init-method를 등록해두고, <osgi:reference /> 엘리먼트로 서비스를 참조합니다. 그러면 이 내부에서는 마치 자기가 원래 가지고 있던 bean 처럼 사용할 수 있습니다.

4. 테스트

사용자 삽입 이미지
Run Dialog에서 Spring OSGi만 체크하고 Run 시킵니다. 나머지는 install을 사용해서 설치합니다.

osgi> install file:c:/plugins/Store_1.0.0.jar
Bundle id is 22

osgi> install file:c:/plugins/StoreManager_1.0.0.jar
Bundle id is 23

osgi> ss

Framework is launched.

id    State       Bundle
0    ACTIVE      system.bundle_3.2.2.R32x_v20070118
1    ACTIVE      org.springframework.osgi.log4j.osgi_1.2.15.SNAPSHOT
2    ACTIVE      org.springframework.bundle.spring.context.support_2.5.1
3    ACTIVE      org.springframework.bundle.osgi.core_1.0.0
4    ACTIVE      org.springframework.osgi.aopalliance.osgi_1.0.0.SNAPSHOT
5    ACTIVE      org.springframework.bundle.osgi.extender_1.0.0
6    ACTIVE      org.springframework.bundle.spring.context_2.5.1
7    ACTIVE      org.springframework.osgi.cglib-nodep.osgi_2.1.3.SNAPSHOT
8    ACTIVE      org.springframework.bundle.osgi.extensions.annotations_1.0.0
9    ACTIVE      org.springframework.osgi.junit.osgi_3.8.2.SNAPSHOT
10    INSTALLED   org.springframework.bundle.osgi.test_1.0.0
11    ACTIVE      org.springframework.bundle.osgi.io_1.0.0
12    ACTIVE      org.springframework.osgi.asm.osgi_2.2.3.SNAPSHOT
13    ACTIVE      jcl104.over.slf4j_1.4.3
14    ACTIVE      org.springframework.spring.source_2.5.1
15    ACTIVE      org.springframework.bundle.spring.core_2.5.1
16    ACTIVE      org.springframework.osgi.source_1.0.0
17    ACTIVE      slf4j.log4j12_1.4.3
18    ACTIVE      org.springframework.osgi.backport-util-concurrent.osgi_3.1.0.SNAPSHOT
19    ACTIVE      org.springframework.bundle.spring.beans_2.5.1
20    ACTIVE      slf4j.api_1.4.3
21    ACTIVE      org.springframework.bundle.spring.aop_2.5.1
22    INSTALLED   Store_1.0.0
23    INSTALLED   StoreManager_1.0.0

osgi> start 22

osgi> GreetingImpl Bean을 만들었습니다.
start 23

osgi> hi 기선

끝~ 이 아니고 이제부터 시작입니다.
설특집은 끝입니다.