注解与依赖注入框架
2019-11-18 23:21:22 21 举报
AI智能生成
登录查看完整内容
android 注解依赖 简介 留言发demo
作者其他创作
大纲/内容
注解与依赖注入框架 by 姚鑫 留言邮箱发demo
File
Project Structure
更新框架组件
1
添加库或依赖
Dagger2
添加依赖库
annotationProcessor 'com.google.dagger:dagger-compiler:2.25.2' implementation 'com.google.dagger:dagger:2.25.2'
@Inject
是JSR-330标准的一部分,用于标记需要注入的依赖
JSR-330标准
@Component
理解为注入器,它会把目标类依赖的实例注入到目标类中
@Component(modules = GsonModule.class)
只可以定制多个modules
dependencies
注入目标Activity
@Module
讲@Module标注类上,用来告诉Component可以从这个类中获取依赖对象
@Provides
标记在方法上,表示可以通过这个方法来获取依赖对象的实例
注:如果没有DaggerDaggerActivityComponent编译类,先Clean Project ,再Make Project
@Named
是Qualifier的一种实现
@Qualifier
限定符
当有两个相同的依赖时,它门都继承一个父类或者均实现同一个接口,需要约定使用哪一个
修改Car类
@Scope
用来自定义注解
mainfest配置application
全局单例
@Singleton
用来配合实现局部单例或全局单例的
懒加载
在@Inject的时候不初始化,而是在使用的时候,调用get方法来获取实例
注解
注解分类
标准注解
@Override
对覆盖超类中的方法进行标记
@Deprecated
对不估计使用或者已过时的方法添加注解
@SuppressWarnings
选择性地取消特定代码段中的警告
@SafeVarargs
JDK7新增,用来生命使用了可变长度参数的方法
元注解
@Targe
注解所修饰的对象范围
取值类型
ElementType.TYPE
能修饰类,接口或枚举类型
ElementType.FIELD
能修饰成员变量
ElementType.METHOD
能修饰方法
ElementType.PARAMETER
能修饰参数
ElementType.CONSTRUCTOR
能修饰构造方法
ElementType.LOCAL_VARIABLE
能修饰局部变量
ElementType.ANNOTATION_TYPE
能修饰注解
ElementType.PACKAGE
能修饰包
ElementType.TYPE_PARAMETER
类型参数声明
ElementType.TYPE_USE
使用类型
@Inherited
表示注解可以被继承
@Documented
表示这个注解应该被JavaDoc工具记录
@Retenion
用来生命注解的保留策略
RetenionPolicy.SOURCE
源码级注解
注解信息只会保留在.java源码中
源码在编译后,注解信息被丢弃,不会保留在.classs中
RetenionPolicy.CLASS
编译时注解
注解信息会保留在.java源码以及.class中
当运行Java程序时,JVM会丢弃该注解信息,不会保留在JVM中
RetenionPolicy.RUNTIME
运行时注解
当运行Java程序时,JVM也会保留该注解信息,可以通过反射获取该注解信息
@Repeatable
JDK8新增,允许一个注解在同一声明类型(类,属性或方法)上多次使用
定义注解
基本定义
定义新的注解类型使用@interface关键字
public @interface Swordsman { } @Swordsman public class AnnotationTest { }
定义成员变量
注解只有成员变量,没有方法
注解的成员变量在注解定义以“无形参的方法”形式来生命
使用默认值default
使用默认值可以不为变量指定值
定义运行时注解
@Retenion来设定注解的保留策略
生命周期
SOURCE<CLASS<RUNTIME
示例
定义编译时注解
注解处理器
运行时注解处理器
反射方式
编译时注解处理器
编写注解处理器
建立一个Java Library来存放注解处理器
project右键 new -> module ->Java Library
配置build.gradle
引用注解包
implementation project(path: ':annotations') 引用其他包的类要这么写
编写类继承AbstartProcessor
init:被注解调用工具
process:相当与每个处理器的主函数main()
getSupportedAnnotationTypes:这是必须指定的方法,指定这个处理器是注册给哪个注解的
getSupportedSourceVersion:用来指定你使用的Java版本
注册注解处理器
添加开源库
implementation 'com.google.auto.service:auto-service:1.0-rc6'
给注解类添加注解
@AutoService(Processor.class)
应用注解
在主工程项目引用注解
implementation project(path: ':annotations') implementation project(path: ':processor')
在MainActivity应用注解
@BindView(value = R.id.tv_text) TextView tv_text;
先Clean Project 再 MakeProject
使用android-apte插件
annotationProcessor project(path:':processor')
为啥要使用
主项目app引用了processor库,但注解处理器只在编译处理期间需要用到,编译后就没有实际作用了,而主项目添加了这个库引入了不必要的文件
作用
仅仅在编译时期去依赖注解处理器所在的函数库并进行工作,但不会打包到APK中
为注解处理器生成的代码设置好路径,以便Android studio能够找到它
ButterKnife
简介
它可以减少大量的findViewById以及setOnClickListener代码,简化代码并提升开发效率
使用方法
implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
如果引入版本10
implementation 'com.jakewharton:butterknife:10.2.0' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
报错解决
manifest添加节点
xmlns:tools=\"http://schemas.android.com/tools\"
application节点添加
android:appComponentFactory=\"\" tools:replace=\"android:appComponentFactory\"
绑定控件
@BindView
用@BindView绑定控件id
onCreate添加ButterKnife.bind(this);
@BindViews
绑定多个控件
绑定资源
@BindString
@BindArray
@BindBool
@BindColor
@BindDimen
@BindDrawable
@BindBitmap
绑定监听
@onClick
@onLongClick
@onTextChanged
@onTouch
@OnItemClick
可选绑定
@Nullable
如果找不到目标资源,则会引发异常,防止异常可添加@Nullable
在Fragment和Adapter中使用ButterKnife
Fragment
Adapter
0 条评论
回复 删除
下一页