In this chapter we will implement our first Spring-DM service.
Before we create our first Spring-DM project let's define a use case for it
Our project will consist of a simple service which will define a method that accepts a String and returns it back in reverse order. We will also export this service as an OSGi™ service, so later on when we develop Spring-DM web-based project we will be able to reference this service as plain OSGi™ service using features of Spring-DM.
We are going to be using Eclipse PDE as it is a natural fit for OSGi (Spring-DM included) based projects.
3.1. Create Spring-DM service Project
Create Plug-in Project
Click on: File -> New -> Project
New Project window will open up:
Select Plug-in Project -> Next
Enter org.springframework.osgi.springdm.simple as Project Name.
Select an OSGi Framework [Equinox]
Click Next.
Change Plug-in Name to Simple Service
Click Finish
![]() | Note: |
|---|---|
| Remember this procedure since you might want to reuse it while creating other projects. |
We are finished creating project structure. Now we are ready to write some code. . .
Create the following Java Artifacts:
StringReverser.java – service interface:
==================================================================================== package org.springframework.osgi.sample.service;
publicinterface StringReverser {
public String reverse(String str);
}
====================================================================================StringReverserImpl.java – service implementation:
====================================================================================
package org.springframework.osgi.sample.service.impl;
import org.apache.log4j.Logger;
import org.springframework.osgi.service.StringReverser;
publicclass StringReverserImpl implements StringReverser {
privatestatic Logger logger = Logger.getLogger(StringReverserImpl.class);
public String reverse(String str) {
logger.info("Receiveing string: " + str);
char[] chars = str.toCharArray();
StringBuffer buf = new StringBuffer();
for (int i = chars.length - 1, x = 0; i >= 0; i--, x++) {
buf.append(chars[i]);
}
String reveresed = buf.toString();
logger.info("Reterning string: " + reveresed);
return reveresed;
}
}
====================================================================================This is it. As you can see, it is a very simple POJO based service.
Your project should look like this:
3.3. Configure Spring-DM servie
In order for this project to be recognized as an OSGi™ project it should have MANIFEST file.
We could have created this project originally as Eclipse PDE project (similar to the way we did Log4J project) and MANIFEST
would be created for us automatically; however for the purposes of learning experience we are going to define it manually.
It will also allow us not to be coupled completely to the environment provided by the
Eclipse PDE (just use it enough to help us out)
Create META-INF directory at the root of the project
Create MANIFEST.MF file inside of META-INF directory (i.e., META-INF/MANIFEST.MF)
Copy the following contents into MANIFEST file:
====================================================================================
Manifest-Version: 1.0
Bundle-Version: 1.0
Bundle-SymbolicName: org.springframework.osgi.simple.reverser
Bundle-Name: Simple String Reverser Bundle
Bundle-Vendor: Spring Framework
Bundle-ManifestVersion: 2
Export-Package: org.springframework.osgi.sample.service
Import-Package: org.apache.log4j;version="1.2.15"
====================================================================================As you see, we are exporting the package which contains our service definition (interface). We are also importing log4j package, as we depend on it within our code.
Now we have enough for Equinox (our OSGi platform) to recognize our project as valid OSGi bundle.
However few things are still missing. . .
For our project being Spring based project, we have yet to define our Application Context and its configuration. We can obviously define it anywhere, but then we would have to let Spring DM Extender know where the configuration files located. Chapter 4.1. Bundle format and Manifest headers explains in details how to do that (extra MANIFEST headers). But for the purposes of this tutorial we are going rely on default location specified and expected by Spring DM. This way Spring DM Extender bundle will be able to find our Application Context configuration , bootstrap it (similar to the way ContextLoaderListener does in web environment) and export our service as OSGi™ service into our Target Platform without any extra MANIFEST headers.
Create spring directory inside of META-INF directory.
This is the default directory where Spring DM Extender bundle will look for Spring configurations.
Create simpleservice.xml file and copy the following contents into the file:
====================================================================================
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<beanname="stringReverser"
class="org.springframework.osgi.sample.service.impl.StringReverserImpl"/>
</beans>
====================================================================================
This file configures our service as a regular Spring bean
Create simpleservice-osgi.xml file and copy the following contents into the file:
====================================================================================
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="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">
<osgi:serviceid="stringReverserOsgi"ref="stringReverser"
interface="org.springframework.osgi.sample.service.StringReverser"/>
</beans>
====================================================================================
This file uses osgi name space to provide a directive for Spring DM’s Extender bundle to export
our service and publish it under the interface it implements.
This is it. Your META-INF directory should look like this:
The only thing that is left to do is to package our bundle and deploy it. However, Eclipse PDE environment already recognizes our project as valid OSGi project and included (deployed) it as a Workspace resource into our Target Platform, which is very convinient during an active development (see below)
And even though we will need to package it later for distribution or integration testing, we don’t have to do it just yet.
As I mentioned before, during the active development there is no need for explicite packaging or deployment. Simply start the Spring DM Target Platform and you’ll see that the bundle is deployed and ACTIVE
Type ss on the console and you'll see:
====================================================================================
. . . . . . .
35 ACTIVE org.springframework.osgi.springdm.simple_1.0.0
. . . . . . .
====================================================================================
If you enable Eclipse PDE tracing (debug/services) as described in the previous chapter, you can easily find similar message in the console:
====================================================================================
. . . . . . .
registerService[initial@refere../../org.springframework.osgi.springdm.simple/ [18]]
({org.springframework.osgi.sample.service.StringReverser}=
{org.springframework.osgi.bean.name=stringReverser,
Bundle-SymbolicName=org.springframework.osgi.springdm.simple,
Bundle-Version=1.0, service.id=27})
. . . . . . .
====================================================================================There you can clearly see that our service was exported successfully into OSGi environment.
Packaging our service is also a very simple task. We are going to use Eclipse PDE environment to do it the same way if we were to package a regular Eclipse Plug-in.
Right-click on our project -> Export
Export window will open up:
Select Deployable Plug-ins and Fragments -> Next
Make sure our project is selected amongst the Available Plug-ins and Fragments
For the Directory (where we want the JAR to be exported) select the absolute path for the root of the project
Click Finish and then Refresh the project
You'll see that new directory plugin was created and our JAR file was exported there.
![]() | Note: |
|---|---|
| Remember this procedure since you might want to reuse it while creating other projects. |
Our project is complete and packaged as valid Spring DM/OSGi bundle.



![[Note]](note.jpg)





