您的位置:首页 > 移动开发 > Android开发

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();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: