`

Springjie接口注入

阅读更多
  Type1 接口注入
  
  我们常常借助接口来将调用者与实现者分离。如:
  public class ClassA {
  private InterfaceB clzB;
  public init() {
  Ojbect obj =
  Class.forName(Config.BImplementation).newInstance();
  clzB = (InterfaceB)obj;
  }
  ……
  }
  
  上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起赋予clzB.
  
  而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。
  
  这就是接口注入的一个最原始的雏形。
  
  而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成,如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表现形式。
  
  Apache Avalon是一个典型的Type1型IOC容器。
  
  Type2 构造子注入
  
  构造子注入,即通过构造函数完成依赖关系的设定,如:
  public class DIByConstructor {
  private final DataSource dataSource;
  private final String message;
  public DIByConstructor(DataSource ds, String msg) {
  this.dataSource = ds;
  this.message = msg;
  }
  ……
  }
  
  可以看到,在Type2类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构造方法,将其所需的依赖关系注入其中。
  
  PicoContainer(另一种实现了依赖注入模式的轻量级容器)首先实现了Type2类型的依赖注入模式。
  
  Type3 设值注入(用setter,getter设值)
  
  在各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得力于Spring框架的影响)。
  
  在笔者看来,基于设置模式的依赖注入机制更加直观、也更加自然。Quick Start中的示例,就是典型的设置注入,即通过类的setter方法完成依赖关系的设置。
  
  SpringFrameWork Developer’s Guide Version 0.6
  September 2, 2004 So many open source projects. Why not Open your Documents?
  
  几种依赖注入模式的对比总结
  
  接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
  
  Type2和Type3的依赖注入实现模式均具备无侵入性的特点。在笔者看来,这两种实现方式各有特点,也各具优势(一句经典废话?)。
  
  Type2 构造子注入的优势:
  
  1. “在构造期即创建一个完整、合法的对象”,对于这条Java设计原则,Type2无疑是最好的响应者。
  
  我的理解:就是你要通过一种方式来保证对象的引用完整性,type2选择了构造器的方式来实现。
  
  2. 避免了繁琐的setter方法的编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,更加易读。
  
  我的理解:使用构造方法就不需要每个属性都写set和get方法了,这样省去了很多的代码。
  
  3. 由于没有setter方法,依赖关系在构造时由容器一次性设定,因此组件在被创建之后即处于相对“不变”的稳定状态,无需担心上层代码在调用过程中执行setter方法对组件依赖关系产生破坏,特别是对于Singleton模式的组件而言,这可能对整个系统产生重大的影响。
  
  我的理解:使用构造器来实现,那么你需要一次对所有的属性都初始话,相对set方法来说,缺少了一些灵活性。
  
  4. 同样,由于关联关系仅在构造函数中表达,只有组件创建者需要关心组件内部的依赖关系。对调用者而言,组件中的依赖关系处于黑盒之中。对上层屏蔽不必要的信息,也为系统的层次清晰性提供了保证。
  
  我的理解: spring的这设计就是要屏蔽依赖关系,你只需要对接口编程,而不需要考虑依赖关系的实现。所以对调用者来说,依赖关系是处于黑盒当中。
  
  5. 通过构造子注入,意味着我们可以在构造函数中决定依赖关系的注入顺序,对于一个大量依赖外部服务的组件而言,依赖关系的获得顺序可能非常重要,比如某个依赖关系注入的先决条件是组件的DataSource及相关资源已经被设定。
  
  我的理解:关于顺序问题,我们来看以下两段代码:
  public DIByConstructor(DataSource ds, String msg) {
  this.dataSource = ds;
  this.message = msg;
  }
  public DIByConstructor(DataSource ds, String msg) {
  this.dataSource = ds;
  this.message = msg;
  }
  
  在本例中,顺序不太重要,但是如果message的初始化需要用到datasource 的话,那么就必须要先初始化datasource,所以相对来说,顺序就是确定了。
  
  Type3 设值注入的优势
  
  1. 对于习惯了传统JavaBean开发的程序员而言,通过setter方法设定依赖关系显得更加直观,更加自然。
  
  2. 如果依赖关系(或继承关系)较为复杂,那么Type2模式的构造函数也会相当庞大(我们需要在构造函数中设定所有依赖关系),此时Type3模式往往更为简洁。
  
  我的理解:依赖关系(或继承关系)较为复杂,指的是,属性较多,需要写很多的set和get方法。
  
  3. 对于某些第三方类库而言,可能要求我们的组件必须提供一个默认的构造函数(如Struts中的Action),此时Type2类型的依赖注入机制就体现出其局限性,难以完成我们期望的功能。
  
  可见,Type2和Type3模式各有千秋,而Spring、PicoContainer都对Type2和Type3类型的依赖注入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以Type2类型为主,辅之以Type3类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,Type3使用更加广泛。
分享到:
评论
1 楼 flyfx51 2012-03-22  
还是这文章!

相关推荐

    Spring 揭秘.pdf

    作者: 王福强 出版社: 人民邮电出版社 ----------------------------------------------- 没有教程似的训导,更多的是说故事般的娓娓道来,本书是作者在多年的工作中积累的第一手Spring框架使用经验的总结,深入...

    go 生成基于 graphql 服务器库.zip

    格奇尔根 首页 > 文件 > gqlgen是什么?gqlgen是一个 Go 库,用于轻松构建 GraphQL 服务器。gqlgen 基于 Schema 优先方法— 您可以使用 GraphQL Schema 定义语言来定义您的 API 。gqlgen 优先考虑类型安全— 您永远不应该看到map[string]interface{}这里。gqlgen 启用 Codegen — 我们生成无聊的部分,以便您可以专注于快速构建您的应用程序。还不太确定如何使用gqlgen?将gqlgen与其他 Go graphql实现进行比较快速启动初始化一个新的 go 模块mkdir examplecd examplego mod init example添加github.com/99designs/gqlgen到项目的 tools.goprintf '//go:build tools\npackage tools\nimport (_ "github.com/99designs/gqlgen"\n _ "github.com/99designs/gqlgen

    基于JAVA+SpringBoot+Vue+MySQL的社区物资交易互助平台 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:maven 数据库工具:navicat

    法研杯2021类案检索赛道三等奖方案源码+项目说明+数据.zip

    法研杯2021类案检索赛道三等奖方案源码+项目说明+数据.zip是一个专为计算机相关专业(如计科、信息安全、数据科学与大数据技术等)学生设计的宝贵学习资源。该压缩包包含了完整的项目源码、详细的项目说明文档以及用于训练和测试的数据集,旨在帮助参赛者深入理解并掌握类案检索的相关技术和方法。该项目通过实际案例,展示了如何运用自然语言处理和机器学习技术对法律案件进行智能检索和匹配。项目内容涵盖了从数据预处理、特征提取到模型训练和评估的全过程,为学习和研究类案检索技术提供了全面的参考。本项目不仅适合作为课程设计、期末大作业或毕设项目的参考,也是企业员工提升技能、进行实践操作的优质学习资料。通过实际操作和学习该项目,用户可以加深对类案检索技术的理解,并在实践中不断提升自己的技能水平。请注意,由于该资源包含完整的项目源码和数据集,下载和使用时请确保遵守相关法律法规和道德规范,尊重知识产权和隐私权。同时,建议用户在使用前仔细阅读项目说明文档,了解项目的整体架构和使用方法,以便更好地利用该资源进行学习和研究。

    基于Cesium实现的对倾斜摄影模型的单体化分层方案源码.zip

    本资源提供了基于Cesium实现的倾斜摄影模型单体化分层方案的完整源码,旨在帮助开发者深入理解并实践三维地理空间数据的处理与展示。通过Cesium平台,用户能够将倾斜摄影获取的高精度三维模型进行单体化和分层处理,实现对模型中每个独立元素的精细管理和交互操作。该资源适合具备一定计算机编程基础的学习者,特别是对Cesium感兴趣的学生、研究人员及GIS行业从业者。通过下载并学习这些源码,用户可以掌握倾斜摄影模型在Cesium中的加载、单体化以及分层显示等关键技术,进而提升自己在三维地理信息系统开发领域的技能水平。

    Go 的 PostgreSQL 驱动程序和工具包.zip

    Go 的 PostgreSQL 驱动程序和工具包 pgx - PostgreSQL 驱动程序和工具包pgx 是 PostgreSQL 的纯 Go 驱动程序和工具包。pgx 驱动程序是一个低级、高性能接口,它公开了 PostgreSQL 特定的功能,例如LISTEN/ NOTIFY和COPY。它还包括一个标准database/sql接口的适配器。工具包组件是一组相关的软件包,用于实现 PostgreSQL 功能,例如解析线路协议以及 PostgreSQL 与 Go 之间的类型映射。这些底层软件包可用于实现替代驱动程序、代理、负载均衡器、逻辑复制客户端等。示例用法package mainimport ( "context" "fmt" "os" "github.com/jackc/pgx/v5")func main() { // urlExample := "postgres://username:password@localhost:5432/database_name" conn, err := pgx.Connect(context.B

    C#ASP.NET中小型超市管理系统源码数据库 SQL2012源码类型 WinForm

    ASP.NET中小型超市管理系统源码 超市管理系统是专门为中小型超市打造的管理系统,可以方便管理时更加准确清晰的查看商品信息, 仓库出售与进货的信息,还有每一个部门员工的信息,也更加直观的体现出每一阶段的商品销售情况; 从而提高项目管理水平,实现了工作的协同化、提高了工作效率 二、功能介绍 1.1 UI Requirements界面要求 (1)界面美观,给用户一种很舒心的感觉。 (2)界面所体现出的功能清晰明了,让用户一目了然。 (3)界面的背景颜色搭配符合超市管理系统界面的设计理念。 1.2 UI Requirements界面要求 (1) 使用ADO.NET与数据库交互制作 (2) 使用Visual Studio设计窗体布局 (3) 使用提供的用控件快速开发 1.3 Development Environment 开发环境 (1) 开发工具:Visua

    毕设&课程作业_基于C#的易知仓库管理系统.zip

    计算机系毕业设计

    Go 编程教程的主列表、其撰写、其源代码以及其当前构建状态!.zip

    教程边缘TutorialEdge.net Go 教程 ‍‍欢迎来到 TutorialEdge Go 存储库!此 repo 的目标是能够跟踪所有 Go 教程及其各自的 github repo 位置和构建状态。这些将在 Go 最新版本发布时更新和运行。目录初学者教程中级教程高级教程DevOps项目数据格式并发教程挑战初学者教程这些教程主要针对那些希望提高对 Go 语言工作原理的基本理解的语言新手!教程标题 教程边缘 Github 构建状态 更新日期01 - Go 入门 阅读教程 TutorialEdge/getting-started-with-go 不适用02 - Go 基本类型教程 阅读教程 TutorialEdge/go-basic-types-tutorial 不适用03 - Go 复合类型教程 阅读教程 TutorialEdge/go-complex-types-tutorial 不适用04 - Go 函数教程 阅读教程 TutorialEdge/go-functions-tutorial 2019 年 3 月 27 日

    基于JAVA+SpringBoot+Vue+MySQL的敬老院管理系统 源码+数据库(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:maven 数据库工具:navicat

    基于LSB实现对水印图片,文字等信息的隐藏隐写和提取的DEMO源码(功能包括嵌入水印,提取水印等).zip

    本资源是一个基于LSB(最低有效位)算法实现的水印图片和文字信息隐藏与提取的DEMO源码。该源码展示了如何将水印图片或文字信息嵌入到宿主图像中,以及如何从宿主图像中提取出隐藏的信息。功能包括嵌入水印和提取水印等操作。通过使用LSB算法,该源码实现了对水印图片和文字信息的隐写和提取。LSB算法是一种常用的图像处理技术,通过修改图像的最低有效位来嵌入额外的信息。在嵌入过程中,源码将水印图片或文字信息转换为二进制数据,并将其嵌入到宿主图像的像素值中。在提取过程中,源码从宿主图像中读取嵌入的二进制数据,并将其转换回原始的水印图片或文字信息。本资源适用于学习和研究图像隐写术的相关领域。通过阅读和运行该源码,用户可以了解LSB算法的原理和应用,掌握如何在图像中隐藏和提取水印图片和文字信息的方法。请注意,本资源仅供学习使用,不得用于任何非法用途。

    毕设&课程作业_基于C#的和SQLServer2014的学生成绩管理系统 .zip

    计算机系毕业设计

    基于Flask,mysql slope one的图书推荐系统全部资料+详细文档.zip

    【资源说明】 基于Flask,mysql slope one的图书推荐系统全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    【java毕业设计】中小企业人力资源管理系统的设计及实现源码(ssm+jsp+mysql+说明文档+LW).zip

    员工信息管理: 添加员工:录入新员工的信息到系统。 修改员工:对现有员工信息进行更新和修改。 考勤管理: 上班打卡:记录员工上班的考勤信息。 下班打卡:记录员工下班的考勤信息。 考勤查看:查看员工的考勤记录。 奖惩管理: 添加奖惩:记录员工的奖励或惩罚信息。 修改奖惩:对奖惩记录进行修改。 删除奖惩记录:从系统中移除奖惩记录。 绩效管理: 添加绩效:录入员工的绩效评估信息。 修改绩效:对绩效评估信息进行修改。 删除绩效:删除绩效评估信息。 离职退休费用: 添加费用:录入与离职或退休相关的费用信息。 修改费用:对费用信息进行修改。 删除费用:移除费用信息。 培训管理: 添加培训:录入新的培训计划或课程。 修改培训:对培训计划或课程进行修改。 删除培训:从系统中移除培训计划或课程。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    毕设&课程作业_基于C#的会员管理系统.zip

    计算机系毕业设计

    redis键值数据库源码分析.zip

    redis键值数据库源码分析Redis 代码redis键值数据库源码分析test:(测试)memtest.c 内存检测redis_benchmark.c用于redis性能测试的实现。redis_check_aof.c 用于更新日志检查的实现。redis_check_dump.c 用于本地数据库检查的实现。testhelp.c 一个C风格的小型测试框架。struct:(结构体)adlist.c用于对列表的定义,它是一个端点链表结构dict.c主要用于内存中的hash进行管理sds.c 用于对字符串的定义Sparkline.c 一个拥有样本列表的序列t_hash.c hash在Server/Client中的自定义操作。主要通过redisObject进行类型转换。t_list.c list在Server/Client中的应答操作。主要通过redisObject进行类型转换。t_set.c set在Server/Client中的应答操作。主要通过redisObject进行类型转换。t_string.c string在Server/Client中的应答操作。主要

    基于FLASK+VUE+MINTUI公众号自动回复+看图说话+ 微信支付+H5商城全部资料+详细文档.zip

    【资源说明】 基于FLASK+VUE+MINTUI公众号自动回复+看图说话+ 微信支付+H5商城全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    Golang 实现了 Redis 服务器和集群 Go语言实现的Redis服务器和遍布各处.zip

    Gordislish Version 简体中文Godis是Redis Server的golang实现,旨在提供使用golang编写高并发中间件的示例。主要特点支持字符串、列表、哈希、集合、有序集合、位图多数据库和SELECT命令TTL发布/订阅地理区域AOF 和 AOF 重写RDB 读写多命令事务是原子的和隔离的。如果在执行过程中遇到任何错误,godis 将回滚已执行的命令复制(实验)服务器端集群对客户端是透明的,你可以连接到集群中的任何节点来访问集群中的所有数据。使用 raft 算法来维护集群元数据。(实验)MSET,,,,命令在集群模式下受支持并原子执行,允许在多个MSETNX节点DEL上RenameRenameNXMULTI集群模式下支持槽内命令事务并发核心,因此您不必担心您的命令过多地阻塞服务器。如果您能读懂中文,您可以在我的博客中找到更多详细信息。立即开始您可以在此存储库的发布版本中获取可运行的程序,该版本支持 Linux 和 Darwin 系统。./godis-darwin./godis-linux

    【java毕业设计】家政服务平台的设计与实现源码(springboot+vue+mysql+说明文档+LW).zip

    家政服务平台有管理员,雇主,雇员三个角色。管理员功能有个人中心,雇主管理,雇员管理,资料认证管理,项目类型管理,服务项目管理,需求信息管理,服务预约管理,申请预约管理,签订合同管理,雇主评价管理,留言板管理,系统管理。雇主可以发布需求,雇员可以申请预约,雇主支付报酬,雇主和雇员可以签订合同,雇主可以对雇员进行评价。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:springboot,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3

    基于JAVA+SpringBoot+Vue+MySQL的中小型制造企业质量管理系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:maven 数据库工具:navicat

Global site tag (gtag.js) - Google Analytics