编程语言
首页 > 编程语言> > Java程序员修炼之道 人民邮电出版社 吴海星译

Java程序员修炼之道 人民邮电出版社 吴海星译

作者:互联网

前言

第一部分:用java 7做开发 第一章:初始Java 7 第二章:新I/O 第二部分:关键技术 第三章:依赖注入 知识注入:理解IoC和DI
  1. 依赖注入(控制反转的一种形式).简言之,适用DI技术可以让对象从别处得到依赖项,而不是由它自己来构造.Java DI的官方标准JSR-330,JSR-330的参考实现(RI)Guice 3---一个众所周知的轻量,精巧的DI框架.
  2. 对象关系映射(Object Relational Mapping,ORM)框架,比如Hibernate...
  3. 控制反转
    1. 使用IoC,这个"中心控制"的设计原则会被反转过来.调用者的代码处理程序的执行顺序,而程序逻辑则被封装在接收调用的子流程中.IoC也被成为好莱坞原则("不要给我们打电话,我们会打给你".好莱坞经纪人总是给人打电话,而不让别人打给他们!),其思想可以归结为会有另一段代码拥有最初的控制线程,并且由它来调用你的代码,而不是由你的代码调用它.
    2. 程序的主控被反转了,将控制权从应用逻辑中转移到GUI框架.
    3. IoC有几种不同的实现,包括工厂模式,服务定位器模式,当然,还有依赖注入.这一术语最初由Martin Fowler在"控制反转容器和依赖注入模式"中提出.
    4. 从字面上来看,IoC是指一种机制,使用这种机制的用例很多,实现方式也很多.DI只是其中一种具体用例的具体实现方式.但因为DI非常流行,所以人们经常误以为IoC就是DI,并且认为DI这种叫法比IoC更贴切.
  4. 依赖注入
    1. 依赖注入是IoC的一种特定形态,是指寻找依赖项的过程不在当前执行代码的直接控制之下.可以把IoC容器看做运行时环境.java中为依赖注入提供的容器有Guice,Spring和PicoContainer.
    2. 把依赖项注入对象的方法有很多种.可以用专门的DI框架,但也可以不这么做!显式地创建对象实例(依赖项)并把他们传入对象中也可以和框架注入做的一样好.
  5. 转成DI
    1. 把不用IoC的代码变成使用工厂(或服务定位器)模式的代码,再变成使用DI的代码.在这些转变之后有一个共同的关键技术,即面向接口编程.使用面向接口编程,甚至可以在运行时更换对象.
    2. 打个比方,DI框架就是把你的代码抱起来的运行时环境,在你需要时为你注入依赖项.DI框架的优势在于它可以随时随地为你的代码提供依赖项.因为框架中有IoC容器,在运行时,你的代码需要的所有依赖项都会在哪里准备好.
    3. 尽管JSR-330注解可以在方法上注入依赖项,但通常志勇于构造方法或set方法中.
    4. 新的DI标准化方式(JSR-330)就是要解决这个问题.它对大多数java DI框架的核心能力做了很好的汇总.
  6. java中标准化的DI
    1. JSR-330(javax.inject)规范.倡导java se的DI标准化
    2. java ee中的DI标准化情况如何?java企业应用从JEE 6开始构建了自己的依赖注入体系(即CDI),由JSR-299(java ee平台中的上下文及依赖注入)规范确定,你可在http://jcp.org/中搜索JSR-299了解其详细信息.简言之,JSR-299构建在JSR-330基础之上,旨在为企业应用提供标准化的配置.
    3. 警告:实际上,代码迁移并不容易.一旦你的代码用到了仅由特定ID框架支持的特性,就不太可能拜托这一框架了.尽管javax.inject包提供了常用DI功能的子集,但是你可能需要适用更高级的DI特性.正如你想象的那样,对于哪些特性应该作为通用的标准也是众说纷纭,很难统一.虽然现状不尽如人意,但java毕竟朝DI框架的标准化方向迈出了一步.
    4. javax.inject包只是提供了一个接口和几个注解类型,这些都会被遵循JSR330标准的各种DI框架实现.也就是说,除非你在创建与JSR-330兼容的IoC容器(如果如此,想你致敬),通常不用自己实现它们.
    5. javax.inject包:这个包志明了获取对象的一种方式,与传统的构造方法,工厂模式和服务器定位器墨仕(比如JNDI)等相比,这种方式的可重用性,可测试性和可维护性都的到了极大提升.这种方式成为依赖注入,对于大多数非小型应用程序都很有帮助.
    6. @Inject注解
      1. 规范中规定向构造器注入的参数数量为0或多个,所i在不含参数的构造器上使用@Inject也是合法的.警告:因为JRE无法决定构造器注入的优先级,所以规范中规定类中只能有一个构造器带@Inject注解.
      2. @Inject注解方法,运行时可注入参数的数量也可以是0或多个.但适用参数注入的方法不能声明为抽象方法,也不能声明其自身的类型参数.
      3. 提示:向构造器中注入的通常仕类中必需的依赖项,而对于非必需的依赖项,通常仕在set方法上注入.比如已经给出了默认值的属性就是非必需的依赖项.这一最佳时间已经成了惯例.
      4. 可以直接在属性上注入,只要他们不是final,虽然这样做简单直接,但你最好不要用,因为这样可能会让单元测试更加困难.
    7. @Qualifier注解
      1. 支持JSR-330规范的框架要用注解@Qualifier限定(标识)要注入的对象.
      2. 如果你用过由框架实现的限定符,应该指导要创建一个@Qualifier实现必需遵循如下规则:
        1.     必需标记为@Qualifier和@Retention(RUNTIME),以确保该限定注解在运行时一直有效.
        2. 通常还应该加上@Documented注解,这样该实现就能加到API的公共javadoc中了.
        3. 可以有属性
        4. @Target注解可以限定其使用范围;比如将其适用范围限制为属性,而不是限定为属性的默认值和方法中的参数.
      3. JSR-330规范中要求所有IoC容器都要提供一个默认的@Qualifier注解:@Named
    8. @Named注解
      1. @Named仕一个特别的@Qualifier注解,借助@Named可以用名字标明要注入的对象.将@Named和@Inject一起使用,符合制定名称并且类型正确的对象会被注入
    9. @Scope注解
      1. @Scope注解用于定义注入器(即IoC容器)对注入对象的重用方式.JSR-330规范中明确了如下集中默认行为.
        1.      如果没有声明任何@Scope注解接口的实现,注入器应该创建注入对象并且仅使用该对象一次.
        2. 如果声明了@Scope注解接口的实现,那么注入对象的生命周期由所声明的@Scope注解实现决定.
        3. 如果注入对象在@Scope实现中要由多个线程使用,则需要保证注入对象的线程安全性.  
        4. 如果某个磊尚声明了多个@Scope注解,或声明了不受支持的@Scope注解,IoC容器应该抛出异常.
      2. DI框架管理注入对象的生命周期时不会超出这些默认行为划定的界限.因为大家工人的通用@Scope实现只有@Singleton一个,所以JSR-330规范中仅确定了它这么一个标准的生命周期注解.
    10. @Singleton注解
      1. 在需要注入一个不会改变的对象时,就要用@Singleton
      2. 请谨慎使用单例模式,因为它有时候会变成反模式.
      3. 大多数DI框架都将@Singleton作为注入对象的默认生命周期,无需显式声明.
    11. 接口Prvoider<T>
      1. 如果你想对由DI框架注入代码中的对象拥有更多的控制权,可以要求DI框架将Prvoider<T>接口实现注入对象.控制对象的好处在于:
        1.      可以获取该对象的多个实例.
        2. 可以延迟获取该对象(延迟加载)
        3. 可以打破循环依赖
        4. 可以定义作用域,能在比整个被加载的应用小的作用域中查找对象. 
  7. java中的DI参考实现:Guice 3:这一节看晕了,待以后琢磨
    1. Guice 3是JSR-330规范的完整参考实现.   "为了让注入器创建对象关系图,需要创建声明各种绑定关系的模块,其中绑定是用来明确要注入的具体实现类的." 
    2. 水手绳结:Guice的各种绑定
  8. 小结:IoC是个复杂的概念.但通过对工厂和服务定位器模式的探讨你能了解基本IoC实现仕如何工作的.工厂模式有助于你理解DI以及DI给代码带来的好处.JSR-330不仅仅是统一DI通用功能的重要标准,它还提供了你需要了解的幕后规则及限制.通过研究标准DI注解集,你会更加欣赏不同DI框架对规范的实现,因而可以更有效地使用他们.
第四章:现代并发    

标签:java,DI,对象,人民邮电出版社,程序员,线程,Path,Java,方法
来源: https://www.cnblogs.com/yb-ken/p/15111430.html