开源项目的依赖注入
依赖注入概念
依赖(Dependency)
• ClassA中需要ClassB,通常我们在A的代码中new一个ClassB。
• 采用依赖注入技术之后,A不再需要直接new一个ClassB,它只需要定义一个私有的B对象,由相关的框架或者容器在外部把B实例化,再注入到A;
public class MainActivity extends Activity {
private ProductBean mProduct;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//mProduct = new ProductBean("1", "鞋子");
Utils.injectProduct(this);
}
}
依赖注入(DI:Dependency Injection):
ClassA的运行依赖于ClassB,如果ClassB对象的获取需要ClassA自己去实现的话,常常会导致代码高度耦合。反过来,如果ClassB对象的获取是由外部容器注入的,这个“依赖注入”的过程常常被称为控制反转(IOC:Inversion of Control), 就是获取对象的方式变了依赖注入是实现控制反转的方式之一(另一方式是依赖查找),目的就是为了让调用者和被调用者之间解耦可以注入依赖的模拟实现,使得测试变得更加简单.
依赖注入方式:
• set方法。给外部容器的一个接口,传入依赖的对象。
• 基于构造函数。在新建对象时,传入依赖的对象。
• 基于Java的注解(Annotation)功能
ButterKnife黄油刀
• 主页 https://github.com/JakeWharton/butterknife
• 用途: 主要用来简化各种初始化控件的操作
配置:
在项目根目录下build.gradle文件中添加apt编译插件:
buildscript {
repositories {
mavenCentral();
jcenter();
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
在app/build.gradle文件中dependencies节点添加如下代码
apply plugin: 'android-apt'
// 应用apt插件
dependencies {
compile 'com.jakewharton:butterknife:8.1.0'
apt 'com.jakewharton:butterknife-compiler:8.1.0'
}
安装Android ButterKnife Zelezny插件, 安装成功以后重启Android Studio
AndroidAnnotations
• 主页: http://androidannotations.org/
• 用途:
1. 使用依赖注入Views,extras,System Service,resources
2. 简化线程模型
3. 事件绑定
4. REST Client
配置:
在project/build.gradle 文件中按下图所示添加代码:
buildscript {
repositories {
mavenCentral()
// 添加这一行
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // 添加这一行
}
}
在app/build.gradle 文件中按下图所示添加代码:
apply plugin: 'android-apt'
apt {
arguments {
androidManifestFile variant.outputs[0]?.processResources?.manifestFile
}
}
dependencies {
apt "org.androidannotations:androidannotations:4.0.0"
compile "org.androidannotations:androidannotations-api:4.0.0"
}
注入View,注入Click事件。注意view和click事件不能是private
1. 注入系统service,设置全屏,设置WindowFeature
2. 简化线程模型
@Background
@UiThread