简单回顾Android打造IOC注解

1,244 阅读2分钟

1.IOC(控制反转)

控制反转 简单说就是,我们要使用一个类的对象,通常情况都是直接在类里面通过构造函数new一个对象出来。会出现一个现象,如果很多类,又要创建各种对象,就会有各种依赖,导致维护能力差。而 IOC 就是使用容器帮助我们去创建对象,然后在注入到类。

2.跟我们平常说的依赖注入是什么关系

2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢”,其实研究后发现就是 获得的依赖对象 反转了。,就取了一个名字依赖注入,就是经常说的DI,。

依赖注入 和 控制反转是从不同的角度描述同一件东西,实现对象之间的解耦。

3.注解 比如有一个自定义的注解 @InjectLayout(R.layout.activity_main) 如下图: @Target 就是注解用在哪里,是标注在类上面、方法上面还是其他的 @Retention 是生效的时间是在运行时、编译时、或者源代码时

写完一个自定义注解的使用效果:

1.首先我们定义一个布局的注解类

2.再新建一个注解管理类,用来写注解的功能的具体实现:

3.既然 injectXML(Object)这个方法是实现布局注入的,传入的是当前的Activity, 那么就可以分为几个步骤: 一:获取Activity类的InjectLayout注解; 二:获取注解里面的值,也就是布局ID 三:调用setContentView函数

4.对于控件的注解其实是一样的

利用反射去获取Annotation-》value->findViewById->反射注入属性

对于事件注入-〉可以使用:动态代理

关于:ButterKnife:

是用到了注解处理器,涉及annotationProcessor技术,和 APT(Annotation Processing Tool)技术类似,然后对注解进行解析处理,进而得到要生成的类的必要信息,然后根据这些信息动态生成对应的 java 类,至于如何生成 java 类就涉及到JavaPoet技术。

使用时通过生成的辅助类完成操作,并不是在项目运行时通过注解加反射实现的,所以并不会影响项目运行时的性能,可能仅在项目编译时有略微的影响,可以去看看源码。