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. JavaScript之不规则Table转化为可定点索引td节点的网格矩阵【插件】

    由于解析课程表的缘故,有如下需求: 1. 将任意表格解析成独立的单元格矩阵[本次博文的缘由] 2. 根据矩阵坐标,确定任意一格的节点   /* 表格-->网格化 标记表格的位置及其对应的节点 * ...

  2. [C++]指针与引用(定义辨析)

    1.定义:     1.1 &-----取地址运算符         功能:返变量的内存地址        Eg:int *p,m;  定义p为指向int类型变量的指针,同时定义变量m     ...

  3. luogu P1437 [HNOI2004]尻♂砖块

    传送门 想明白了其实不难 强行瞎扯 这题的限制比较烦,导致了一行行转移几乎不能做(吧) 那么一列列转移呢? 设\(f_{i,j,k}\)表示前\(i\)列,取\(j\)个,其中第\(i\)列取从上往下 ...

  4. Python中str()和repr()函数的区别

    在 Python 中要将某一类型的变量或者常量转换为字符串对象通常有两种方法,即 str() 或者 repr() . 区别与使用函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供 ...

  5. mysql原理~二阶段提交

    一 简介:今天咱们来聊聊 mysql 两阶段提交二 事务过程    perpare-commit 两个过程1  perpare阶段 redo日志   1.设置undo state=TRX_UNDO_P ...

  6. 【转】Shell编程进阶篇(完结)

    [转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...

  7. Linux内存管理1---内存寻址

    1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...

  8. manjaro 的配置

    一.更新源的配置: 1).自动方法: 在 终端 执行下面的命令从官方的源列表中对中国源进行测速和设置 sudo pacman-mirrors -c China 2).手动方法 自动方法(上面的方法1, ...

  9. 转载:《理解OAuth 2.0》 阮一峰

    原文:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...

  10. shell脚本收集服务器基本信息并入库

    # cat check_all.sh #!/bin/bash #create by hexm @2016.6 #date=`date +%Y%m%d` #DIST_FILE=/app/healthch ...