注入(Injection)

news/2024/7/4 1:09:13

注入(Injection)是:

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

注入(Injection)的用处:

  依赖注入:

    控制反转用于解耦,解的究竟是谁和谁的耦?这是我在最初了解依赖注入时候产生的第一个问题。

          下面我引用Martin Flower在解释介绍注入时使用的一部分代码来说明这个问题。

public class MovieLister {
    private MovieFinder finder;

    public MovieLister() {
        finder = new MovieFinderImpl();
    }
    
    public Movie[] moviesDirectedBy(String arg) {
        List allMovies = finder.findAll();
        for (Iterator it = allMovies.iterator(); it.hasNext();) {
            Movie movie = (Movie) it.next();
            if (!movie.getDirector().equals(arg)) it.remove();
        }
        return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);
    }
    ...
}
public interface MovieFinder {
    List findAll();
} 

    我们创建了一个名为MovieLister的类来提供需要的电影列表,它moviesDirectedBy方法提供根据导演名来搜索电影的方式。真正负责搜索电影的是实现了MovieFinder接口的MovieFinderImpl,我们的MovieLister类在构造函数中创建了一个MovieFinderImpl的对象。

    目前看来,一切都不错。但是,当我们希望修改finder,将finder替换为一种新的实现时(比如为MovieFinder增加一个参数表明Movie数据的来源是哪个数据库),我们不仅需要修改MovieFinderImpl类,还需要修改我们MovieLister中创建MovieFinderImpl的代码。

    这就是依赖注入要处理的耦合。这种在MovieLister中创建MovieFinderImpl的方式,使得MovieLister不仅仅依赖于MovieFinder这个接口,它还依赖于MovieListImpl这个实现。 这种在一个类中直接创建另一个类的对象的代码,和硬编码(hard-coded strings)以及硬编码的数字(magic numbers)一样,是一种导致耦合的坏味道,我们可以把这种坏味道称为硬初始化(hard init)。同时,我们也应该像记住硬编码一样记住,new(对象创建)是有毒的。

    Hard Init带来的主要坏处有两个方面:1)上文所述的修改其实现时,需要修改创建处的代码;2)不便于测试,这种方式创建的类(上文中的MovieLister)无法单独被测试,其行为和MovieFinderImpl紧紧耦合在一起,同时,也会导致代码的可读性问题(“如果一段代码不便于测试,那么它一定不便于阅读。”)。

  资源注入:

 

    通过资源注入,您可以将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平台)被定义。资源注入按名称解析,因此它不是类型安全的:资源对象的类型在编译时是未知的,因此如果对象的类型及其引用不匹配,则可能会出现运行时错误。

 

 

转载于:https://www.cnblogs.com/bbeb/p/10490693.html


http://www.niftyadmin.cn/n/529812.html

相关文章

javaScript 测试下载速度

<script>function init(){var timer1new Date().getTime();var imgnew Image();img.src"http://www.netfront.net/speedtest/images/photo" parseInt(Math.round(Math.random()*5)1) ".bmp?" Math.random();img.οnlοadfunction(){sizeimg.file…

CMDB学习之六 --客户端请求测试,服务端api优化

客户端使用agent 请求测试&#xff0c;agent使用的POST 请求&#xff0c;使用requests模块 本地采集&#xff0c;汇报服务端 #!/usr/bin/env python # -*- coding:utf-8 -*- from .base import BaseHandler from ..plugins import get_server_info import requests import json…

FLEX杂谈——flex就业现状与学习标准分析

写下这个标题大家一定以为我是只FLEX老鸟,不然不敢这么高声说话,而且是在JAVAEYE里.我知道JE里高手很多.有很多人都对FLEX有秀深的见底,写此文是为了回答一些朋友对我的提问. 有很多想转行的开发者都问我这样几个问题:现在招FLEX的公司多吗?搞FLEX开发工资高吗?怎么样才算是F…

php的 提示无效字符,PHP无效字符错误

运行此代码时出现此错误&#xff1a;致命错误&#xff1a;test.php中带有消息’无效字符错误’的未捕获异常’DOMException’&#xff1a;29堆栈跟踪&#xff1a;#0 test.php(29)&#xff1a;DOMDocument-> createElement(‘1OhmStable’,’a’)#1 { main}在第29行的test.ph…

学习笔记66—兴趣阅读之哲学(佛学)

摘要: 题记&#xff1a;不阅读的人只能过一种人生&#xff0c;参与阅读的人能过成百上千的人生。&#xff08;PS&#xff1a;每读完一本书&#xff0c;一定要写读后感&#xff01;&#xff01;&#xff01;&#xff09;转载于:https://www.cnblogs.com/hechangchun/p/10495554.…

php 单行日历,PHP完整的日历类(CLASS)

class Calendar{/** www.jb51.net修正版*/var $YEAR,$MONTH,$DAY;var $WEEKarray("星期日","星期一","星期二","星期三","星期四","星期五","星期六");var $_MONTHarray("01">"一月&…

ES6小技巧笔记

1:去重数组 let a [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]let b [...new Set(a)]console.log(2222222222, b) // [1, 2, 3, 4, 5]2:合并数组let arr1 [a, b]let arr2 [c]let arr3 [d, e]let arr4 arr1.concat(arr2, arr3)let arr5 [...arr1, ...arr2, ...arr3]console.log…

php实现hmac sha1,PHP:如何生成字符串的hmac SHA1签名?

我正在尝试使用PHP连接到API并需要正确的签名.他们的文件逐字记录&#xff1a;The command string needs to hashed using HMAC SHA-1 hashing algorithmagainst the API secret key. The resulting byte array should be Base64encoded in UTF-8 format so that it can be pas…