/这是描述 Web Beans 规范当前状态的一系列文章的第三部分。您可以在这里找到第一部分 here 和第二部分 here./
到目前为止,我们已经看到了许多使用注解声明组件的示例。然而,在以下两种情况下,我们无法使用注解来定义组件
- 当实现类来自某个现有的库时
- 当应该有多个具有相同实现类的组件时
在这两种情况中,Web Beans 给我们两种选择
- 编写一个 /resolver 方法/
- 使用 XML 声明组件
在未来的某个版本中,我们将更详细地讨论我们可以用 resolver 方法做的一些疯狂的事情。首先,让我们证明 Web Beans 并非完全以注解为中心。
我们可以在web-beans.xml:
<component> <class>java.util.Date</class> </component>
中声明一个组件Date的实例可以被另一个组件注入
@In Date date;
默认情况下,任何在 XML 中声明的组件都具有组件类型@Component。我们可以使用自定义组件类型
<component> <class>java.util.Date</class> <type>org.jboss.test.Mock</type> </component>
我们可以重写默认的组件名称
<component> <class>java.util.Date</class> <name>now</name> </component>
或者我们可以指定组件的作用域
<component> <class>java.util.Date</class> <scope>javax.webbeans.SessionScoped</scope> </component>
我们甚至可以使用 XML 指定绑定注解,以区分具有相同实现类的多个组件
<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>
其中@Now, @LogIn和@Startup是在注入点使用的绑定注解
@In @Now Date currentTime; @In @LogInTime Date loginTime @In @StartupTime Date startupTime
与往常一样,一个组件可能支持多个绑定注解
<component> <class>org.jboss.eg.AsynchronousChequePaymentProcessor</class> <binding>org.jboss.eg.PayByCheque</binding> <binding>org.jboss.eg.Asynchronous</binding> </component>
最终,Web Beans 也将支持使用 XML 配置组件属性,使用字面值或 EL 值,如下所示
<component> <class>org.jboss.framework.Captcha</class> <property name="strategy">math2digit</property> <property name="language">#{user.language}</property> </component>
然而,我们尚未解决所有这些细节。特别是,我希望支持类似 Seam 或 Spring 2.0 中的命名空间方法来配置组件。