开源项目合集(一) 依赖注入
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=""
主页https://github.com/JakeWharton/butterknife
- <code class="java" data-origin=""
用途: 主要用来简化各种初始化控件的操作
<code class="java" data-origin=""
配置:
<code class="java" data-origin=""
在项目根目录下build.gradle文件中添加apt编译插件:
<code class="java" data-origin=""
<code data-origin=""
<code class="java" data-origin=""
<code data-origin=""
在app/build.gradle文件中dependencies节点添加如下代码
<code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
安装Android ButterKnife Zelezny插件,安装成功以后重启Android Studio
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
布局文件中,给控件添加id属性
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
使用插件生成view注解,初始化组件
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
给Button添加点击事件
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
给ListView生成ViewHolder
<code class="java" data-origin="" <code data-origin="" <code data-origin="" 1.3 AndroidAnnotations
<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 class="java" data-origin="" <code data-origin="" <code data-origin="" <code class="gradle" data-origin="" <code class="gradle" data-origin="" 1.4 Dagger2
<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 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 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=""
还可以用来注解某个对象的成员变量,表明该成员变量可以被注入
- <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=""
@Component: 是对象使用者和对象创建者的一个桥梁。该注解通常需要一个module参数,指明哪个module最终为component生成对象。
- <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 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 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=""
对象的两种来源:
- <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=""
注解
- <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=""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;">@H_301_916@public class MainActivity extends Activity { private ProductBean mProduct; @Override protected void onCreate@H_403_939@(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //mProduct = new ProductBean("1","鞋子"); 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@H_403_939@() { 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@H_403_939@(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@H_403_939@(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MainComponent component = DaggerMainComponent.create(); component.inject(this); } } 原文链接:https://www.f2er.com/javaschema/283566.html<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=""