注入(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

注入(Injection)相关推荐

  1. Spring基础专题——第二章(注入Injection)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

  2. java安全编码指南之:输入注入injection

    文章目录 简介 SQL注入 java中的SQL注入 使用PreparedStatement XML中的SQL注入 XML注入的java代码 简介 注入问题是安全中一个非常常见的问题,今天我们来探讨一下 ...

  3. java injection_java安全编码指南之:输入注入injection

    简介 注入问题是安全中一个非常常见的问题,今天我们来探讨一下java中的SQL注入和XML注入的防范. SQL注入 什么是SQL注入呢? SQL注入的意思是,用户输入了某些参数,最终导致SQL的执行偏 ...

  4. Spring注入的基本使用

    注入(Injection) 什么是注入? 注入:通过 Spring 工厂及配置文件,为所创建对象的成员变量赋值. 为什么要注入? 通过编码的方式,为成员变量进行赋值,存在耦合. 注入的好处:解耦合. ...

  5. java 防止js注入_在WebView中如何让JS与Java安全地互相调用

    在现在安卓应用原生开发中,为了追求开发的效率以及移植的便利性,使用WebView作为业务内容展示与交互的主要载体是个不错的折中方案.那么在 这种Hybrid(混合式) App中,难免就会遇到页面JS需 ...

  6. 【Spring 工厂】注入详解 — Set注入(JDK内置类型,用户自定义类型)、构造注入(重载)

    Spring 注入(Injection) 什么是注入? 为什么要注入? 如何进行注入[开发步骤] Spring注入的原理分析(简易版) Set注入详解 JDK内置类型 String+8种基本类型 数组 ...

  7. 看我如何绕过Cloudflare 的 SQL 注入过滤

     聚焦源代码安全,网罗国内外最新资讯! 作者:George Skouroupathis 编译:奇安信代码卫士团队 2018年年末,我受雇为某大客户执行 Web Application 安全评估.用自动 ...

  8. week2 container and injection

    一.container 1.概念 容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您做好. Container技术是直接将一个应用程序所需的相关程序代码.函式库 ...

  9. SwiftSuspenders 1.6-深入浅出1

    深入 这篇SwiftSuspenders 浅出深入的 深入部分主要是对SwiftSuspenders进行深度剖析,包括对SwiftSuspenders的体系结构的分析,一个对象在整个注入过程中会经历怎 ...

最新文章

  1. 字节跳动《Python高频面试题》火了,完整版 PDF 开放下载!
  2. Java8 Stream 使用
  3. 成功解决AttributeError: module 'tensorflow.nn.rnn_cell' has no attribute 'linear'
  4. spring security加载原理(基于springboot)
  5. kafka认知--(1)
  6. 古代的酒到底多少度,为何古人动不动喝好几坛都不会醉呢?
  7. C学习笔记-makefile
  8. 编辑php程序推荐的软件,手机上如何才能编辑程序代码?(软件推荐)
  9. arcpy 实现列举目录下的要素类与描述矢量数据要素类
  10. Kettle parameter方式实现循环
  11. 差距几何 Vista与XP系统性能对比测试(下)
  12. sum在mysql是什么意思_数据库中Count是什么意思和SUM有什么区别
  13. 美柚:女性移动APP安全攻防战
  14. Android开发笔记(一百四十八)自定义输入法软键盘
  15. ps图层转css3代码,CSS3Ps:ps图层转CSS3代码之神器
  16. ISP(图像信号处理)之——坏点校正
  17. 一个吊炸天的登录页面
  18. pg_stat_database 视图 tup_returned、tup_fetched 的含义
  19. win7系统64位安装MATLAB(R2016)
  20. 华为鸿蒙任正非专访,任正非接受专访:华为鸿蒙系统将比安卓速度快60%

热门文章

  1. 对于木马的一些介绍(预防木马)
  2. c语言微信备份文件夹,电脑微信数据存在哪个文件夹里?
  3. March 22 2017 Week 12 Wednesday
  4. IPv6和IPv4共存技术之 ISATAP隧道技术
  5. 电脑使用技巧(Win10修改窗口背景颜色)
  6. 十、C#接口、抽象、密封、开放封闭原则
  7. 电子科大计算机学院郑欣,我校研究生在“华为杯”第十六届中国研究生数学建模竞赛中获佳绩...
  8. 韦德高清图片壁纸下载
  9. PHP——get和post请求他人接口
  10. LFTP file already exists and xfer:clobber is unset