THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
Declaring component types
XML
<component classname="my.Implementation" name="my-type"> </component>
Annotations
@Component(name="my-type") public class Implementation { // ... }
Creating component instances
XML only
<instance component="my-type"/> <instance component="my.Implementation"/> <instance component="my-type" name="my-instance"/> <instance component="my-type" name="my-instance"> <property name="property1" value="value1"/> </instance>
- Instances can contains a configuration given under the
key-value
form. Properties can also by complex type. - How-to use iPOJO factories
Providing services
XML
<component classname="my.service.implementation" name="my-service-impl"> <provides/> </component> <instance name="my-service-impl"/>
Annotations
@Component @Provides public class Implementation implements FooService { ... }
- Only instances provides really services, so don't forget to declare an instance.
- Published service interfaces must be implemented by your component implementation
- Providing OSGi services
Publishing service properties
XML
<component classname="my.service.implementation" name="my-service-impl"> <provides> <property name="foo" field="m_foo" /> <property name="bar" field="m_bar" mandatory="true" /> <property name="baz" type="java.lang.String" /> <!-- Static property (do not change at runtime) --> </provides> </component> <instance name="my-service-impl"> <!-- The configuration has to inject value in unvalued mandatory properties --> <property name="bar" value="5"/> <property name="baz" value="my string"/> <instance/>
Annotations
@Component @Provides(specifications= {FooService.class, BarService.class}) public class ProvidesProperties implements FooService, BarService { @ServiceProperty(name = "foo") public int m_foo = 0; @ServiceProperty(name="bar", mandatory=true) public int m_bar; // ... }
Using services with field injection
XML
<component classname="my.consumer.Implementation"> <requires field="fs" /> </component>
Annotations
@Component public class Dependency { @Requires public FooService fs; //... }
Using services with method injection
XML
<component classname="my.consumer.Implementation"> <requires> <callback type="bind" method="bind" /> <callback type="unbind" method="unbind" /> </requires> </component>
Annotations
@Component public class Dependency { @Unbind public synchronized void unbind(BazService bz) { //... } @Bind public synchronized void bind(BazService bz) { // ... } //... }
Reacting to lifecycle state changes
Immediate components
- A POJO object (implementation object) is created as soons as the instance becomes valid
- Instances that don't provide services becomes automatically immediate
XML
<component classname="my.service.implementation" name="my-service-impl" immediate="true"> <provides/> </component>
Annotations@Component(immediate=true) @Provides public class Implementation implements FooService { ... }
- Lifecycle Callback Handler
Lifecycle callbacks
XML
<component classname="my.implementation" name="my-impl"> <callback transition="validate" method="start" /> <callback transition="invalidate" method="stop" /> </component>
Annotations
@Component public class Implementation { @Validate public void start() { } @Invalidate public void stop() { } }
Declaring properties
XML
<component classname="my.Implementation" name="my-impl"> <properties propagation="true" managedservice="MyPID"> <property name="boo" method="setBoo" /> <property field="m_bar" mandatory="true"/> <property field="m_foo" value="4"/> </properties> </component> <instance component="my-impl"> <property name="boo" value="..."/> <property name="m_bar" value="..."/> </instance> <instance component="my-impl"> <property name="boo" value="..."/> <property name="m_bar" value="..."/> <property name="managed.service.pid" value="AnotherPID"/> </instance>
Annotations
@Component(managedservice="MyPID", propagation=true) public class Implementation { @Property(name="boo") public void setBoo(int boo) { //... } @Property(mandatory=true) public int m_bar; @Property(value="4") public int m_foo; }
Using 'arch'
- Deploy the 'arch' command bundle (available for Felix and Equinox)
- Launch the 'arch' command in the OSGi Framework Shell
arch => displays instances name & state (equivalent to arch \-instances) arch -instance $instance_name => displays complete information about the instance $instance_name arch -factories => display the list of available factories arch -factory $factory_name => display complete information about the factory $factory_name arch -handlers => list available handlers
- Architecture Handler
Temporal Dependencies
- Temporal dependencies are injected in fields. When accessing to the service, the thread waits for the service availability. If a timeout is reached, a timeout policy is executed.
- Service objects can be injected as
proxies
and be given to collaborator objects. - Temporal dependencies are implemented as an external handlers. To use them, deploy and start the temporal dependency handler bundle.
XML
<iPOJO xmlns:temporal="org.apache.felix.ipojo.handler.temporal"> <component className="my.Implementation"> <!-- Temporal dependency configuration --> <temporal:requires field="mytemporal"/> <provides/> </component> </iPOJO>
Annotations
import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.handler.temporal.Requires; import org.apache.felix.ipojo.test.scenarios.annotations.service.FooService; @Component public class Implementation { @Requires // org.apache.felix.ipojo.handler.temporal.Requires private FooService mytemporal; }
Error CSS Stylesheet macro - Import URL 'http://people.apache.org/~clement/ipojo/ipojo.css' is not on the allowlist. If you want to include this content, contact your Confluence administrator to request adding this URL to the Allowlist.
Overview
Getting Started
- iPOJO in 10 minutes
- How to use iPOJO Annotations
- iPOJO Hello Word (Maven-Based) tutorial
- iPOJO Advanced Tutorial
- iPOJO Composition Tutorial
User Guide
- Describing components (handler list)
- Using XML Schemas
- Describing components with the iPOJO-API
- Testing components
- Advanced Topics
- Eclipse Integration
- FAQ
- iPOJO Reference Card
Tools
- iPOJO Eclipse Plug-in
- iPOJO Ant Task
- iPOJO Maven Plug-in
- Online-Manipulator
- iPOJO Arch Command
- iPOJO Webconsole plugin
- Junit4OSGi
Developer Guide
- Javadoc: 1.2
- How to write your own handler
- How to use iPOJO Manipulation Metadata
- Dive into the iPOJO Manipulation depths
Misc & Contact
- Issues Tracker
- Supported JVMs
- Supported OSGi Implementations
- iPOJO's Dark Side Blog
- Future Ideas
- Article & Presentations
Experimentation