【Java EE】--Contexts and Dependency Injection(上下文和依赖注入) 03

bean作为可注入对象

注入的概念已经成为Java技术的一部分。 由于引入了Java EE 5平台,注释使得可以将资源和其他类型的对象注入到容器管理的对象中。 CDI使得可以注入更多种类的对象并将其注入到不是容器管理的对象中。

可以注入以下几种对象:

  • (几乎)任何Java类
  • 会话bean
  • Java EE资源:数据源,Java消息服务主题,队列,连接工厂等
  • 持久性上下文(Java Persistence API EntityManager对象)
  • 生产者领域
  • 由生产者方法返回的对象
  • Web服务引用
  • 远程企业bean引用

例如,假设您使用返回字符串的方法创建一个简单的Java类:

package greetings;

public class Greeting {
    public String greet(String name) {
        return "Hello, " + name + ".";
    }
}

这个类变成一个bean,然后你可以注入另一个类。 这种bean没有暴露在这种形式的EL。Giving Bean EL Names解释了如何使一个bean可以访问EL。

使用限定词(Qualifiers)

您可以使用限定符来提供特定bean类型的各种实现。 限定符是您应用于bean的注释。 限定符类型是定义为@Target({METHOD,FIELD,PARAMETER,TYPE})和@Retention(RUNTIME)的Java注释。

例如,您可以声明一个@Informal限定符类型并将其应用于扩展了Greeting类的另一个类。 要声明此限定符类型,您将使用以下代码:

package greetings;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target;

import javax.inject.Qualifier;

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Informal {}

然后,您可以定义扩展Greeting类并使用此限定符的bean类:

package greetings;

@Informal
public class InformalGreeting extends Greeting {
    public String greet(String name) {
        return "Hi, " + name + "!";
    }
}

现在可以在应用程序中使用该bean的两个实现。

如果您定义一个没有限定符的bean,那么该bean自动具有限定符@Default。 未注释的Greeting类可以声明如下:

package greetings;

import javax.enterprise.inject.Default;

@Default
public class Greeting {
    public String greet(String name) {
        return "Hello, " + name + ".";
    }
}

注入bean

为了使用您创建的bean,您将它们注入另一个可以由应用程序(如JavaServer Faces应用程序)使用的另一个bean。 例如,您可以创建一个名为Printer的bean,您可以在其中注入一个Greeting beans:

import javax.inject.Inject;

public class Printer {

    @Inject Greeting greeting;
    ...
}

该代码将@Default Greeting实现注入到bean中。 以下代码注入@Informal实现:

import javax.inject.Inject;

public class Printer {

    @Inject @Informal Greeting greeting;
    ...
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值