javax.inject包

java提出的依赖注入标准,有别于以下传统的对象获取方式

  • 构造方法
  • 工厂模式
  • 服务器定位模式(e.g. JNDI)

开发过程中是会有很多层层依赖的对象的,例如,Stopwatch依赖于TimeSource,为当前对象寻找一个所依赖对象的实例称做解决依赖,若没有实例被找到,则应用执行失败,我们称依赖不满足

当没有依赖注入时,也有很多解决依赖的方法,例如直接调用构造器

class Stopwatch {
final TimeSource timeSource;
Stopwatch() {
timeSource = new AtomicClock(...);
}
void start() {...}
void stop() {...}
}

如果需要更多的灵活性,可以使用工厂方法

class Stopwatch {
final TimeSource timeSource;
Stopwatch() {
timeSource = DefaultTimeSource.getInstance();
}
void start() {...}
void stop() {...}
}

我们必须权衡这两种方式:

  • 构造器很简洁,但不灵活
  • 工厂方法虽然从一定程度上解耦了调用方和具体实现,但是需要很多模版代码
  • Service locators方式虽然实现了更好的耦合,但缺少了编译时的类型检查

而且,这几种方法都限制了单元测试,例如,如果我们使用工厂方法,所有依赖于依赖于工厂类的测试代码都需要模拟出factory,还要记得在用完之后清理掉它

void testStopwatch() {
// 先获取原始的实例
TimeSource original = DefaultTimeSource.getInstance();
// 用mock数据替换原始实例
DefaultTimeSource.setInstance(new MockTimeSource());
try {
Stopwatch sw = new StopWatch();
...
} finally {
// 将原始实例放回去以避免一些风险
DefaultTimeSource.setInstance(original);
}
}

实践经验告诉我们,模拟factor会导致大量的模式化代码,大量的模拟和清理将会很快失控。

依赖注入解决了所有的这些问题

class Stopwatch {
final TimeSource timeSource;
@Inject
Stopwatch(TimeSource timeSource) {
this.timeSource = timeSource;
}
void start() {...};
void stop() {...};
}

构造器进一步的将依赖层层传递,直到满足全部依赖。例如,我们需要构造一个StopwatchWidget实例:

class StopwatchWidget {
@Inject
StopwatchWidget(Stopwatch sw) {...}
}

构造器做了什么

  1. 找到一个TimeSource
  2. 利用TimeSource构造Stopwatch
  3. 利用Stopwatch构造StopwatchWidget

这使我们的代码看起来更加简洁和灵活,并从一定程度上弱化了依赖关系

在测试用例中,我们也可以直接通过像构造器传递模拟数据进行单元测试,再也不需要设置/清理factories了

void testStopwatch() {
Stopwatch sw = new Stopwatch(new MockTimeSource());
}

javax.inject包的更多相关文章

  1. javax.inject中@Inject、@Named、@Qualifier和@Provider用法

    @Inject @Inject支持构造函数.方法和字段注解,也可能使用于静态实例成员.可注解成员可以是任意修饰符(private,package-private,protected,public).注 ...

  2. 使用javax.script包实现Java设置JS脚本中的变量

    下面例子中,我们通过javax.script包ScriptEngine.put()方法设置JS脚本中的变量,JS把所有在线用户输出. package ajava.code.javase; import ...

  3. Eclipse中servlet显示无法导入javax.servlet包问题的解决方案

    项目名-->右键 Property-->选择 JavaBuild Path-->选择 Add External JARs-->选择 把servlet-api.jar的路径输入即 ...

  4. Servlet之javax.servlet包

    链接 : http://blog.sina.com.cn/s/blog_5d4214c70102wnf1.html

  5. Eclipse - servlet显示无法导入javax.servlet包问题的解决方案

    项目名-->右键 Property-->选择 Java Build Path-->选择 Add External JARs-->选择 把servlet-api.jar的路径输入 ...

  6. Spring自动注入之@Autowired、@Resource、@Inject

    相同点: 三者都支持对spring bean的自动注入 不同点: ①Autowired按照类型进行注入( Bean bean = applicationContext.getBean(Bean.cla ...

  7. Spring 学习——Spring JSR注解——@Resoure、@PostConstruct、@PreDestroy、@Inject、@Named

    JSR 定义:JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正 ...

  8. Spring IOC之基于注解的容器配置

    Spring配置中注解比XML更好吗?基于注解的配置的介绍提出的问题是否这种途径比XML更好.简单来说就是视情况而定. 长一点的答案是每一种方法都有自己的长处也不足,而且这个通常取决于开发者决定哪一种 ...

  9. 【Spring】装配Bean 组件扫描

    实现自动装配需要用注解:注解分为 spring规范和java规范 ,java规范需要引入javax.inject 包 ,使用maven,直接引入. 从中可以看到 @Named @Inject属于jav ...

随机推荐

  1. 图解项目管理流程:禅道&JIRA中的操作

    禅道作为优秀的国产开源项目管理软件,禅道集产品管理.项目管理.质量管理.文档管理.组织管理和事务管理于一体,完整覆盖了研发项目管理的核心流程.禅道的设计理念在于提供一体化的解决方案,流程图完整呈现了项 ...

  2. IDEA中导入多个包自动合并为星号

    IDEA中导入同一个包下的几个class会自动合并为星号,如下图.可以通过设置让其不自动合并为星号. 1.选择File→Settings→Editor→Code style→Java,再点击右边的Im ...

  3. webx roadmap

    SpringExt 自定义Spring Schema的例子 基于Spring可扩展Schema提供自定义配置支持 使用SpringExt扩展Webx的示例 扩展点和捐献 一个namespace下可以声 ...

  4. 用Emacs的这些年

    读技术博客时发现又有人提起我曾写的那篇口水文章 为何Emacs和Vim被称为两大神器.写那篇文章时,我还在Vim和Emacs之间摇摆.当然主要在用vim,博士学位论文和所有的国际会议文章都是用Vim编 ...

  5. 拿webshell权限方法(一)

    概念 Webshell就是以asp,php,jsp或cgi等网页文件形式存在的一种命令执行环境,也可以将其称为一种网页后门. Access数据库拿webshell 首先看是否能找到网站漏洞进行网站的后 ...

  6. 20155332 2016-2017-2 《Java程序设计》第7周学习总结

    20155332 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 了解Lambda语法 了解方法引用 了解Fucntional与Stream API 掌握Da ...

  7. 第16月第25天 tableView设置UITableViewStyleGrouped顶部有空余高度

    1. 正确的处理方法 1)设置标头的高度为特小值 (不能为零 为零的话苹果会取默认值就无法消除头部间距了) UIView *view = [[UIView alloc]initWithFrame:CG ...

  8. node版本管理工具nvm安装以及使用

    curl命令安装 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash 或者 使用wg ...

  9. 前端 - js方式Ajax/ jquery方式Ajax / 伪 ajax /伪ajax 进阶方式

    DJANGO环境搭建: 目录文件: 关闭CSRF 添加目录文件路径 配置url 视图配置: index页面配置: 测试:(成功) 进入正题: ajax 通过GET提交数据至后台: <!DOCTY ...

  10. 实用技能之Python打包制作成EXE可执行程序

    制作环境:Andconda3,python3.6 一.安装pyInstaller 方式一): 在命令行输入:pip install pyinstaller 方式二): ①   下载pyInstalle ...