《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.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...
随机推荐
- CentOS 6.8 部署django项目二
CentOS 6.8 部署django项目一 1.项目部署后发现部分页面的样式丢失,是因为在nginx中配置的static路径中未包含. 解决:在settinfs.py中添加: STATIC_ROOT ...
- CentOS 6.8 部署django项目一
CentOS 6.8 部署django项目二 1.安装python3.5(默认是2.6) 参考:http://blog.csdn.net/shaobingj126/article/details/50 ...
- 用conda管理Python包
用conda管理Python包 conda是一个很好的包管理工具,在用了Anaconda之后一直不知道怎么用conda进行管理,其实很简单,就是没人教,慢慢自己摸索了一点.直接在Anaconda的命令 ...
- L0/L1/L2范数(转载)
一.首先说一下范数的概念: 向量的范数可以简单形象的理解为向量的长度,或者向量到零点的距离,或者相应的两个点之间的距离. 向量的范数定义:向量的范数是一个函数||x||,满足非负性||x|| > ...
- python中的这些坑,早看早避免。
python中的这些坑,早看早避免. 说一说python中遇到的坑,躲坑看这一篇就够了 传递参数时候不要使用列表 def foo(num,age=[]): age.append(num) print( ...
- Lucas卢卡斯定理
当$p$为素数时 $$C_n^m\equiv C_{n/p}^{m/p}*C_{n\%p}^{m\%p}(mod\ p)$$ 设$n=s*p+q,m\equiv t*p+r(q,r<=p)$ 我 ...
- IE中window的模态框与返回值
window.returnValue是javascript中html的window对象的属性,目的是返回窗口值,当用window.showModalDialog函数打开一个IE的模态窗口时,用于返回窗 ...
- SpringMVC(4.2):Controller接口控制器详解(2)
原文出处: 张开涛 4.5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4. ...
- IE 浏览器 GET 请求缓存问题
问题描述 IE 浏览器(笔者使用的版本是 IE 11)在发起 GET 请求,当参数一样时,浏览器会直接使用缓存数据,这样对于实时性有要求的数据不适用.笔者在使用 Chrome 或 FF 时发现浏览器并 ...
- react之自定义迷你redux的实现
export function createStore(reducer){ let currentState={} let currentListeners=[] function getState( ...