Dagger2快速上手系列一

本文介绍Dagger2依赖注入框架的基本概念、使用原因及如何在项目中实施。通过对比传统方式,展示Dagger2如何简化代码维护,降低耦合度,使项目结构更清晰。

学习札记:Dagger2快速上手系列一
学习札记:Dagger2快速上手系列二

一.什么是Dagger2

Dagger2是Dagger的升级版,是一个依赖注入框架,第一代由大名鼎鼎的Square公司共享出来,第二代则是由谷歌接手后推出的,现在由Google接手维护,传送门Dagger2的GitHub地址

二.为什么使用Dagger2

上面我们说到,Dagger2是一个依赖注入框架,那什么是依赖注入呢,可以抽象的理解为其实就是将一个类里面包含另外一个类实例的引用。
我们常用的在属性,方法中参数 ,甚至通过接口中抽象方法中的参数等方式都可以实现依赖注入,那为什么还要使用Dagger2呢,当然如果是单兵作战,项目不大的话,不用也没关系,但是在项目很大,协同工作中,建议还是使用Dagger2,因为你会发现它会让你的项目结构清晰,维护起来也更加方便,降低代码耦合度,另外它是编译时生成一些代码,也不会产生性能影响。

三.如何使用Dagger2

1.配置:在项目app目录下build.gradle的dependencies中加入这两行
annotationProcessor ‘com.google.dagger:dagger-compiler:2.24’
implementation ‘com.google.dagger:dagger :2:2.24’

2.配置完以后,我们通过一个简单的例子来走一遍,看一下Dagger2到底哪里好用了。
这个说一个简单的场景,比如我们在做注册的时候,需要本地和服务器存一些数据,我们会有一个管理类,
分别持有本地和服务器操作的类的实例。

/**
管理类
**/
public class SUserManager {
  	SApiService apiService;
    SUserStore userStore;
    public SUserManager( SApiService apiService,  SUserStore userStore) {
        this.apiService =apiService;
         this.userStore =userStore;
    }
   public void register() {
        apiService.register();
        userStore.register();
    }
} 
/**
服务器操作
**/
public class SApiService {
    public SApiService() {
        Log.d(TAG, "SApiService: ");
    }

    public void register(){
        Log.d(TAG, "register: >>>>>>>");
    }
} 
/**
本地操作
**/
public class SUserStore {
    public SUserStore() {
            Log.d(TAG, "SUserStore: ");
    }
    public void register() {
        Log.d(TAG, "register: >>>>>>>>");

    }
}

一般情况下我们都会这么去写,然后在需要引用UserManager地方实例化一个对象,然后进行操作,这样当然也没什么问题,但是如果说我们做一下简单的调整,比如说我在注册的时候需要修改一下本地注册时的参数,就比如说一个上下文对象吧,这个时候是不是要修改UserManger,在调用UserManager实例中的也会去修改。项目小还稍微好点,要是项目大,需要改的东西可能就很多了,甚至会出错,所以Dagger2就是为了处理这些问题。
那么该如果使用Dagger2来解耦呢,让项目结构更清晰呢。首先我们来看张图
l
其实就是我们通过被component注解的接口将被Module注解工厂中的生成的对象注入到Activity等容器中。我们通过代码理解下这句话。
首先我们要搞个纽带,也就是被component注解的接口。

@Component(modules = {SUserModule.class})
public interface SUserComponent {

    void inject(MainActivity activity);
}


我们在这里支持持有了Activity中引用,并且在Component引入了SUserModule这个“对象工厂”

@Module
public class SUserModule{
  @Provides
    public SUserStore provideSuserStrore() {
        return new SUserStore ();
    }
    @Provides
    public SApiService provideApiService() {
        return new SApiService();
    }
  @Provides
    public SUserManager provideUserManager(SApiService apiService, SUserStore userStore) {

        return new SUserManager(apiService, userStore);

    }
}

我们在MainActivity中使用Inject注解需要注入的对象实例,然后编译通过后,使用SUserComponent.create().inject(this),注入就可以使用了。


public class MainActivity extends AppCompatActivity {

    @Inject
    SUserManager daggerUserManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     	DaggerSUserComponent.create().inject(this);
        daggerUserManager.register();
    }
}

这样咋一看,是变得复杂了,代码越写看起来越多,但是实际上当你SUserManager 被多个地方引用时,你基本上只需要改一下SUserModule这个里面的代码,这样是不是让你的代码维护起来更加的方便,结构看起来也更加清晰。
好了,简单的使用就说完了,我们来做个简单的总结。上面我们主要用到了四个注解,@Module @Provides
@Component @Inject,下面梳理下这几个注解使用:
@Module:用来注解生成对象的工厂,让Dagger2知道从哪里去找对象;
@Provides:用在module工厂中方法的注解,告诉Dagger2我们想要构造对象并提供这些依赖;
@Component:如上图中描述,是一个纽带;
@Inject:通常在需要依赖的地方注解。

暂时只整理这么多,本文如果有不正之处,烦请之处,感谢感谢!

源码链接: https://pan.quark.cn/s/fa13cd6c6c8d Chrome浏览器作为款备受青睐的网页浏览器,凭借其出色的稳定性和运行速度获得了广泛认可。 然而出于安全考量,Chrome系统默认不兼容ActiveX插件,因为ActiveX技术主要应用于Internet Explorer,它赋予网页内容与用户本地系统交互的能力,但同时也可能引发潜在的安全隐患。 不过在某些特定工作场景下,比如在企业内部网络环境或需要与老旧应用程序整合时,可能仍需在Chrome中启用ActiveX控件。 为此我们必须掌握在Chrome浏览器下加载和运用ActiveX的方法。 首先需要明确ActiveX的本质。 ActiveX是由微软设计的种技术框架,旨在开发可在网页环境中运行的控件,这些控件能够完成多种功能,包括视频播放、应用程序组件运行或与硬件设备通信等。 ActiveX控件多以OCX(OLE控件)格式发布。 在Chrome浏览器中启用ActiveX需要采取额外措施,因为该浏览器本身并不支持此项技术。 以下是几种常见的解决方案: 1. **应用Chrome的兼容性设置**:部分Chrome版本提供了" --enable-internal-activex"命令行参数,可通过此参数使浏览器具备加载ActiveX控件的能力。 用户可在启动Chrome时,于快捷方式的目标路径后附加该参数来激活此功能。 例如:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --enable-internal-activex。 2. **安装第三方插件**:市面上存在些第三方插件,例如"IE Tab"或"ActiveX Con...
标题SpringBoot与微信小程序结合的健康饮食平台研究AI更换标题第1章引言介绍健康饮食平台的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述健康饮食平台在当前社会的重要性及其市场需求。1.2国内外研究现状分析国内外健康饮食平台的发展现状及趋势。1.3研究方法及创新点概述本文采用的研究方法和技术创新点。第2章相关理论总结健康饮食、SpringBoot及微信小程序的相关理论。2.1健康饮食理论介绍健康饮食的基本原则和营养学知识。2.2SpringBoot框架阐述SpringBoot框架的特点、优势及在项目中的应用。2.3微信小程序技术介绍微信小程序的开发技术、特点及其用户群体。第3章健康饮食平台设计详细介绍健康饮食平台的设计方案,包括前端和后端设计。3.1平台架构设计给出平台的整体架构、模块划分及交互流程。3.2数据库设计介绍数据库的设计思路、表结构及数据关系。3.3前后端交互设计阐述前后端数据交互的方式、接口设计及安全性考虑。第4章微信小程序实现介绍微信小程序的具体实现过程,包括页面设计、功能实现等。4.1页面设计与布局给出微信小程序的页面设计思路、布局及交互效果。4.2功能实现与测试详细介绍微信小程序各项功能的实现过程及测试方法。4.3用户体验优化阐述如何提升微信小程序的用户体验,包括界面优化、性能优化等。第5章平台测试与优化对健康饮食平台进行测试,并根据测试结果进行优化。5.1测试环境与数据介绍测试环境、测试数据及测试方法。5.2测试结果分析从功能、性能、用户体验等方面对测试结果进行详细分析。5.3平台优化策略根据测试结果提出平台优化策略,包括代码优化、功能改进等。第6章结论与展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括本文的主要研究结论和平台实现效果。6.2展望指出本文研究的不足之处以及未来研究的方向和改进点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值