2.     依赖注入对象的请求模式

前一节我们讨论了关于声明注入点的几种方法,这一节主要来介绍在注入点上如何定位到所需要的标识符的话题。基本上,我们可以用字符串为标识符来请求依赖对象、或者用全类名(FQCN)为标识符来请求依赖对象、或者用两者混合的模式。下面我们来依次介绍。

2.1.    字符串请求模式

顾名思义,字符串请求模式即依赖注入框架将一个依赖绑定到指定的字符串上,而后将其装入依赖注入容器。依赖者通过这个字符串,向容器请求所需要的依赖。Seam和Spring都是典型的基于字符串请求模式的框架。

在这样的模式中,容器中管理的依赖的标识符是通过字符串来定义的,例如我们刚才定义Bank和DepositBook依赖的时候,就是分别将其绑定到了“bank”和“depositBook”这两个字符串上。

@Name("bank")  // 将BankICBC依赖绑定到"bank"

public class BankICBC implements Bank { // ……  }

@Name("depositBook")  // 将DepositBookICBC依赖绑定到"depositBook"

public class DepositBookICBC implements DepositBook { // ……  }

之后对于依赖者类,只要在注入点上声明需要请求标识符字符串为“bank”或“depositBook”的依赖,容器就会自动将BankICBC和DepositBookICBC的实例返回给依赖者了。注意前面我们也提到了,Seam框架中在@In注入点缺省是被认为请求与成员变量名同名的依赖,因此下面两种请求依赖的写法是一样的:

@In // 请求标识符为"bank"的依赖对象

private Bank bank;

@In // 请求标识符为"depositBook "的依赖对象

private DepositBook depositBook;

@In("bank") // 请求标识符为"bank"的依赖对象

private Bank bank;

@In("depositBook") // 请求标识符为"depositBook "的依赖对象

private DepositBook depositBook;

尽管Seam和Spring都采用了纯字符串的标识符定义的模式,但这种模式下有一个很大的弱点:违反了“类型安全(type-safe)”原则,也就是说可能会误将一个本不是依赖者类所希望的依赖对象注入进来。试想这样的场景:假设开发者在开发Depositor类并定义其所需要的依赖的时候,误将“bank”写成了“bak”,而其他开发者又恰好向容器中注册了一个标识符为“bak”的依赖。

@In("bak") // 错误地请求了标识符为"bak"的依赖对象

private Bank bank;

@Name("bak ")  // 其他开发者恰好向容器中注册了一个"bak"依赖

public class Bak { // ……  }

此时Java编译器编译器是不会有任何错误信息提示的,因为@In是一个运行时注解,根据Java5的注解原理,运行时注解在编译时几乎就相当于一个注释行被编译器忽略掉了,只有到了运行时才会由解析它的代码段产生作用。因此无论是开发者定义成@In(“bak”)还是@In(“bakxxx”)等等,都不会对代码的编译造成任何影响。在这个例子中,虽然开发人员误将“bak”依赖请求进来,但会正常编译出应用程序,然后在运行这个应用程序的时候则会抛出ClassCastException的异常,这是就需要开发者花力气去排查错误了。

当然如果情况比较简单的话或许可以很快地排查掉这个bug,但是还有比这更可怕的事情:试想假设Bak类与Bank类是有继承关系的父子类,那么即使是在运行时也不会抛出ClassCastException的异常,因为依赖可以正确地被cast后set到注入点,这就有可能使得应用程序在被执行了很深之后才出现意想不到的bug,此时再去排查错误就会变得很困难了。

当然还有另外一种情况,就是如果容器中没有“bak”这个依赖的情况。此时声明注入点处的代码如果没有特殊限定,容器很可能将一个null对象设定到注入点,依然只会在运行时抛出NullPointerException异常。NPE异常或许是Java开发者最不愿意看到的异常了,因为它自描述性差,使得开发者经常很难定位错误所在。

转载于:https://www.cnblogs.com/Free-Thinker/p/4173276.html

依赖注入及AOP简述(六)——字符串请求模式 .相关推荐

  1. 依赖注入及AOP简述(五)——依赖注入的方式 .

    二.依赖注入的应用模式 前面我们了解了依赖注入的基本概念,也对一些依赖注入框架进行了简单的介绍,这一章我们主要来讨论作为开发者如何利用依赖注入框架来实现依赖注入的设计思想. 1.     依赖注入的方 ...

  2. 依赖注入及AOP简述(一)——“依赖”的概念 .

    一.入门:依赖注入 作为一种全新的设计模式理念,"依赖注入"这个词汇在软件设计开发中已经是越来越耳熟能详了,而各种流行于开源社区的"依赖注入框架",也越来越多的 ...

  3. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  4. 第七节:WebApi与Unity整合进行依赖注入和AOP的实现

    一. IOC和DI 1. 通过Nuget引入Unity程序集. PS:[版本:5.8.6] 2. 新建DIFactory类,用来读取Unity的配置文件并创建Unity容器,需要注意的是DIFacto ...

  5. Microsoft.Practices.Unity实现代码依赖注入、XML依赖注入和AOP切面编程

    源码地址: http://files.cnblogs.com/xdoudou/Unity%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E5%92%8CAOP.rar 转载于 ...

  6. ASP.NET CORE 第四篇 依赖注入IoC学习 + AOP界面编程初探

    原文作者:老张的哲学 更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjo ...

  7. 从壹开始前后端分离【 .NET Core2.2 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探...

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  8. 【 .NET Core 3.0 】框架之九 || 依赖注入 与 IoC

    本文有配套视频:https://www.bilibili.com/video/av58096866/?p=5 前言 1.重要:如果你实现了解耦,也就是 api 层只引用了 IService 和 IRe ...

  9. EFCore查缺补漏(一):依赖注入

    前段时间,在群里潜水的时候,看见有个群友的报错日志是这样的: An unhandled exception was thrown by the application. System.OutOfMem ...

最新文章

  1. oracle时间戳-日期转换
  2. JAVA 创建线程池
  3. 惊呆了,JDK中这些常用方法也有Bug?
  4. leetcode 刷题140 141
  5. 自定义input[type=file]的兼容样式
  6. 17、java中的集合(4)
  7. springboot security
  8. 局域网网速太慢的问题
  9. (五)ThinkPHP实践之Session驱动-TTLSA
  10. 如何用matlab做拉普拉斯变换,利用MATLAB实现拉普拉斯变换和其逆变换
  11. 修改网页中的内容与打印网页
  12. 《如何高效学习》读后感
  13. 成都Uber优步司机奖励政策(3月4日)
  14. 小奇的矩阵(动态规划
  15. c语言单片机自动浇花系统,LLAKG:Arduino 自动浇花系统(第3集:C语言程序升级与功能优化)...
  16. 三阶PLL环路参数计算
  17. 微信登录异常errcode:40029
  18. android中汉字转为拼音
  19. 有用的博客整理(Android系统编译相关)
  20. 检e宝--大数据辅助决策系统

热门文章

  1. first-child和first-of-type的区别
  2. CentOS 7 源码编译MariaDB 5.5.46
  3. iOS实战:第一次在iTunesConnect上建立应用时注意公司名称
  4. Latex应用和资源
  5. Windows Server 2008 R2中的Hyper-V
  6. orcle rac启动了,但数据库没有启动的错误解决
  7. 编码设置导致了eclipse/myeclipse代码无法保存
  8. android 如何终止线程
  9. ScrollView’s handy trick--android:fillViewport=quot;truequot;
  10. FFmpeg转OpenCV Mat显示