Java injection

Java EE提供了注入机制,使您的对象能够获取对资源和其他依赖项的引用,而无需直接实例化它们。通过使用将字段标记为注入点的注释之一来装饰字段或方法,可以在类中声明所需的资源和其他依赖项。然后容器在运行时提供所需的实例。注入简化了代码并将其与依赖项的实现分离。

资源注入

通过资源注入,您可以将JNDI名称空间中可用的任何资源注入任何容器管理的对象,例如servlet,企业bean或托管bean。例如,您可以使用资源注入来注入JNDI名称空间中可用的数据源,连接器或自定义资源。

用于引用注入实例的类型通常是一个接口,它将您的代码与资源的实现分离。

例如,以下代码注入一个数据源对象,该对象提供与GlassFish Server附带的默认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返回类型开头,并且只有一个参数。

的@Resource注释是在javax.annotation包装和在JSR 250(通用注解用于Java平台)被定义。资源注入按名称解析,因此它不是类型安全的:资源对象的类型在编译时是未知的,因此如果对象的类型及其引用不匹配,则可能会出现运行时错误。

依赖注入

依赖注入使您可以将常规Java类转换为托管对象,并将它们注入任何其他托管对象。使用依赖注入,您的代码可以声明对任何托管对象的依赖性。容器在运行时自动在注入点提供这些依赖项的实例,并且还为您管理这些实例的生命周期。

Java EE中的依赖注入定义了范围,这些范围确定容器实例化和注入的对象的生命周期。例如,仅响应单个客户端请求(例如货币转换器)的托管对象与在会话中处理多个客户端请求(例如购物车)所需的托管对象具有不同的范围。

您可以通过将范围分配给常规类来定义稍后可以注入的托管对象(也称为托管bean):

@javax.enterprise.context.RequestScoped
public class CurrencyConverter { ... }

使用javax.inject.Inject注释注入托管bean; 例如:

public class MyServlet extends HttpServlet {
    @Inject CurrencyConverter cc;
    ...
}

与资源注入相反,依赖注入是类型安全的,因为它按类型解析。要将代码与托管bean的实现分离,可以使用接口类型引用注入的实例,并让托管bean实现该接口。

资源注入与依赖注入的主要区别

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/X_Teddy/article/details/88384387