/This is the third installment of a series of articles describing the current status of the Web Beans specification. You can find the first installment here and the second installment here./
So far, we've seen plenty of examples of components declared using annotations. However, there are a couple of occasions when we can't use annotations to define the component:
- when the implementation class comes from some pre-existing library
- when there should be multiple components with the same implementation class
In either of these cases, Web Beans gives us two options:
- write a /resolver method/
- declare the component using XML
In a future installment we'll talk more about all the crazy kinds of things we can do with resolver methods. First, let's just prove that Web Beans is not entirely annotation-centric.
We can declare a component in web-beans.xml:
<component> <class>java.util.Date</class> </component>
Then an instance of Date could be injected by another component:
@In Date date;
By default, any component declared in XML has the component type @Component. We can use a custom component type:
<component> <class>java.util.Date</class> <type>org.jboss.test.Mock</type> </component>
We can override the default component name:
<component> <class>java.util.Date</class> <name>now</name> </component>
Or we can specify a scope for the component:
<component> <class>java.util.Date</class> <scope>javax.webbeans.SessionScoped</scope> </component>
We can even specify binding annotations using XML, to distinguish between multiple components with the same implementation class:
<component> <class>java.util.Date</class> <name>now</name> <binding>org.jboss.eg.Now</binding> </component> <component> <class>java.util.Date</class> <name>logInTime</name> <scope>javax.webbeans.SessionScoped</scope> <binding>org.jboss.eg.LogInTime</binding> </component> <component> <class>java.util.Date</class> <name>startupTime</name> <scope>javax.webbeans.ApplicationScoped</scope> <binding>org.jboss.eg.StartupTime</binding> </component>
Where @Now, @LogIn and @Startup are binding annotations used at the injection points:
@In @Now Date currentTime; @In @LogInTime Date loginTime @In @StartupTime Date startupTime
As usual, a component may support multiple binding annotations:
<component> <class>org.jboss.eg.AsynchronousChequePaymentProcessor</class> <binding>org.jboss.eg.PayByCheque</binding> <binding>org.jboss.eg.Asynchronous</binding> </component>
Eventually, Web Beans will also support XML-based configuration of component properties, using literal or EL values, something like this:
<component> <class>org.jboss.framework.Captcha</class> <property name="strategy">math2digit</property> <property name="language">#{user.language}</property> </component>
However, we've not yet worked out all the details of this. In particular, I would love to support a namespaced approach to component configuration, as seen in Seam or Spring 2.0.