本文為《你好,OSGi》系列第八部分。前文已使用 Spring DM 建立 Hello World 應用,本篇將實作服務 Bundle 的匯入匯出,構建面向服務的聯絡人管理應用。
為簡化示範,方法僅將方法名稱輸出至 Eclipse 主控台,不實作真實資料庫邏輯。
package com.javaworld.sample.osgi.spring.contact;
public class Contact {
int contactId;
String firstName;
String lastName;
public int getContactId() { return contactId; }
public void setContactId(int contactId) { this.contactId = contactId; }
}
package com.javaworld.sample.osgi.spring.contact;
public interface ContactDAO {
public List getContactList();
public Contact getContact(int contactId);
public void insertContact(Contact contact);
public void updateContact(Contact contact);
public void deleteContact(int contactId);
}
標準 CRUD 介面,定義建立、更新、檢索、刪除操作。
package com.javaworld.sample.osgi.spring.contact.impl;
public class ContactDAOImpl implements ContactDAO {
public Contact getContact(int contactId) {
System.out.println("Inside ContactDAOImpl.getContact()");
return null;
}
// 其他方法同樣為空實作
}
注意:Contact 與 ContactDAO 必須為公共類別(供其他 Bundle 存取),置於 com.javaworld.sample.osgi.spring.contact 套件;實作類 ContactDAOImpl 為內部類別,置於 com.javaworld.sample.osgi.spring.contact.impl 套件。
在 MANIFEST.MF 添加:Export-Package: com.javaworld.sample.osgi.spring.contact
Spring DM 建議將設定劃分為兩個檔案:一個定義 Spring Bean,另一個將 Bean 匯出為 OSGi 服務。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="contactDAOService" class="com.javaworld.sample.osgi.spring.contact.impl.ContactDAOImpl"/>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="https://www.springframework.org/schema/osgi"
xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
https://www.springframework.org/schema/osgi https://www.springframework.org/schema/osgi/spring-osgi.xsd">
<osgi:service id="contactDAOOSGiService" ref="contactDAOService"
interface="com.javaworld.sample.osgi.spring.contact.ContactDAO"/>
</beans>
<osgi:service> 元素最少需 id(對應導出 Bean 名稱)與 interface(服務實作介面)屬性。
添加:Import-Package: com.javaworld.sample.osgi.spring.contact
public class HelloWorld {
ContactDAO contactDAO;
public ContactDAO getContactDAO() { return contactDAO; }
public void setContactDAO(ContactDAO contactDAO) { this.contactDAO = contactDAO; }
public void start() throws Exception {
System.out.println("Hello Spring World!! ");
System.out.println(contactDAO.getContactList());
}
public void stop() throws Exception {
System.out.println("Goodbye Spring World!!");
}
}
新增 contactDAO Bean 屬性含 getter/setter,修改 start() 調用服務並輸出訊息。
helloworld-osgi.xml:引用 OSGi 服務轉為 Spring Bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="https://www.springframework.org/schema/osgi"
xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
https://www.springframework.org/schema/osgi https://www.springframework.org/schema/osgi/spring-osgi.xsd">
<osgi:reference id="contactDAOService"
interface="com.javaworld.sample.osgi.spring.contact.ContactDAO"/>
</beans>
<osgi:reference> 以 id 指定 Spring Bean 名稱,interface 查找匹配服務。若多個服務匹配,返回最高排名者;可用 filter 精確定義。
helloworld.xml:將服務注入 Hello Bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="hello" class="com.javaworld.osgi.spring.HelloWorld"
init-method="start" destroy-method="stop">
<property name="contactDAO" ref="contactDAOService"/>
</bean>
</beans>
在 Eclipse IDE 執行 Bundle,啟動 HelloWorld 時主控台將顯示:Hello Spring World!! Inside ContactDAOImpl.getContactList()。Spring Extender Bundle 啟動後,依序為 ContactDAO 與 HelloWorld 建立應用程式語境,匯出服務、引用服務、注入依賴,完整示範 OSGi 動態服務機制。