依赖注入及AOP简述(六)——字符串请求模式 .
2. 依赖注入对象的请求模式
前一节我们讨论了关于声明注入点的几种方法,这一节主要来介绍在注入点上如何定位到所需要的标识符的话题。基本上,我们可以用字符串为标识符来请求依赖对象、或者用全类名(FQCN)为标识符来请求依赖对象、或者用两者混合的模式。下面我们来依次介绍。
2.1. 字符串请求模式
顾名思义,字符串请求模式即依赖注入框架将一个依赖绑定到指定的字符串上,而后将其装入依赖注入容器。依赖者通过这个字符串,向容器请求所需要的依赖。Seam和Spring都是典型的基于字符串请求模式的框架。
在这样的模式中,容器中管理的依赖的标识符是通过字符串来定义的,例如我们刚才定义Bank和DepositBook依赖的时候,就是分别将其绑定到了“bank”和“depositBook”这两个字符串上。
|
之后对于依赖者类,只要在注入点上声明需要请求标识符字符串为“bank”或“depositBook”的依赖,容器就会自动将BankICBC和DepositBookICBC的实例返回给依赖者了。注意前面我们也提到了,Seam框架中在@In注入点缺省是被认为请求与成员变量名同名的依赖,因此下面两种请求依赖的写法是一样的:
|
|
|
尽管Seam和Spring都采用了纯字符串的标识符定义的模式,但这种模式下有一个很大的弱点:违反了“类型安全(type-safe)”原则,也就是说可能会误将一个本不是依赖者类所希望的依赖对象注入进来。试想这样的场景:假设开发者在开发Depositor类并定义其所需要的依赖的时候,误将“bank”写成了“bak”,而其他开发者又恰好向容器中注册了一个标识符为“bak”的依赖。
|
此时Java编译器编译器是不会有任何错误信息提示的,因为@In是一个运行时注解,根据Java5的注解原理,运行时注解在编译时几乎就相当于一个注释行被编译器忽略掉了,只有到了运行时才会由解析它的代码段产生作用。因此无论是开发者定义成@In(“bak”)还是@In(“bakxxx”)等等,都不会对代码的编译造成任何影响。在这个例子中,虽然开发人员误将“bak”依赖请求进来,但会正常编译出应用程序,然后在运行这个应用程序的时候则会抛出ClassCastException的异常,这是就需要开发者花力气去排查错误了。
当然如果情况比较简单的话或许可以很快地排查掉这个bug,但是还有比这更可怕的事情:试想假设Bak类与Bank类是有继承关系的父子类,那么即使是在运行时也不会抛出ClassCastException的异常,因为依赖可以正确地被cast后set到注入点,这就有可能使得应用程序在被执行了很深之后才出现意想不到的bug,此时再去排查错误就会变得很困难了。
当然还有另外一种情况,就是如果容器中没有“bak”这个依赖的情况。此时声明注入点处的代码如果没有特殊限定,容器很可能将一个null对象设定到注入点,依然只会在运行时抛出NullPointerException异常。NPE异常或许是Java开发者最不愿意看到的异常了,因为它自描述性差,使得开发者经常很难定位错误所在。
依赖注入及AOP简述(六)——字符串请求模式 .的更多相关文章
- 依赖注入及AOP简述(七)——FQCN请求模式
2.2. FQCN请求模式 为了弥补纯字符串请求模式中的类型安全问题,全类名(FQCN)请求模式就应运而生了.其思想便是,在向容器请求依赖对象的时候,不是通过字符串的标识符.而是通过被请求的依赖 ...
- 依赖注入及AOP简述(八)——混合请求模式 .
2.3. 混合请求模式 上一节讲到了FQCN(全类名)请求模式会带来依赖定义的柔软性较差的问题,因此字符串和全类名混合的模式又应运而生了.比如刚才的Spring中的API方式声明注入点的例子就可 ...
- 依赖注入及AOP简述(三)——依赖注入的原理
3. “依赖注入”登场 于是诸多优秀的IT工程师开始想出了更加轻量便利.更加具有可测试性和可维护性的设计模式——IoC模式.IoC,即Inversion of Control的缩写,中文里被称 ...
- 依赖注入及AOP简述(二)——工厂和ServiceLocator .
2.2. 工厂模式 基于手工构建组件的诸多弱点,1995年“大师4人组”(GoF)在其经典著作<DesignPatterns>一书中提出了“工厂模式”,这种模式在一定程度上有效的解决 ...
- 依赖注入及AOP简述(五)——依赖注入的方式 .
二.依赖注入的应用模式 前面我们了解了依赖注入的基本概念,也对一些依赖注入框架进行了简单的介绍,这一章我们主要来讨论作为开发者如何利用依赖注入框架来实现依赖注入的设计思想. 1. 依赖注入的方 ...
- 依赖注入及AOP简述(十三)——AOP应用举例(完结) .
2. AOP应用举例 在一般的应用程序开发中,有一些典型的AOP应用,使得开发者可以专注于业务逻辑本身,而不是与之完全无关的一些“方面”. l 首先就是关于前面介绍过的日志输出类 ...
- 依赖注入及AOP简述(十二)——依赖注入对象的行为增强(AOP) .
四.依赖注入对象的行为增强(AOP) 前面讲到,依赖注入框架的最鲜明的特点就是能够提供受容器管理的依赖对象,并且可以对对象提供行为增强(AOP)功能,所以这一章我们来讨论有关AOP的话题. 1. ...
- 依赖注入及AOP简述(九)——单例和无状态Scope .
三.依赖注入对象的Scope及其生命周期 在前面的章节我们讲到,依赖注入容器之所以能够区别于以往的ServiceLocator等容器,是在于其不但能够自动构建多层次的.完整的依赖关系图,并且可以管理依 ...
- 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .
3.2. “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...
随机推荐
- Zookeeper 2、Zookeeper的安装和配置(集群模式)
1.下载与解压 Zookeeper下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/ 下载完成以后解压到一个特定目录 同步时间所有节点的时间,并关 ...
- wxPython Major类
转载自:http://www.yiibai.com/wxpython/wxpython_major_classes.html 原始的 wxWidgets(用C++编写)是一个巨大的类库.GUI类从 ...
- Unity屏幕射线碰撞
Layers层: 从Layers设置看来,最多支持32层. 图层的值开始依次 0^2,1^2, 2^2, 3^3 依次增加. 当摄像机Culling Mask属性 Nothing= –1 Eveni ...
- UIScollView Touch事件
customScrollView.h #import <UIKit/UIKit.h> @interface customScrollView : UIScrollView @end cus ...
- Linux使用技巧9--用dpkg管理你的软件
dpkg(package manager for Debian): debian体系中的包管理工具. Commands: -i|--install <.deb file name> ... ...
- <runtime> 的 <assemblyIdentity> 元素和<bindingRedirect> 元素
1.<assemblyIdentity> 元素 包含关于该程序集的标识信息. <assemblyIdentity name="assembly name" pub ...
- oracle 数据库学习
1.更改数据库用户名密码: alter user '用户名' identified by ’password'. 2.查看数据库有哪些用户:sqlplus system/password ;selec ...
- Intersection of Two Linked Lists(java)
eg: a1 → a2 ↘ c1 → c2 → c3 或者直接a1 → b1 ↗ b1 → b2 → b3求公共链表c1. 常规的指针分裂法,复制法,偏移法. public class Solutio ...
- Spring 入门 AOP
通过一个小例子演视怎么使用 Spring 现实面向切面编程. 导入 Spring 所需要的包 spring-framework-2.5.6 版需要导入以下包: 1.----- spring.jar 2 ...
- iOS获取文件路径
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "PingFang SC"; color: #008400 } p.p2 ...