Android 依赖注入之Dagger

来源:互联网 发布:spring源码视频 编辑:程序博客网 时间:2024/05/16 05:58

简介

最近Dagger这套android的依赖注入框架比较多人关注,感觉跟后端Spring 框架的IOC差不多。这个框架它的好处是它没有采用反射技术(Android 中的Butterknife和后端的Spring都是用反射),而是用预编译技术,因为基于反射的框架会非常耗用资源。

开发配置

  • 第一步

    在项目的buidl.grader中添加:

        dependencies {            classpath 'com.android.tools.build:gradle:2.1.2'            //3.添加dagger需要的依赖            classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'        }
  • 第二步

    在app的buidl.grader中添加:

        apply plugin: 'com.neenbedankt.android-apt' //1.添加dagger需要的依赖        ....        ....        dependencies {            compile fileTree(dir: 'libs', include: ['*.jar'])            testCompile 'junit:junit:4.12'            compile 'com.android.support:appcompat-v7:24.1.1'            //2.添加dagger需要的依赖            provided 'org.glassfish:javax.annotation:10.0-b28'            compile 'com.google.dagger:dagger:2.5'            compile 'com.google.dagger:dagger-compiler:2.5'        }
  • 第三步

    重新构建项目

简单使用

在MainActivity中我们需要用到UserService这个类的登录方法。以前的思路就是new UserService()对象,然后调用对象中的方法。现在我们使用依赖注入就不需要手动new UserService()这个对象了,而直接通过注解就可以实例化UserService这个对象。看下面代码:

    @Inject    UserService userService;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //初始化view        btn_login=(Button)findViewById(R.id.btn_login);        ed_userName=(EditText)findViewById(R.id.ed_userName);        ed_password=(EditText)findViewById(R.id.ed_password);        //获取用户名与密码        userName= ed_userName.getText().toString().trim();        passWord = ed_password.getText().toString().trim();        //依赖注入         DaggerActivityComponent               .builder()               .activityModule(new ActivityModule())               .build()               .inject(this);        //点击登录        btn_login.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //userService对象直接通过Inject来注入,不需要new对象了                boolean loginResult = userService.login(userName,passWord);                Toast.makeText(MainActivity.this,"loginResult="+loginResult,Toast.LENGTH_SHORT).show();            }        });    }

真的好像Spring中IOC,直接通过注解就是实现对象的创建,太叼了。那么这个中功能到底是如何实现的呢?

依赖实现分析

第一步

  • 新建一个UserService
        public class UserService {            public boolean login(String userName,String password){                if("liujun".equals(userName)&&"123123".equals(password)){                    return true;                }else{                    return false;                }            }        }

该对象是准备注入到MainAcitivty中使用

第二步

  • 新建一个Module
        @Module        public class ActivityModule {            @Provides            UserService provideUser() {                //产生对象(依赖)                return new UserService();            }        }

@Module 是用来标记这个类是:一个用来产生依赖的组件。
例如产生:UserService的依赖。(依赖其实就是对象的意思)

第三步

  • 新建一个Component
        @Component(modules = ActivityModule.class)        public interface ActivityComponent {            void inject(MainActivity mainActivity);        }

@Component是用来标记这个类是:是将依赖注入到需要依赖中的组件(依赖其实就是对象的意思)
例如:MainActivity中需要一个依赖:UserService。这个依赖是在ActivityModule中产生,那么ActivityComponent的作用就是一个桥梁:是将依赖注入到需要依赖中的组件

第三步

  • make project 作用就是自动生成:DaggerActivityComponent类

第四步

  • 在MainActivity使用依赖注入对象
        @Inject        UserService userService;//需要对象        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_main);            //初始化view            btn_login=(Button)findViewById(R.id.btn_login);            ed_userName=(EditText)findViewById(R.id.ed_userName);            ed_password=(EditText)findViewById(R.id.ed_password);            //获取用户名与密码            userName= ed_userName.getText().toString().trim();            passWord = ed_password.getText().toString().trim();            //依赖注入(将产生的对象注入到需要对象中的组件)             DaggerActivityComponent                   .builder()                   .activityModule(new ActivityModule())                   .build()                   .inject(this);            //点击登录            btn_login.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View view) {                    //userService对象直接通过Inject来注入,不需要new对象了                    boolean loginResult = userService.login(userName,passWord);                    Toast.makeText(MainActivity.this,"loginResult="+loginResult,Toast.LENGTH_SHORT).show();                }            });        }

项目下载github

1 0