Dagger 之外的第二个选择

13 篇文章 0 订阅
1 篇文章 0 订阅

injectMVP

项目背景

依赖注入或者控制反转思想已经体现在了java web的spring框架中,在android中有关注入的开源项目主要有Dagger2,还有Arouter,但arouter不是专门去做注入的工作,暂不比较.Dagger2比较优秀。在android中MVP是最合适使用依赖注入的场景。但Dagger2有一个缺点,就是比较繁琐,这个框架就是简化这个过程,达到轻量级的效果。

Compare
Dragger2的使用demo

需要一个module 类,一个Component接口配合,简化的代码如下;

@Module
public class MainModule {
    private IView mIView;

    public MainModule(IView IView) {
        mIView = IView;
    }

    @Provides
    @ActivityScope
    public IView provideIView(){
        return this.mIView;
    }
}

@ActivityScope
@Component(modules = MainModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}

public class MainActivity extends AppCompatActivity implements IView{

    @Inject
    MainPresenter mMainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerMainComponent
                .builder()
                .mainModule(new MainModule(this))
                .build()
                .inject(this);
        mMainPresenter.loadData();
    }

    @Override
    public void loadSucc() {

    }
}

从代码层面来说,为了注入一个MainPersenter,要写这么多代码,有种不如不用的感觉,甚至在注入的时候出现new MainModule(this)这样的代码,按照道理这个过程应该交由容器来解决,不该暴露该用户的.

injectMvp的demo

无需配合类,一行代码实现注入过程,面向接口,不面向具体。

public interface IPresenter  {
    public void loadData();

    public void bindView(IView iView);

    public void unBindView();
}
@Compont(version = 1)
public class MainPresenter2 implements IPresenter {
    private IView mIView;

    @Override
    public void bindView(IView iView) {
        mIView = iView;
    }

    @Override
    public void unBindView() {
        mIView = null;
    }

    @Override
    public void loadData() {
        mIView.loadSucc();
    }

}
public class MainActivity extends AppCompatActivity implements IView{
   @AutoWired
   IPresenter mIPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InjectManager.getInstance().init(getApplication());//放入application中初始化即可
        InjectManager.getInstance().inject(this);

        mIPresenter.bindView(this);
        mIPresenter.loadData();
    }

    @Override
    public void loadSucc() {

    }
}
小结一下

injectMVP的处理依赖注入达到注入效果,比较简洁,版本可追述,也遵循了面向接口的思想,但是还是有可提高的地方。下面是具体的介绍以及使用方法。

Configuration
  1. Adding maven url
allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven {
            url "https://jitpack.io"
        }
        maven { url 'https://dl.bintray.com/josehan1989/maven' }
    }
}
  1. Adding dependencies and configurations

    dependencies {
        implementation 'com.ca.inject:api:1.0.2'
        annotationProcessor 'com.ca.inject:compile:1.0.2'
        implementation 'com.ca.inject:annotation:1.0.1'
    }
    
  2. Add annotation

    @Compont(version = 1)
    public class MvpPresenter implements IPresenter {
        ...
    }
    
  3. 初始化

    public class MyApp extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            InjectManager.getInstance().init(this);
        }
    }
    
Advanced usage
  1. AutoWire a field

    public class MvpActivity extends AppCompatActivity implements IView{
    
        @AutoWired
        IPresenter mPresenter;
        TextView tv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_mvp);
            InjectManager.getInstance().inject(this);
            mPresenter.bind(this);
            tv = findViewById(R.id.tv);
            mPresenter.getTitle();
        }
    
        @Override
        public void refreshTitle(String title) {
            tv.setText(title);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mPresenter.unBind();
        }
    }
    
More features
  1. 高版本会覆盖低版本,只要往注解定义version就可以。

    @Compont(version = 2)
    public class MvpPresenter2 implements IPresenter {
       ...
    }
    
  2. 有一个情况特殊,就是高版本的实现是通过继承而不是实现接口的方式,就要额外增加一个KEY,显示指出根接口(后续定义key的返回时class类型,可以不用制定key,将更方便)

@Compont(version = 3,key = MvpPresenter3.KEY)
public class MvpPresenter3 extends MvpPresenter2 {
    public static final String KEY = "com.hansj.lo.demo.IPresenter";

    public MvpPresenter3(){
        init();
    }

    @Override
    public void getTitle() {
        mIView.refreshTitle("nihaoma");
    }

}
In the last

github url:injectMVP,有兴趣的朋友,加入这个项目吧,让这个项目成为Dagger2之外的第二个选择。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值