之前在工作中写过自定义注解,但长时间不用忘记了。今天又写了一次,所以来这里记录一下,以防再次忘记还要重新再查。\n\nJava5.0定义的元注解基础:\n\n 1.@Target 标注注解可以放在什么位置\n 2.@Retention 标注注解保留时间\n 3.@Documented 标注注解可以被文档化\n 4.@Inherited 标注了可以被子类继承\n\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\n@Component\npublic @interface DataServer {\n String value();\n}\n自定义注解上加上@Component后,可以被spring自动扫描到\n\n接口定义如下:\n\npublic interface Test1{\n String test1();\n}\n\n接口实现如下:\n\n@DataServer("test")\npublic class Test implements Test1 {\n @Override\n public String test1() {\n return "------------------test1 run--------------------------";\n }\n}\n在springboot中,可以通过实现ApplicationContextAware接口将标注了自定义注解的类对象取出。\n\n@Component\npublic class SystemConfig implements ApplicationContextAware {\n //定义静态变量接收被标注自定义注解的对象\n public static Map\u003CString,Object> serverMap = new HashMap\u003C>();\n @Override\n public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {\n //从上下文中取出被自定义注解标注的对象\n serverMap = applicationContext.getBeansWithAnnotation(DataServer.class);\n }\n}\nserverMap中是以注解的value为key,以标注注解的对象为value保存。\n\n这样客户端可以传递注解值,然后服务器中可以取出对象,通过反射调用对象方法。rpc正是以这种流程进行调用的。\n\nObject o = serverMap.get(message);\nObject res = null;\ntry {\n Method test1 = o.getClass().getMethod("test1");\n res = test1.invoke(o,null);\n} catch (NoSuchMethodException e) {\n e.printStackTrace();\n} catch (IllegalAccessException e) {\n e.printStackTrace();\n} catch (InvocationTargetException e) {\n e.printStackTrace();\n}\n关于自定义注解,可以参考以下贴子:\n\nhttps://blog.csdn.net/yjclsx/article/details/52101922 深入JAVA注解(Annotation):自定义注解\n\nhttps://blog.csdn.net/zt15732625878/article/details/100061528 Java实现自定义注解