一、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的更多相关文章

  1. Analysis of container and Injection in Java, their history and future.

    Container: 发展历程: 2000 年的时候 FreeBSD 开发了一个类似于 chroot 的容器技术 Jails,这是最早期,也是功能最多的容器技术.Jails 英译过来是监狱的意思,这个 ...

  2. 严重: 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 ...

  3. 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 ...

  4. Container 、Injection

    Container: Linux容器作为一类操作系统层面的虚拟化技术成果,旨在立足于单一Linux主机交付多套隔离性Linux环境.与虚拟机不同,容器系统并不需要运行特定的访客操作系统.相反,容器共享 ...

  5. 为什么会出现container、injection技术?发展历史及未来发展趋势

    container 原因: 随着软件开发的发展,相比于早期的集中式应用部署方式,现在的应用基本都是采用分布式的部署方式,一个应用可能包含多种服务或多个模块,因此多种服务可能部署在多种环境中,如虚拟服务 ...

  6. 关于 Container ,Injection

    1.容器的历史 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的 ...

  7. container and Injection

    1.容器的历史 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的 ...

  8. 11. Container With Most Water (JAVA)

    Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...

  9. Java tomcat启动失败(Servlet3.0 Web Project):A child container failed during start

    Tomcat启动失败,失败全部信息: 五月 , :: 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetProper ...

随机推荐

  1. ASP.NET MVC 枚举类型转LIST CONTROL控件

    在实际应用中,我们经常会用到下拉框.多选.单选等类似的控件,我们可以统称他们为List Control,他们可以说都是一种类型的控件,相同之处都是由一个或一组键值对的形式的数据进行绑定渲染而成的. 这 ...

  2. idea构建maven多项目web架构

    1.新建一个maven项目作为顶级module,可以使用模板quickstart模板,在生成pom.xml中添加一些子项目都会用到的依赖,apache-commons,guava等.因为是顶级modu ...

  3. [ZZ] 用matlab绘制箭头

    用matlab绘制箭头 http://npfeng900.blog.163.com/blog/static/14456108201221922944998/ 用matlab绘制箭头1 用matlab绘 ...

  4. 关于使用colorbox加载html页面的一些问题

    ColorBox是一个基于jQuery 1.3 的轻量级,自定义灯箱插件,功能非常强大,支持图片,图片组,ajax,inline和iframed内容,灯箱样式完全由用户控制,可自定义CSS样 式,不需 ...

  5. Ubuntu16.04更新源

    首先说说为什么要更新源,我是在docker容器中修改配置文件时有所需要,要用到vim,但是会报错.找不到需要的包. 网上都会说要先更新:apt-get update 但是超级慢有没有,我更新了4小时, ...

  6. 文件下载及header方法介绍

    文件下载: 文件下载是浏览器一个功能,我们用php,把一个文件转化成浏览器无法解析的文件,浏览器就会认为,他是下载文件或无效文件. 主要依靠:header() 函数: header() 方法用于客户端 ...

  7. 20175311 2018-2019-2 《Java程序设计》第四周学习总结

    20175311 2018-2019-2 <Java程序设计>第4周学习总结 教材学习内容总结 这一周在上一周的基础上更进一步,主要学习了子类的继承.super关键字的用法含义.继承与多态 ...

  8. note10 元组

    元组 Tuple +元组即不可变(immutable)列表 除了可改变列表内容的方法外,其他方法均适用于元组 因此,索引.切片.len().print等均可用 但是,appeng.extend.del ...

  9. linux上安装mysql5.6

    CentOS-6.6+MySQL-5.6 部署环境操作系统:CentOS-6.6-x86_64-bin-DVD1.isoMySQL 版本:mysql-5.6.26.tar.gz操作用户:root系统 ...

  10. 数据库新增“自动添加”类字段 auto_now_add 如何不影响之前数据

    django 中的模版为例:time = models.DateTimeField('创建时间', auto_now_add=True)这样显然是不行的.那么.我们可以考虑先给前面数据一个默认值迁移一 ...