您的位置:首页 > 编程语言 > Java开发

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

2017-05-16 10:38 661 查看

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;
...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java ee