/这是描述 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 中的命名空间方法来配置组件。


返回顶部