iPOJO defines several annotations to help developer to define their components. This page presents an example of iPOJO annotation and describes provided annotations. Getting iPOJO 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. In Eclipse: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). In Maven:Add the following dependency: <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.ipojo.annotations</artifactId> <version>1.0.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> In Ant :Just add the org.apache.felix.ipojo.annotations jar file in your class path. An example of usage:To illustrate annotations usage, let taking the tutorial example. In this tutorial, there are two components:
Hello Service ProviderThe 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; } } Hello Service ConsumerThe Hello Service Consumer use more annotations. First it used the
component annotation. To defines its "immediate" behavior, it add the
'immediate' attribute. 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; } } Defined AnnotationsThis section lists defined annotations and how to use them. @ComponentGoal: Defines a component type
@ProvidesGoal: Defines that the component type provide services
Note: "SERVICE" means OSGi service factory. @RequiresGoal: Defines a service dependency
@ServicePropertyGoal: Defines a service property
@PropertyGoal: Defines a property
note: if another property with the same name is defined the method or the field is added to the existing property @BindGoal: Defines a bind method
@UnbindGoal: Defines an unbind method
@ValidateGoal: defines a validate lifecycle callback @InvalidateGoal: defines a validate lifecycle callback Temporal Dependencies (external handler)The temporal dependency handler is an external handler. However, it
can be used with an annotation defined in the iPOJO annotations jar
file.
Exposing instances as a JMX MBean (external handler) [New in the 1.1.0-SNAPSHOT version]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:
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:
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:
Metadata file and annotation mergeIt 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. Instance creationAnnotation can only be used to define component type. To define instances, you need to 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"/> Using Custom AnnotationsExternal 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. |
OverviewGetting Started
User GuideToolsDeveloper Guide
Misc & Contact
|