javax.inject包
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) {...}
}
构造器做了什么
- 找到一个TimeSource
- 利用TimeSource构造Stopwatch
- 利用Stopwatch构造StopwatchWidget
这使我们的代码看起来更加简洁和灵活,并从一定程度上弱化了依赖关系
在测试用例中,我们也可以直接通过像构造器传递模拟数据进行单元测试,再也不需要设置/清理factories了
void testStopwatch() {
Stopwatch sw = new Stopwatch(new MockTimeSource());
}
javax.inject包的更多相关文章
- javax.inject中@Inject、@Named、@Qualifier和@Provider用法
@Inject @Inject支持构造函数.方法和字段注解,也可能使用于静态实例成员.可注解成员可以是任意修饰符(private,package-private,protected,public).注 ...
- 使用javax.script包实现Java设置JS脚本中的变量
下面例子中,我们通过javax.script包ScriptEngine.put()方法设置JS脚本中的变量,JS把所有在线用户输出. package ajava.code.javase; import ...
- Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
项目名-->右键 Property-->选择 JavaBuild Path-->选择 Add External JARs-->选择 把servlet-api.jar的路径输入即 ...
- Servlet之javax.servlet包
链接 : http://blog.sina.com.cn/s/blog_5d4214c70102wnf1.html
- Eclipse - servlet显示无法导入javax.servlet包问题的解决方案
项目名-->右键 Property-->选择 Java Build Path-->选择 Add External JARs-->选择 把servlet-api.jar的路径输入 ...
- Spring自动注入之@Autowired、@Resource、@Inject
相同点: 三者都支持对spring bean的自动注入 不同点: ①Autowired按照类型进行注入( Bean bean = applicationContext.getBean(Bean.cla ...
- Spring 学习——Spring JSR注解——@Resoure、@PostConstruct、@PreDestroy、@Inject、@Named
JSR 定义:JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正 ...
- Spring IOC之基于注解的容器配置
Spring配置中注解比XML更好吗?基于注解的配置的介绍提出的问题是否这种途径比XML更好.简单来说就是视情况而定. 长一点的答案是每一种方法都有自己的长处也不足,而且这个通常取决于开发者决定哪一种 ...
- 【Spring】装配Bean 组件扫描
实现自动装配需要用注解:注解分为 spring规范和java规范 ,java规范需要引入javax.inject 包 ,使用maven,直接引入. 从中可以看到 @Named @Inject属于jav ...
随机推荐
- 图解项目管理流程:禅道&JIRA中的操作
禅道作为优秀的国产开源项目管理软件,禅道集产品管理.项目管理.质量管理.文档管理.组织管理和事务管理于一体,完整覆盖了研发项目管理的核心流程.禅道的设计理念在于提供一体化的解决方案,流程图完整呈现了项 ...
- IDEA中导入多个包自动合并为星号
IDEA中导入同一个包下的几个class会自动合并为星号,如下图.可以通过设置让其不自动合并为星号. 1.选择File→Settings→Editor→Code style→Java,再点击右边的Im ...
- webx roadmap
SpringExt 自定义Spring Schema的例子 基于Spring可扩展Schema提供自定义配置支持 使用SpringExt扩展Webx的示例 扩展点和捐献 一个namespace下可以声 ...
- 用Emacs的这些年
读技术博客时发现又有人提起我曾写的那篇口水文章 为何Emacs和Vim被称为两大神器.写那篇文章时,我还在Vim和Emacs之间摇摆.当然主要在用vim,博士学位论文和所有的国际会议文章都是用Vim编 ...
- 拿webshell权限方法(一)
概念 Webshell就是以asp,php,jsp或cgi等网页文件形式存在的一种命令执行环境,也可以将其称为一种网页后门. Access数据库拿webshell 首先看是否能找到网站漏洞进行网站的后 ...
- 20155332 2016-2017-2 《Java程序设计》第7周学习总结
20155332 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 了解Lambda语法 了解方法引用 了解Fucntional与Stream API 掌握Da ...
- 第16月第25天 tableView设置UITableViewStyleGrouped顶部有空余高度
1. 正确的处理方法 1)设置标头的高度为特小值 (不能为零 为零的话苹果会取默认值就无法消除头部间距了) UIView *view = [[UIView alloc]initWithFrame:CG ...
- node版本管理工具nvm安装以及使用
curl命令安装 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash 或者 使用wg ...
- 前端 - js方式Ajax/ jquery方式Ajax / 伪 ajax /伪ajax 进阶方式
DJANGO环境搭建: 目录文件: 关闭CSRF 添加目录文件路径 配置url 视图配置: index页面配置: 测试:(成功) 进入正题: ajax 通过GET提交数据至后台: <!DOCTY ...
- 实用技能之Python打包制作成EXE可执行程序
制作环境:Andconda3,python3.6 一.安装pyInstaller 方式一): 在命令行输入:pip install pyinstaller 方式二): ① 下载pyInstalle ...