前言
在刚学java web开发的时候,我第一次看到注解不是在java里,而是在spring里,于是很长一段时间里,我都认为注解是spring特有的技术,后来用到mybatis的时候,发现也有不少注解,再加上经常在java中看到的@Override之类的,才怀疑注解是不是java的东西。可是怀疑归怀疑,但是开发都快一年多了,从来没有想过去了解注解这个东西,更别说开发自己的注解了。
Java注解介绍
近来,项目中有许多额外的xml文件,我一直认为这是非常不好的,联想到spring可以将applicationContext.xml中的东西用注解写进类中,于是在想是不是也可以试试开发自己的注解。
首先,来看java里面的annotation包。
从IDE的标志就可以看出来,有四个注解隐藏在其中,这四个注解正是java的元注解,也就是”注解的注解“。它们依次是:
1.Document:没有参数,就是表明将这个注解包含在javadoc中
2.Inherited:没有参数,表明可以被继承
3.Retention:有参数(可选项就在下一个RerentionPolicy中),表明该注解可以被什么级别保存
1.Source:源码级别,也就是说这个注解就是给编译器看看的,看完就扔了,不会被编译,也就是在.class文件中是找不到的,比如@Override
2.Class:能在class文件中找到,但是在VM运行时是找不到的。这个是默认级别。
3.Runtime:在VM运行时都能保留,因此可以通过java反射机制来读取注解信息,一般来说这个用的最多。比如:@Value、@Controller、@Bean
4.Target:有参数(可选项在ElementType中),表明该注解可以被放在类的哪个层面上,默认是全部。
有了这几个,就已经可以开发自己的注解了,试一下:
@Retention(RetentionPolicy.RUNTIME) public @interface Info { String book() default ""; } public class Book { @Info(book = "Thinking in java") String bookName; public String getName(){ return bookName; } public static void main(String[] args) { Field[] fields = Book.class.getDeclaredFields(); for (Field field : fields){ if(field.isAnnotationPresent(Info.class)){ Info info = field.getAnnotation(Info.class); Book book = new Book(); book.bookName = info.book(); System.out.println(book.getName()); } } } }
简单到爆,当然稍微需要有点java的反射基础知识。一般我们用spring,mybatis之类的框架注解时,不用写这些解析反射的代码,是因为框架帮我们做好了。