注解的学习
一、编写注解
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface XxxXxx {
}
二、注解生效(注解的处理类)
此处设计3个类
- XxxXxxProcessor.class
- XxxXxxHandle.java
- XxxXxxPool将原target转换成有@ImpXxxx(RPC有关的注解)的对象
以@XxxXxx为例
逻辑如下:
首先使用XxxXxxProcessor.class继承BeanPostProcessor在bean初始化的过程中就进行判断该bean是否有目标注解@XxxXxx
- 如果目标注解为空则直接返回bean
- 如果不为空,反射得到该类的所有字段
- 字段为空返回bean
- 字段不为空,遍历所有的字段,获得所有的注解,如果有标注目标注解的则由Proxy.newProxyInstance创建代理实例 ,代理实例的第三个参数为XxxXxxHandle.class类的对象,该类的target此处调用了 XxxXxxPool.java的方法实现对原target进行转换成加了@ImpXxxx的对象,后面该字段的方法调用都使用转换后target的方法
- 给bean对象的上述字段赋值为代理对象,返回bean