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:

《Android进阶之光》--ButterKnife

No9:

《Android进阶之光》--Dagger2

《Android进阶之光》--注解与依赖注入框架的更多相关文章

  1. Android Dagger依赖注入框架浅析

    今天接触了Dagger这套android的依赖注入框架(DI框架).感觉跟Spring 的IOC差点儿相同吧.这个框架它的优点是它没有採用反射技术(Spring是用反射的),而是用预编译技术.因为基于 ...

  2. [Android]依赖注入框架google的dagger

    分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...

  3. [Android]依赖注入框架squareup的dagger

    分享一下Android依赖注入框架--Dagger使用 Dagger源码 Dagger1-Demo 希望能给大家的开发带来帮助.

  4. 07 Spring框架 依赖注入(四)基于注解的依赖注入

    前面几节我们都在使用xml进行依赖的注入,但是在实际的开发中我们往往偏爱于使用注解进行依赖注入,因为这样更符合我们人的思维,并且更加快捷,本节就来讲述Spring基于注解的依赖注入: 信息注入注解 @ ...

  5. [置顶] 曙光到来,我的新书《Android进阶之光》已出版

    独立博客版本请点击这里 由来 2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了 ...

  6. [Android]使用Dagger 2进行依赖注入 - Producers(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6234811.html 使用Dagger 2进行依赖注入 - P ...

  7. 依赖注入框架之dagger2

    主页: https://github.com/google/dagger 历史 * Dagger1是由Square公司受到Guice(https://github.com/google/guice)启 ...

  8. 简单谈谈Hilt——依赖注入框架

    今天继续Jetpack专题,相信不少的朋友都使用过Dagger,也放弃过Dagger,因为实在太难用了.所以官方也是为了让我们更好使用依赖注入框架,为我们封装了一个新的框架--Hilt,今天一起来看看 ...

  9. 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .

    3.2.    “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...

随机推荐

  1. python2的比较函数,cmp

    class Shu(object): def __init__(self,ss): self.ss = ss def __str__(self): return '(%s: %s)' % (self. ...

  2. 三维dp

    https://cn.vjudge.net/contest/245857#problem/C 代码: #include<iostream> #include<string> # ...

  3. Android 常用 adb 命令总结【转】

    原文链接 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中 ...

  4. Linux磁盘分区、挂载

    ⒈Linux下磁盘说明 1)Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘. 2)对于IDE硬盘,使用“hdx~”标识符,“hd”代表IDE硬盘.   对于SCSI硬盘,使用“sd ...

  5. Django 利用管理器实现文章归档

    Django管理器:class Manager 管理器是Django的模型进行数据库查询的接口,Django应用的每个模型都拥有至少一个管理器.默认情况下,Django为每个模型类添加一个名为obje ...

  6. 如何在linux下检测内存泄漏(转)

    本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 ...

  7. 面向对象特征:封装、多态 以及 @propetry装饰器

    (继承补充)组合 obj=fun()#对象 obj.attr=foo()#对象的属性等于另一个对象 什么是组合:     A类的对象具备某一个属性,该属性的值是B类的对象   基于这种方式就把A类与B ...

  8. zabbix3.0.4添加对指定进程的监控

    zabbix3.0.4添加对进程的监控: 主要思路: 通过 ps -ef|grep sdk-push-1.0.0.jar |grep -v grep|wc -l 这个命令来判断进程sdk-push是否 ...

  9. 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 ...

  10. Linux下常见音频格式之间的转换方法

    Linux下常见音频格式之间的转换方法[转] 下面简单介绍下Linux环境常见音频格式之间的转换方法: MP3 相关工具: lameOGG 相关工具: vorbis-toolsAPE 相关工具: ma ...