《Android进阶之光》--注解与依赖注入框架
No1:
标准注解:
1)@Override:覆写
2)@Deprecated:过时
3)@SuppressWarnings:取消警告
4)@SafeVarargs:申明使用了可变长度参数的方法
No2:
元注解:用来注解其他注解,从而创建新的注解
1)@Targe:注解所修饰的对象范围
2)@Inherited:注解可以被继承
3)@Documented:应该被JavaDoc工具记录
4)@Retention:保留策略
5)@Repeatable:一个注解在同一声明类型上多次使用
No3:
定义注解:
1)基本定义
public @interface Swordsman{
}
//使用
@Swordsman
public class AnnotationTest{
}
2)定义成员变量
public @interface Swordsman{
String name();
int age();
}
//使用
public class AnnotationTest{
@Swordsman(name="张无忌",age=23)
public void fighting(){
...
}
}
public @interface Swordsman{
String name() default "张无忌";
int age() default 23;
}
//使用
public class AnnotationTest{
@Swordsman
public void fighting(){
}
}
3)定义运行时注解
@Retention设定注解的保留策略
RetentionPolicy.RUNTIME:运行时动态获取注解信息
RententionPolicy.CLASS:编译时进行一些预处理操作
RententionPolicy.SOURCE:做一些检查性的操作
@Rentation(RetentationPolicy.CLASS)
public @interface Swordsman{
String name() default "张无忌";
int age() default 23;
}
No4:
运行时注解处理器
public class AnnotationProcessor{
public static void main(String[] args){
Method[] methods = AnnotationTest.class.getDeclaredMethods();
for(Method m:methods){
GET get = m.getAnnotation(GET.class);
System.out.println(get.value());
}
}
}
No5:
编译时注解处理器:
public class ClassProcessor extends AbstractProcessor{
@Override
public synchronized void init(ProcessingEnvironment processingEnv){
super.init(processingEnv);
}
@Override
public boolean process(Set<? extends TypeElement> annotations,RoundEnvironment roundEnv){
Messager messager = processingEnv.getMessager();
for(Element element:roundEnv.getElementsAnnotatedWith(BindView.class)){
if(element.getKind()==ElementKind.FIELD){
messager.printMessage(Diagnostic.Kind.NOTE,"printMessage:"+element.toString());
}
}
return true;
}
@Override
public Set<String> getSupportedAnnotationTypes(){
Set<String> annotations = new LinkedHashSet<String>();
annotations.add(BindView.class.getCanonicalName());
return annotations;
}
@Override
public SourceVersion getSupportedSourceVersion(){
return SourceVersion.latestSupported();
}
}
No6:
依赖注入:IoC(控制反转)容器在运行期间,动态地将某种依赖关系注入到对象中
No7:
为了解耦
public class Car{
private Engine mEngine;
public Car(){
mEngine = new PetrolEngine();
}
}
1)构造方法注入
public class Car{
private Engine mEngine;
public Car(Engine mEngine){
this.mEngine = mEngine;
}
}
2)Setter方法注入
public class Car{
private Engine mEngine;
public void set(Engine mEngine){
this.mEngine = mEngine;
}
}
3)接口注入
public interface ICar{
public void setEngine(Engine engine);
}
public class Car implements ICar{
private Engine mEngine;
@Override
public void setEngine(Engine engine){
this.mEngine = engine;
}
}
No8:
No9:
《Android进阶之光》--注解与依赖注入框架的更多相关文章
- Android Dagger依赖注入框架浅析
今天接触了Dagger这套android的依赖注入框架(DI框架).感觉跟Spring 的IOC差点儿相同吧.这个框架它的优点是它没有採用反射技术(Spring是用反射的),而是用预编译技术.因为基于 ...
- [Android]依赖注入框架google的dagger
分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...
- [Android]依赖注入框架squareup的dagger
分享一下Android依赖注入框架--Dagger使用 Dagger源码 Dagger1-Demo 希望能给大家的开发带来帮助.
- 07 Spring框架 依赖注入(四)基于注解的依赖注入
前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Spring基于注解的依赖注入: 信息注入注解 @ ...
- [置顶]
曙光到来,我的新书《Android进阶之光》已出版
独立博客版本请点击这里 由来 2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了 ...
- [Android]使用Dagger 2进行依赖注入 - Producers(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6234811.html 使用Dagger 2进行依赖注入 - P ...
- 依赖注入框架之dagger2
主页: https://github.com/google/dagger 历史 * Dagger1是由Square公司受到Guice(https://github.com/google/guice)启 ...
- 简单谈谈Hilt——依赖注入框架
今天继续Jetpack专题,相信不少的朋友都使用过Dagger,也放弃过Dagger,因为实在太难用了.所以官方也是为了让我们更好使用依赖注入框架,为我们封装了一个新的框架--Hilt,今天一起来看看 ...
- 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .
3.2. “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...
随机推荐
- python2的比较函数,cmp
class Shu(object): def __init__(self,ss): self.ss = ss def __str__(self): return '(%s: %s)' % (self. ...
- 三维dp
https://cn.vjudge.net/contest/245857#problem/C 代码: #include<iostream> #include<string> # ...
- Android 常用 adb 命令总结【转】
原文链接 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中 ...
- Linux磁盘分区、挂载
⒈Linux下磁盘说明 1)Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘. 2)对于IDE硬盘,使用“hdx~”标识符,“hd”代表IDE硬盘. 对于SCSI硬盘,使用“sd ...
- Django 利用管理器实现文章归档
Django管理器:class Manager 管理器是Django的模型进行数据库查询的接口,Django应用的每个模型都拥有至少一个管理器.默认情况下,Django为每个模型类添加一个名为obje ...
- 如何在linux下检测内存泄漏(转)
本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 ...
- 面向对象特征:封装、多态 以及 @propetry装饰器
(继承补充)组合 obj=fun()#对象 obj.attr=foo()#对象的属性等于另一个对象 什么是组合: A类的对象具备某一个属性,该属性的值是B类的对象 基于这种方式就把A类与B ...
- zabbix3.0.4添加对指定进程的监控
zabbix3.0.4添加对进程的监控: 主要思路: 通过 ps -ef|grep sdk-push-1.0.0.jar |grep -v grep|wc -l 这个命令来判断进程sdk-push是否 ...
- nagios监控客户端报错/usr/bin/perl^M: bad interpreter: No such file or directory
nagios服务端监控客户端内存时发现监控不上 在客户端直接执行脚本,报错如下: # /usr/local/nagios/libexec/check_memory.pl -w 6% -c 3% -ba ...
- Linux下常见音频格式之间的转换方法
Linux下常见音频格式之间的转换方法[转] 下面简单介绍下Linux环境常见音频格式之间的转换方法: MP3 相关工具: lameOGG 相关工具: vorbis-toolsAPE 相关工具: ma ...