1 无论是android的Butterknife、retrofit还是javaweb的spring框架,AOP(面向切面编程)。
这些优秀的框架,大多是用了注解、动态代理来实现。(ButterKnife没有用到反射。)
那么先说注解,说到注解要先说反射。
反射的原理如图
反射也就是通过Class.fromName(类全名)拿到类的class对象,有了这个对象就可以拿到类的所有信息了。
比如成员,构造方法,方法。。这些。
那么注解呢。
注解可以理解为标签,它和class以及interface一样,属于一种类型。
是java1.5后引入的。
而注解需要正常工作,则需要引入元注解。
元注解可以理解为注解到注解上的注解。或是一种特殊的标签。
常用的有retention和target
注解是只有属性,没有方法的。
而属性的表达方式又是无参数的方法。
有属性,就一定要给他赋值,有默认值就不用赋。
也可以用value=xx的方法来赋值。
如果没有属性,那么注解的括号要去掉。
其实java本身提供了几个现成的注解。
那么它的保留期应该是RetenPolicy.Class保留到编译进行时。
那么注解的使用,比如Butterknife。
就是把这个标签贴到类的成员view上面,然后写上注解的值是view的id。
那么怎么把这个id拿出来呢。
靠的就是反射了。
那么控制反转和依赖注入的关系是什么呢。
我的理解是依赖注入就是对象自动生成bean,不用自己new了。
而控制反转就是把自己new对象的方式交给第三方,比如spring容器。
那么控制就反转了。
那么控制反转的好处是什么呢。
对spring来说。
如果不用控制反转,那么所有的类相互依赖使用,是耦合在一起的。
类的创建和销毁,又是非常消耗资源的。
那么如果把所有要创建对象的类在spring中登记。
由spring来统一管理,控制对象的生命周期。这样耦合性就非常低并且便于管理了。
比如spring默认的注入方式是单例的。
这样类的相互使用,就不用多次创建对象消耗对象,或者每个类都写个单例麻烦。
根本目的是解耦,提高项目的可维护性。
以上。
网友评论