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 ...
随机推荐
- pycharm2018.11最新激活码
第一步:先按下键盘的win + r ,然后复制c:\windows\system32\drivers\etc粘贴到对话框回车打开文件管理器: 第二步:打开hosts文件,将0.0.0.0 accoun ...
- Laravel笔记--Eloquent 模型
Eloquent 模型 默认继承use Illuminate\Database\Eloquent\Model类. 数据表名称与模型名称约定: 数据库的表名一般使用“蛇形命名法”命名.蛇形命名法要求单词 ...
- [蓝桥杯]PREV-23.历届试题_数字游戏
问题描述 栋栋正在和同学们玩一个数字游戏. 游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈.栋栋首先说出数字1.接下来,坐在栋栋左手边的同学要说下一个数字2.再下面的一个同学要从上一个同学说的数 ...
- 分布式-JOB(XXL-Job)
为什么使用xxl-job,不使用qz: 缺少补偿机制 不支持集群 不支持路由策略 统计任务执行 平台管理 监控,报警邮箱 幂等性:一次请求和多次请求得到相同的结果,不会因为多次的请求,导致最后的数据不 ...
- python-setuptool安装
安装setuptools时报error: ”RuntimeError: Compression requires the (missing) zlib module“ 解决办法: yum安装zlib和 ...
- struct2depth 记录
把效果图放在前面 03.28 handle_motion False architecture simple joint_encoder False depth_normalization ...
- python css选择器
css 选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- hustOJ 添加 golang 支持
hustOJ 支持Go1.7.1 是否为docker环境不重要,此处所有内容均为docker中执行,普通主机手动安装则更加如此 建议在docker中执行,因为OJ为严控恶意权限,judge_clien ...
- Oracle中 to_date和to_char用法
to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...
- memcached—Java操作Memcached实例
前面博客介绍了如何在Windows操作系统中安装Memcached,总结一下如何使用Java操作Memcached实例: 代码一: package com.ghj.packageoftool; imp ...