<div class="content"> |
You can use annotations to define your component types. This page presents supported annotations.
|
|
iPOJO Annotations are defines inside the org.apache.felix.ipojo.annotations project. You can download the Jar file of this project from the download page. Sources are available on the Felix trunk.
Once added to your class path / build path / dependencies, you can use the annotations as normal annotations. These annotations are automatically processed by the iPOJO manipulator.
Add the org.apache.felix.ipojo.annotations jar file in your build path. Do not forget to use a Java compiler accepting annotations (1.5 or higher).
Add the following dependency:
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.ipojo.annotations</artifactId>
<version>1.8.0</version>
</dependency>
|
Moreover, you need to set that the source code and the target code are Java 1.5 code. To achieve this, just add the following plugin in your plugins section:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
|
Just add the org.apache.felix.ipojo.annotations jar file in your class path.
To illustrate annotations usage, let taking the tutorial example. In this tutorial, there are two components:
The provider uses two annotations. The "component" annotation is mandatory and defines that the class defines a component type. Then the "provides" annotation just declare that the defined component type provides a service.
package ipojo.example.hello.impl;
import ipojo.example.hello.Hello;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
/**
* Component implementing the Hello service.
**/
@Component
@Provides
public class HelloImpl implements Hello {
public String sayHello(String name) {
return "hello " + name;
}
}
|
The Hello Service Consumer use more annotations. First it used the component annotation. To defines its "immediate" behavior, it add the 'immediate' attribute.
Then, it uses the requires annotation to define a service dependency. Finally, it uses the validate and invalidate annotations to define lifecycle callbacks.
package ipojo.example.hello.client;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Invalidate;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.Validate;
import ipojo.example.hello.Hello;
@Component(name="AnnotedHelloClient", immediate=true)
public class HelloClient implements Runnable {
@Requires
private Hello[] m_hello; // Service Dependency
private final static int DELAY=10000;
private boolean end;
public void run() {
while (!end) {
try {
invoke();
Thread.sleep(DELAY);
} catch (InterruptedException ie) { }
/* will recheck end */
}
}
public void invoke() {
for (int i = 0; i < m_hello.length; i++) {
System.out.println(m_hello[i].
sayHello("Clement"));
}
}
@Validate
public void starting() {
Thread T = new Thread(this);
end = false;
T.start();
}
@Invalidate
public void stopping() {
end = true;
}
}
|
This section lists defined annotations and how to use them.
Goal: Defines a component type
Target: The component implementation class
Attributes:
Goal: Defines that the component type provide services
Target: The component implementation class
Attributes:
@StaticServiceProperties defining service properties not attached to fields.<div class="box"> <div class="box-blue-header"> <div class="box-blue-title"> <img src="http://people.apache.org/~clement/ipojo/site/information.gif"> <b>OSGi Service Factory</b> </div> </div> <div class="box-blue-content"> The <tt>SERVICE</tt> strategy refers to the OSGi service factory. So, one service object per asking bundle will be created. </div> <div class="box-blue-footer"></div> </div> |
<div class="box"> <div class="box-blue-header"> <div class="box-blue-title"> <img src="http://people.apache.org/~clement/ipojo/site/information.gif"> <b>Changes between the 1.0.0 and the 1.2.0</b> </div> </div> <div class="box-blue-content"> The <tt>factory</tt> attribute became <tt>strategy</tt>. A third policy is now available (<tt>instance</tt>) allowing to create one service object per asking instance. Moreover, it is also possible to indicates the <tt>CreationStrategy</tt> class name. </div> <div class="box-blue-footer"></div> </div> |
Goal: Defines a service dependency
Target: Field
Attributes:
Goal: Defines a service property
Target: Field
Attributes:
<div class="box"> <div class="box-blue-header"> <div class="box-blue-title"> <img src="http://people.apache.org/~clement/ipojo/site/information.gif"> <b>Mandatory property</b> </div> </div> <div class="box-blue-content"> A mandatory property must receive a value either from the component type description (<tt>value</tt> attribute, or the instance configuration. </div> <div class="box-blue-footer"></div> </div> |
Goal: Control the service exposition
Target: Field (Boolean)
Attributes:
Goal: Defines a property
Target: Field or Method
Attributes:
<div class="box"> <div class="box-blue-header"> <div class="box-blue-title"> <img src="http://people.apache.org/~clement/ipojo/site/information.gif"> <b>Field and Method</b> </div> </div> <div class="box-blue-content"> If another property with the same name is defined the method or the field is added to the existing property. </div> <div class="box-blue-footer"></div> </div> |
Goal: Defines method called when a reconfiguration is completed.
Target: a method (receiving a dictionary in argument)
Goal: Defines a bind method
Target: Method
Attributes:
Goal: Defines an unbind method
Target: Method
Attributes:
Goal: Defines an modified method, called when a bound service is udpated.
Target: Method
Attributes:
Goal: defines a validate lifecycle callback
Target: method
Goal: defines a validate lifecycle callback
Target: method
Goal: defines a callback invoked after service registration. The callback must have the following signature : public void name(ServiceReference ref)
Target: method
Goal: defines a callback invoked after service unregistration. The callback must have the following signature : public void name(ServiceReference ref)
Target: method
Goal: declare a simple instance (this is equivalent to <instance component="..."></instance>
Target: class
Attribute:
The temporal dependency handler is an external handler. However, it can be used with an annotation defined in the iPOJO annotations jar file.
The annotation is org.apache.felix.ipojo.handler.temporal.Requires and targets a field.
Attributes:
The JMX Handler allows exposing an instance as a JMX MBean. To configure the JMX handler directly from your code, three annotations are provided. They are in the org.apache.felix.ipojo.handlers.jmx package
The @org.apache.felix.ipojo.handlers.jmx.Config (@Config if the package it correctly imported) annotation is a type annotation (so placed on the class element. This annotation indicates that the instance will be exposed as an MBean. This annotation supports:
true to use MOSGi. Otherwise, the MBean will be exposed in the MBean Platform Server (default: false).package-name:factory-name:instance-name)package-name)instance-name).The @org.apache.felix.ipojo.handlers.jmx.Property (@Property) annotation is a field annotation indicating that the field is exposed in the MBean. The supported attributes are:
r (read only) and w (read and write). By default, properties are in read-only mode.The @org.apache.felix.ipojo.handlers.jmx.Method (@Method) annotation is a method annotation indicating that the method is exposed in the MBean. Only one attribute can be customized:
It is possible to defines component type both in the metadata file (in XML) and by using annotation. However, if a component type defined by using annotations has the same name than a type define in the XML file, the XML descriptor override the annotation defined type. However, a warning message is launched during the manipulation.
The @Instantiate annotation allows creating an instance, but this declaration is limited:
To define instances, you should use the XML descriptor. Instance can refer to annotated types by referring to their names.
<instance component="ipojo.example.hello.impl.HelloImpl"/> <instance component="AnnotedHelloClient"/> |
External handlers can provides their own annotations. Using these annotations just requires to add them to your build path. To external handlers annotations, please refer to the external handler documentation.