Container and Injection in Java
一、Container
1、为什么使用Container
通常,瘦客户端多层应用程序很难编写,因为它们涉及处理事务和状态管理、多线程、资源池和其他复杂的低级细节的复杂代码行。基于组件和独立于平台的JavaEE体系结构使应用程序易于编写,因为业务逻辑被组织成可重用的组件。此外,JavaEE服务器以容器的形式为每种组件类型提供底层服务。因为您不需要自己开发这些服务,所以您可以自由地集中精力解决手头的业务问题。
2、Container Services
容器是组件与支持组件的低级平台特定功能之间的接口。在执行该组件之前,必须将Web、企业bean或应用程序客户端组件组装到JavaEE模块中并部署到其容器中。
组装过程包括为JavaEE应用程序中的每个组件和JavaEE应用程序本身指定容器设置。容器设置自定义JavaEE服务器提供的底层支持,包括安全性、事务管理、Java命名和目录接口(JNDI)API查找和远程连接等服务。以下是一些亮点。
JavaEE安全模型允许您配置Web组件或企业bean,以便系统资源仅由授权用户访问。
JavaEE事务模型允许您指定组成单个事务的方法之间的关系,以便将一个事务中的所有方法视为一个单元。
JNDI查找服务为企业中的多个命名和目录服务提供了统一的接口,以便应用程序组件可以访问这些服务。
JavaEE远程连接模型管理客户端和企业bean之间的低级通信。创建企业bean之后,客户端将调用方法,就像在同一虚拟机中一样。
因为JavaEE体系结构提供了可配置的服务,所以同一应用程序中的组件可以根据部署的位置而有所不同。例如,企业bean可以具有安全设置,允许它在一个生产环境中访问数据库数据,在另一个生产环境中访问另一个级别的数据库。
容器还管理不可配置的服务,如企业bean和servlet生命周期、数据库连接资源池、数据持久性和对JavaEE平台API的访问
3、Container Types

服务器和容器如下:
JavaEE服务器:JavaEE产品的运行时部分。JavaEE服务器提供EJB和Web容器。
EJB容器:为JavaEE应用程序管理企业bean的执行。企业bean及其容器运行在JavaEE服务器上。
Web容器:管理用于JavaEE应用程序的Web页面、servlet和一些EJB组件的执行。Web组件及其容器在JavaEE服务器上运行。
应用程序客户端容器:管理应用程序客户端组件的执行。应用程序客户端及其容器在客户端上运行。
applet容器:管理applet的执行。由Web浏览器和一起运行在客户端上的Java插件组成。
二、Injection
1、为什么使用Injection
JavaEE提供了注入机制,使对象能够获得对资源和其他依赖项的引用,而不必直接实例化它们。您可以通过用标记字段为注入点的注释之一来修饰字段或方法来声明类中所需的资源和其他依赖项。然后容器在运行时提供所需的实例。注入简化了代码,并将其与其依赖关系的实现分离。
2、资源注入
资源注入使您能够将JNDI命名空间中的任何可用资源注入任何容器托管对象,例如servlet、企业bean或托管bean。例如,可以使用资源注入JNDI命名空间中可用的数据源、连接器或自定义资源。
用于引用注入实例的类型通常是一个接口,它将代码与资源的实现分离开来。
例如,以下代码注入一个数据源对象,该对象提供与GlassFishServer附带的默认Apache Derby数据库的连接:
public class MyServlet extends HttpServlet {
@Resource(name="java:comp/DefaultDataSource")
private javax.sql.DataSource dsc;
...
}
除了前面示例中的基于字段的注入之外,还可以使用基于方法的注入来注入资源:
public class MyServlet extends HttpServlet {
private javax.sql.DataSource dsc;
...
@Resource(name="java:comp/DefaultDataSource")
public void setDsc(java.sql.DataSource ds) {
dsc = ds;
}
}
要使用基于方法的注入,setter方法必须遵循JavaBeans对属性名称的约定:方法名称必须以set,有一个void返回类型,并且只有一个参数。
3、依赖注入
依赖注入使您能够将常规Java类转换为托管对象,并将它们注入到任何其他托管对象中。使用依赖项注入,代码可以声明对任何托管对象的依赖关系。容器在运行时在注入点自动提供这些依赖项的实例,并为您管理这些实例的生命周期。
JavaEE中的依赖注入定义了作用域,这些作用域确定容器实例化和注入的对象的生命周期。例如,只需要响应单个客户端请求(例如货币转换器)的托管对象的作用域与在会话中处理多个客户端请求(例如购物车)所需的托管对象不同。
您可以定义托管对象(也称为托管bean),以后可以通过将作用域分配给常规类来注入这些对象:
@javax.enterprise.context.RequestScoped
public class CurrencyConverter { ... }
使用javax.inject.Inject注解注入托管bean;例如:
public class MyServlet extends HttpServlet {
@Inject CurrencyConverter cc;
...
}
与资源注入不同,依赖注入是类型,因为它按类型进行解析。要将代码与托管bean的实现分离,可以使用接口类型引用注入的实例,并让托管bean实现该接口。
4、资源注入与依赖注入的主要区别
表 资源注入和依赖注入之间的差异
| Injection Mechanism | Can Inject JNDI Resources Directly | Can Inject Regular Classes Directly | Resolves By | Typesafe |
| Resource Injection | Yes | No | Resource name | No |
| Dependency Injection | No | Yes | Type | Yes |
Container and Injection in Java的更多相关文章
- Analysis of container and Injection in Java, their history and future.
Container: 发展历程: 2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术.Jails 英译过来是监狱的意思,这个 ...
- 严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component
自己写了个最简单的springMVC项目练练手,没有用maven,在WebContent中新建了lib文件夹,将jar包复制到这里面,然后add to build path到项目里. 启动Tomcat ...
- Maven使用tomcat7-maven-plugin插件run时出现错误: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component
错误如下: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catal ...
- Container 、Injection
Container: Linux容器作为一类操作系统层面的虚拟化技术成果,旨在立足于单一Linux主机交付多套隔离性Linux环境.与虚拟机不同,容器系统并不需要运行特定的访客操作系统.相反,容器共享 ...
- 为什么会出现container、injection技术?发展历史及未来发展趋势
container 原因: 随着软件开发的发展,相比于早期的集中式应用部署方式,现在的应用基本都是采用分布式的部署方式,一个应用可能包含多种服务或多个模块,因此多种服务可能部署在多种环境中,如虚拟服务 ...
- 关于 Container ,Injection
1.容器的历史 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的 ...
- container and Injection
1.容器的历史 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的 ...
- 11. Container With Most Water (JAVA)
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...
- Java tomcat启动失败(Servlet3.0 Web Project):A child container failed during start
Tomcat启动失败,失败全部信息: 五月 , :: 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetProper ...
随机推荐
- ASP.NET MVC 枚举类型转LIST CONTROL控件
在实际应用中,我们经常会用到下拉框.多选.单选等类似的控件,我们可以统称他们为List Control,他们可以说都是一种类型的控件,相同之处都是由一个或一组键值对的形式的数据进行绑定渲染而成的. 这 ...
- delphi Parallel 之 TTask 初试
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- 谷歌浏览器添加JSON-handle插件
访问谷歌应用商店必须FQ,具体可安装谷歌访问助手:http://www.cnblogs.com/yangcx666/p/8783642.html 不想FQ的可以百度 "谷歌插件网" ...
- C#用反射实现两个类的对象之间相同属性的值的复制
在进行实体转换操作的时候如果需要在对两个实体之间两个属性字段差不多相同的类要进行一个互相的转换,我们要把a对象的所有字段的值都复制给b对象,我们只能用b.属性=a.属性来写,如果属性字段太多的话,就要 ...
- abstract class VS interface
关于抽象类 abstract class: 1. 抽象方法必须在抽象类中 2. 抽象类和抽象方法要用abstract 关键字修饰 3. 不可以用new 来实例化一个abstract类,因为调用抽象方法 ...
- python基础知识1---python相关介绍
阅读目录 一 编程与编程语言 二 编程语言分类 三 主流编程语言介绍 四 python介绍 五 安装python解释器 六 第一个python程序 七 变量 八 用户与程序交互 九 基本数据类型 十 ...
- [UE4]接口
一个椅子可以被抓起和放下,一扇门可以打开和关上.一个抽屉可以拉开和关上. 椅子.门.抽屉都可以用手拉,然后放下,但是它们的打开和关上的行为是不一样的,它们之间没有继承关系,没法共用“打开”和“关闭”的 ...
- amd显卡更新最新驱动鼠标顿卡的解决方法
测试了下游戏,很稳.方法:在卡顿的状态下打开RADEON设置,依次点击显示器→规格→覆盖,将支持HDCP选为禁用,按提示重启即可.
- 著名java博客
http://blog.csdn.net/net19880504/article/details/20807403
- 逆向工程vgenerator(二)
前言 接上篇,这一篇主要的工具类和工厂类,包括数据库方法.通用方法,三个工厂. 常量 /** *author vvxtoys *默认xml开头 *文档分隔 *默认方法名 */ package cc.v ...