【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】--Contexts and Dependency Injection(上下文和依赖注入) 02
- 【Java EE】--Contexts and Dependency Injection (上下文和依赖注入)01
- 【Java EE】--Contexts and Dependency Injection (上下文与依赖注入)04
- 【Java EE】--Contexts and Dependency Injection (上下文与依赖注入)05
- 设计模式:反向控制和依赖注入(Inversion of control and Dependency injection)
- CDT(Contexts And Dependency Injection)
- Contexts and Dependency Injection for the Java EE Platform(CDI,JSR-299)
- red5 Scopes and Contexts 作用域 上下文
- Inversion of control and Dependency injection
- Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern(中文版)
- Dependency Injection in ASP.NET Web API 2 (在web api2 中使用依赖注入)
- A fast dependency injector for Android and Java Dagger (依赖注入)使用的一些个人总结
- Inversion of Control Containers and the Dependency Injection pattern
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(八) Unity Dependency Injection and Interception
- Factories,Service Locators and Dependency Injection
- Inversion of Control (IoC) and Dependency Injection
- (You Can Hack It, Architecture and Design) => { Dependency Injection; }
- Inversion of Control Containers and the Dependency Injection pattern
- Inversion of Control Containers and the Dependency Injection pattern
- Inversion of Control Containers and the Dependency Injection pattern