如何自定义注解
实现步骤
以SpringBoot的@Autowired为例,自定义一个@Autowired,实现依赖的自动注入
-
创建一个注解,添加四个必要的元注解
@Retention(RetentionPolicy.RUNTIME) //运行时注解 @Target(ElementType.FIELD) //作用于字段 @Inherited @Documented public @interface MyAutowired {}
-
创建一个Controller类和一个Service类,将一个Service变量作为Controller的变量。
public class MyController { @MyAutowired MyService myService; public void hello() { myService.hello();}}
-
基于反射,实现依赖的注入
public class Test { public static void main(String[] args) throws Exception{ Class<MyController> clazz; clazz = (Class<MyController>) Class.forName("MyController"); MyController controller = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields(); Stream.of(fields).forEach(field -> { MyAutowired myAnno = field.getAnnotation(MyAutowired.class); if (myAnno != null) { Class<?> fieldType = field.getType(); try { Object o1 = fieldType.newInstance(); field.set(controller, o1); } catch (Exception e) { e.printStackTrace(); } } }); controller.hello(); } }
-
通过以上代码,可以实现外部注入依赖,调用controller的hello方法可以正常运行
如何简单理解注解
官方定义:
- Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
- Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容
- java 支持自定义 Java 标注。
个人理解
- 注解就相当于是标签,可以作用在类、方法等元素上,也就是说,这些元素都可以打标签。
- 注解的作用和标签也类似,相当于是特征属性。所以,当需要对某些java成员打标签,做特殊备注,就可以使用注解。