开源项目合集(一) 依赖注入
1.1 依赖注入概念
依赖(Dependency)
- ClassA中需要ClassB,通常我们在A的代码中new一个ClassB。
- 采用依赖注入技术之后,A不再需要直接new一个ClassB,它只需要定义一个私有的B对象,由相关的框架或者容器在外部把B实例化,再注入到A
<code class="java" data-origin="" <code class="java" data-origin="" 依赖注入(DI:Dependency Injection):
<code class="java" data-origin="" ClassA的运行依赖于ClassB,如果ClassB对象的获取需要ClassA自己去实现的话,常常会导致代码高度耦合。 反过来,如果ClassB对象的获取是由外部容器注入的,这个“依赖注入”的过程常常被称为控制反转(IOC:Inversion of Control),其实就是获取对象的方式变了。
<code class="java" data-origin="" 依赖注入是实现控制反转的方式之一(另一方式是依赖查找),目的就是为了让调用者和被调用者之间解耦
- <code class="java" data-origin=""
可以注入依赖的模拟实现,使得测试变得更加简单.
<code class="java" data-origin="" 依赖注入实现方式:
<code class="java" data-origin="" 1.2 ButterKnife
<code class="java" data-origin="" <code data-origin="" <code data-origin="" 1.3 AndroidAnnotations
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" 主页:http://androidannotations.org/
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" 用途:
- 使用依赖注入Views,extras,System Service,resources
- 简化线程模型
- 事件绑定
- REST Client
<code class="java" data-origin="" <code data-origin="" <code data-origin="" 配置:
<code class="java" data-origin="" <code data-origin="" <code data-origin="" 在project/build.gradle 文件中按下图所示添加代码: <code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin=""
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" 在app/build.gradle 文件中按下图所示添加代码: <code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin=""
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 注入View,注入Click事件。注意view和click事件不能是private的
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 注入系统service,设置全屏,设置WindowFeature
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 简化线程模型 @Background @UiThread
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 注意事项:
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" Manifest中注册的activity要在原类名后追加下划线
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 使用注解的控件和方法不能使用private修饰符
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 1.4 Dagger2
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 主页:https://github.com/google/dagger
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 历史:
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" Dagger1是由Square公司受到Guice(https://github.com/google/guice)启发创建的依赖注入框架.
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" Dagger2是Dagger1(https://github.com/square/dagger)的分支,由谷歌开发.
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" Dagger2的优点
- 没有使用反射,编译的时候生成中间类,性能较好
- 容易调试,完全具体地调用提供和创建的堆栈
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 配置:
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 在工程根目录的build.gradle文件中添加代码:<code class="gradle" data-origin=""
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 在app/build.gradle 文件中按下图所示添加代码:<code class="gradle" data-origin=""
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 主要的注解:
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" @Module: 用来注解一个Module类,这个类负责最终创建各种对象
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" @Provides: 用来注解module里面的方法,表明该方法可以生成一个某种类型的对象
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" @Inject:
-
-
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" @Component: 是对象使用者和对象创建者的一个桥梁。该注解通常需要一个module参数,指明哪个module最终为component生成对象。
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 使用步骤:
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 创建Module,并在其中使用Provides:<code class="java" data-origin=""
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" 创建Component: <code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin=""
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" Rebuild工程,生成对应的以Dagger开始的工具类DaggerMainComponent
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" MainActivity里面有个User字段,该字段用@Inject注解,然后用工具类DaggerMainComponent注入User对象: <code class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" dagger2使用总结:
- <code data-origin=""
<code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" 对象自己有构造器,构造器有@Inject注解
- <code data-origin=""
<code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" Component对应的Module里面有@Provider注解,返回该类型的对象
- <code data-origin=""
<code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" 注解
- <code data-origin=""
<code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" Component里面定义一个方法来返回一个对象
- <code data-origin=""
<code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" 单例
- <code data-origin=""
<code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" 延迟注入、懒加载
- <code data-origin=""
<code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" 可以注入的对象:OKHttpClient,Retrofit service,Volley RequestQueue,Dao(懒加载)
<code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" <code class="java" data-origin="" public class MainActivity extends Activity {" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,Inconsolata,Courier,monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">public class MainActivity extends Activity {
private ProductBean mProduct;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Utils.injectProduct(this);
}
}buildscript {" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">buildscript {
repositories {
mavenCentral() // 添加这一行
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //添加这一行
}
}apply plugin: 'android-apt' // 应用apt插件" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">apply plugin: 'android-apt' // 应用apt插件
dependencies {
compile 'com.jakewharton:butterknife:8.1.0'
apt 'com.jakewharton:butterknife-compiler:8.1.0'
}buildscript {" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,0)">buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}apply plugin: 'android-apt'" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">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"
}-classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,152)">'com.neenbedankt.gradle.plugins:android-apt:1.8'apply plugin: 'android-apt'" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,152)">'android-apt'
dependencies {
apt 'com.google.dagger:dagger-compiler:2.5'
'com.google.dagger:dagger:2.5'
provided 'org.glassfish:javax.annotation:10.0-b28'
}@Module" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> @Module
MainModuel {
@Provides
User provideUser() {
return new User("zhangsan",12);
}
}@Component(modules = MainModuel.class)" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> @Component(modules = MainModuel.class)
interface MainComponent {
inject(MainActivity activity);
}public class MainActivity extends AppCompatActivity {" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas,0)">AppCompatActivity {
@Inject
User user;
@Override
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MainComponent component = DaggerMainComponent.create();
component.inject(this);
}
} (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|