Java/Android依赖注入库
2016-02-24 20:43
381 查看
Dagger 是一种Android平台的依赖注入框架,是有一家专注于移动支付的公司,Square公司推出的库。
特性
使用 JSR-330标准注解进行构造器注入
使用@Provides注解创建对象
针对依赖树的中心上下文
昂贵资源延迟注入
同一接口的多种实现
静态注入 (针对遗留环境)
绑定的编译时验证
使用例子
我们来设计Heater、Pump、Drink这三个接口,如下:
package com.example.app.dagger;
interface Heater {
void on(); //加热器打开
void off();//加热器关闭
boolean isHot();//加热是否完毕
}
package com.example.app.dagger;
interface Pump {
void pump(); //倒咖啡
boolean isPumped();//是否倒好
}
package com.example.app.dagger;
interface Drink {
void drink(); //喝咖啡
}
接口已经设计完毕,是否合理暂且不细究,接下来我们分别实现这三个接口(有用到AndroidAnnotations框架
package com.example.app.dagger;
import android.content.Context;
import android.widget.Toast;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import org.androidannotations.annotations.UiThread;
@EBean
class ElectricHeater implements Heater {
boolean heating = false;
@RootContext
Context context;
@Override
public void on() {
heating = true;
System.out.println("-----Heating-----");
reportHeating();
}
@UiThread
void reportHeating(){
Toast.makeText(context,"Electric heater heating.....",Toast.LENGTH_LONG).show();
}
@Override
public void off() {
heating = false;
}
@Override
public boolean isHot() {
return heating;
}
}
ElectricHeater是对Heater接口的实现类,@EBean,@RootContext,@UiThread是AndroidAnnotations框架中的注解。
使用@EBean注解会在编译过程中产生一个ElectricHeater子类ElectricHeater_.class, 接下来会用到。
Pump接口实现:
package com.example.app.dagger;
import javax.inject.Inject;
class Thermosiphon implements Pump {
private final Heater heater;
boolean pumped = false;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
@Override
public void pump() {
if (heater.isHot()) {
System.out.println("-----Pumping-----");
pumped = true;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public boolean isPumped() {
return pumped;
}
}
package com.example.app.dagger;
import javax.inject.Inject;
class PeopleDrink implements Drink {
private Pump pump;
@Inject
PeopleDrink(Pump pump) {
this.pump = pump;
}
@Override
public void drink(){
if(pump.isPumped()){
System.out.println("-----Drinking-----");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
特性
使用 JSR-330标准注解进行构造器注入
使用@Provides注解创建对象
针对依赖树的中心上下文
昂贵资源延迟注入
同一接口的多种实现
静态注入 (针对遗留环境)
绑定的编译时验证
使用例子
我们来设计Heater、Pump、Drink这三个接口,如下:
package com.example.app.dagger;
interface Heater {
void on(); //加热器打开
void off();//加热器关闭
boolean isHot();//加热是否完毕
}
package com.example.app.dagger;
interface Pump {
void pump(); //倒咖啡
boolean isPumped();//是否倒好
}
package com.example.app.dagger;
interface Drink {
void drink(); //喝咖啡
}
接口已经设计完毕,是否合理暂且不细究,接下来我们分别实现这三个接口(有用到AndroidAnnotations框架
package com.example.app.dagger;
import android.content.Context;
import android.widget.Toast;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import org.androidannotations.annotations.UiThread;
@EBean
class ElectricHeater implements Heater {
boolean heating = false;
@RootContext
Context context;
@Override
public void on() {
heating = true;
System.out.println("-----Heating-----");
reportHeating();
}
@UiThread
void reportHeating(){
Toast.makeText(context,"Electric heater heating.....",Toast.LENGTH_LONG).show();
}
@Override
public void off() {
heating = false;
}
@Override
public boolean isHot() {
return heating;
}
}
ElectricHeater是对Heater接口的实现类,@EBean,@RootContext,@UiThread是AndroidAnnotations框架中的注解。
使用@EBean注解会在编译过程中产生一个ElectricHeater子类ElectricHeater_.class, 接下来会用到。
Pump接口实现:
package com.example.app.dagger;
import javax.inject.Inject;
class Thermosiphon implements Pump {
private final Heater heater;
boolean pumped = false;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
@Override
public void pump() {
if (heater.isHot()) {
System.out.println("-----Pumping-----");
pumped = true;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public boolean isPumped() {
return pumped;
}
}
package com.example.app.dagger;
import javax.inject.Inject;
class PeopleDrink implements Drink {
private Pump pump;
@Inject
PeopleDrink(Pump pump) {
this.pump = pump;
}
@Override
public void drink(){
if(pump.isPumped()){
System.out.println("-----Drinking-----");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
相关文章推荐
- 关于Java后台处理android上传图片的问题
- Android ROM开发(一)——Windows下Cygwin和Android_Kitchen厨房的安装
- Android ROM开发(一)——Windows下Cygwin和Android_Kitchen厨房的安装
- Android设置屏幕保持长亮
- 【Android】缩略图Thumbnails
- android csdn新闻客户端
- android的checkBox属性
- live555 for android 编译
- 2、Android Studio中Opencv测试
- 1、在Android Studio上配置OpenCV
- Android Studio入门之常见问题
- Androidx学习笔记(82)--- 内容提供者(ContentProvider)-自定义内容提供者
- Androidx学习笔记(81)--- 内容提供者(ContentProvider)
- Androidx学习笔记(80)--- 摄像拍照
- Androidx学习笔记(79)--- 视频播放器二(VideoView等)
- Androidx学习笔记(78)--- 视频播放器(MediaPlayer+SurfaceView)
- Androidx学习笔记(77)--- 音乐播放器2
- Androidx学习笔记(76)--- 撕衣服
- Androidx学习笔记(75)--- 画画板
- Androidx学习笔记(74)--- 对图片进行特效处理