通用的依赖注解

前端之家收集整理的这篇文章主要介绍了通用的依赖注解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

开源项目合集(一) 依赖注入

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=""
    set方法。给外部容器的一个接口,传入依赖的对象。
  • <code class="java" data-origin=""
    基于构造函数。在新建对象时,传入依赖的对象。
  • <code class="java" data-origin=""
    基于Java的注解(Annotation)功能

<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=""

    配置:
    1. <code class="java" data-origin=""

      在项目根目录下build.gradle文件添加apt编译插件:
      <code class="java" data-origin="" 
      <code data-origin="" 
    2. <code class="java" data-origin=""

      <code data-origin="" 
      在app/build.gradle文件中dependencies节点添加如下代码
      <code class="java" data-origin="" 
      <code data-origin="" 
      <code data-origin="" 
    3. <code class="java" data-origin=""

      <code data-origin="" 
      <code data-origin="" 
      安装Android ButterKnife Zelezny插件,安装成功以后重启Android Studio
    4. <code class="java" data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      布局文件中,给控件添加id属性
    5. <code class="java" data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      使用插件生成view注解,初始化组件
    6. <code class="java" data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      给Button添加点击事件
    7. <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 class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    主页:http://androidannotations.org/
  • <code class="java" data-origin=""
    <code data-origin="" 
    <code data-origin="" 
    用途:
          
          
    1. 使用依赖注入Views,extras,System Service,resources
    2. 简化线程模型
    3. 事件绑定
    4. REST Client
  • <code class="java" data-origin=""

    <code data-origin="" 
    <code data-origin="" 
    配置:
    1. <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="" 
    2. <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="" 
    3. <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的
    4. <code class="java" data-origin=""
      <code data-origin="" 
      <code data-origin="" 
      <code class="gradle" data-origin="" 
      <code class="gradle" data-origin="" 
      注入系统service,设置全屏,设置WindowFeature
    5. <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="" 
    配置:
    1. <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="" 
    2. <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="" 
        可以用来注解类的构造函数,表明该类可以被自动创建并注入到其它类中
      • <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="" 
      @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="" 
    使用步骤:
    1. <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="" 
    2. <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="" 
    3. <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
    4. <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="" 
    对象的两种来源:
  1. <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注解
  2. <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="" 
    对象获取的两种方式:
  1. <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="" 
    注解
  2. <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;">@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

猜你在找的设计模式相关文章