spring annotation简述
一、Annotation基本概念
Annotation是jdk5以后出现的新特性,在jdk中,其内置了许多自己的Annotation,例如@Override,@SuppresWarning,@Deprecated等等,其中一些Annotation是标志性的Annotation,例如@Override就是表示这个类要重写父类的方法。
我们首先要清楚的知道一点,其实Annotation和Class、Interface这些一样,都是类级别的,而且我们创建的每一个Annotation都默认的继承了java.lang.annotation.Annotation这个接口,注意:如果一个接口继承了这个Annotation接口,那么这个接口并不是一个Annotation。
我们接下来自己创建一个简单的Annotation:
public @interface MyAnnotation { String value(); String name() default "xiaoluo"; }
这样就定义了我们自己的一个Annotation了,它的标识符就是 @interface,同样,Annotation里面可以定义我们的属性,例如,上面的例子我就定义了两个String类型的属性,一个是value属性,一个是name属性,注意:在Annotation里定义属性,属性后面都要加上括号。同时我们还可以给Annotation的属性设置默认值,通过 default 这个关键字来设置默认值,接下来我们就可以使用我们自己定义的Annotation了:
.gif)
@MyAnnotation(value="hello", name="world") public class AnnotationTest { @MyAnnotation("xiaoluo") public void hello() { System.out.println("This is my Annotation!"); } }
我们看到,这个时候我们就可以在类上面、方法上面使用我们的Annotation了,注意:在自己定义的Annotation中,如果为其设置了属性,则我们必须要给其属性赋值。
在上面的例子中,我们看到 @MyAnnotation(value="hello", name="world") 这里就是给其 value属性和name 属性赋值,而在下面的那个Annotation中:
@MyAnnotation("xiaoluo"),我们没有指定其属性名,那么它是赋值给谁呢?在Annotation中,如果我们定义了一个 value 属性,那么我们在使用该Annotation,给其赋值时,可以不用写出属性的名字,即value。
怎么样,简单吧,这样我们就定义并使用了我们的Annotation了。
二、Retention和RetentionPolicy
在初步了解了Annotation之后,我们再来看看Retention和RetentionPolicy这两个概念,Retention的中文意思是,保留、持有,同样,Retention也是一个Annotation,通过这个注解,我们可以指定我们自己定义的Annotation的保留范围,其默认值是有三个,是枚举类型的值,RetentionPolicy.CLASS(这个是Retention的默认值,表示这个Annotation会被编译到class文件当中), RetentionPolicy.RESOURCE(这个表示Annotation仅仅在编译的时候有效,起到提示作用,并不会被编译到class文件当中去), RetentionPolicy.RUNTIME(这个表示Annotation不仅会被编译到class文件当中,而且会在JVM运行中也可以得到这个Annotation,这样我们就可以通过反射来得到Annotaion,并对其进行一些操作了),我们来看看jdk自带的一些Annotation,其Retention分别是什么:
@Retention(value=SOURCE) public @interface Override @Retention(value=SOURCE) public @interface SuppressWarnings @Retention(value=RUNTIME) public @interface Deprecated
我们看到,Deprecated的RetentionPolicy是RUNTIME的,这样我们可以通过反射在运行时得到其Annotation,接下来我们自己来指定我们刚定义的MyAnnotation为RUNTIME:
@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value(); String name() default "xiaoluo"; }
这个时候,我们定义的Annotation就会被编译到class文件当中去,并且在运行时可以得到它,接下来我们来通过一个例子来看看如何使用反射机制得到我们的Annotation以及我们设置的属性值,java的API指定了访问得到Annotation的方法,我们的Class,Method,Constructor等等这些都默认实现了 AnnotatedElement 这个接口,这个接口定义了四个常用的方法:
<T extends Annotation> T getAnnotation(Class<T> annotationClass) // 根据Annotation.class得到这个Annotation Annotation[] getAnnotations() // 得到一个Annotation数组 Annotation[] getDeclaredAnnotations() // 也是得到一个Annotation数组 boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) // 判断是否为被当前的Annotation所标识
@MyAnnotation("hello") public class AnnotationTest { @MyAnnotation(value="xiaoluo", name="welcome") public void hello() { System.out.println("This is my Annotation!"); } public static void main(String[] args) throws Exception { // 得到AnnotationTest这个类的 class 对象 Class<AnnotationTest> clazz = AnnotationTest.class; // 得到AnnotationTest的一个实例对象 AnnotationTest test = (AnnotationTest)clazz.newInstance(); // 得到方法名为hello的Method对象 Method method = clazz.getMethod("hello", new Class[]{}); // 判断hello这个方法是否被MyAnnotation这个注解所标记 if(method.isAnnotationPresent(MyAnnotation.class)) { // 得到我们的MyAnnotation这个注解 MyAnnotation myAnnotation = (MyAnnotation)method.getAnnotation(MyAnnotation.class); System.out.println(myAnnotation.name() + ", " + myAnnotation.value()); method.invoke(test, new Object[]{}); } } }
我们来看看,因为我们的@MyAnnotation设置了其RetentionPolicy为RUNTIME,所以我们可以在通过反射在运行时得到该Annotation对象,结果输出为:
welcome, xiaoluo This is my Annotation!
通过这个例子,我想大家应该知道了RecentPolicy的三个值的含义了吧,我们都可以设置其为RUNTIME,这样就可以在运行时对其进行判断来处理我们的业务逻辑了
三、Target和ElementType
最后我们来看看Target和ElementType这两个东东,Target这个也是一个注解,这个Annotation是用来指定我们的Annotation可以标志的范围,例如定义在类上,定义在方法上等等,其value就是通过ElementType来指定的,我们来看看ElementType有哪些值:
ANNOTATION_TYPE // 可以定义在Annotation上 CONSTRUCTOR // 可以定义在构造函数上 FIELD // 可以定义属性上 LOCAL_VARIABLE // 可以定义在方法的局部变量上 METHOD // 可以定义在方法上 PACKAGE // 可以定义在包上 PARAMETER // 可以定义在方法的参数上 TYPE // 可以定义在类上、接口上
我们也可以在刚才定义的MyAnnotation上设置我们的Target:
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value(); String name() default "xiaoluo"; }
表示MyAnnotation可以定义在类上还有方法上,如果在其他地方定义该注解,则会编译不通过
spring annotation简述的更多相关文章
- 【Spring】简述@Configuration配置类注册BeanDefinition到Spring容器的过程
概述 本文以SpringBoot应用为基础,尝试分析基于注解@Configuration的配置类是如何向Spring容器注册BeanDefinition的过程 其中主要分析了 Configuratio ...
- Spring AOP简述
使用面想对象(Object-Oriented Programming,OOP)包含一些弊端,当需要为多个不具有继承关系的对象引入公共行为时,例如日志,安全检测等.我们只有在每个对象中引入公共行为,这样 ...
- Spring Annotation Processing: How It Works--转
找的好辛苦呀 原文地址:https://dzone.com/articles/spring-annotation-processing-how-it-works If you see an annot ...
- Spring(一)简述
一.Spring简述 一段费话 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2 ...
- Java 第六天 Spring Annotation 和其它
Annotation,是Java语言中的一种特殊的元数据语法,Spring支持使用annotation来进行对象实例化和装配 使用Annotation在Spring的配置xml中添加context命名 ...
- [转载]Spring Annotation Based Configuration
Annotation injection is performed before XML injection, thus the latter configuration will override ...
- Spring(一)简述(转载)
原文出自:http://www.cnblogs.com/liunanjava/p/4396794.html 一.Spring简述 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量 ...
- Spring Annotation注解进行aop的学习
使用Maven管理项目,pom文件为: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...
- spring annotation功能备注
@Autowired @Autowired 注释可以在 setter 方法中被用于自动连接 bean.以type方式进行匹配. 一个构造函数 @Autowired 说明当创建 bean 时,即使在 ...
随机推荐
- Tigase集群设置
在两台Linux服务器ddd(IP:10.3.93.212)和tsung213(IP:10.3.93.213)上安装了Tigase,要把这两台服务器组成一个Tigase集群,只需要修改这两台服务器的i ...
- Scalaz(30)- Free :Natural Tranformation ~> - map higher kinded types for free
当我们需要定义一些对应高阶类型进行相互类型转换的操作函数时,我们发现scala语言并不提供能定义这种函数的支持.举例来说:如果我们希望定义一个函数把对于任何T值的Option[T]转换成List[T] ...
- Java自定义一个字典类(Dictionary)
标准Java库只包含Dictionary的一个变种,名为:Hashtable.(散列表) Java的散列表具有与AssocArray相同的接口(因为两者都是从Dictionary继承来的).但有一个方 ...
- C#代码实现对HTTP POST参数进行排序
private static string GetSortedParas(Dictionary<string, string> dic) { dic = dic.OrderBy(key = ...
- 与锤子手机HR的对话——创业没有联合创始人,CTO 等高管会把它当做自己的事业吗?
以下对话,是在被之前的锤子HR磨叽2周约面试折腾的火大的心态下进行…… 这个问题发到知乎,被一群人骂啊……cnblogs都是工程师,估计懂期权参加创业的同学多一些,有空前往知乎声援一下……在这里:ht ...
- 为友盟消息推送开发的PHP SDK(composer版):可以按省发Android push
一直以来APP希望按省市县推送Android push,只能自己分析用户经纬度,打tag发送. 现在终于有服务商提供了. 友盟消息推送 可以“按省推送”,很方便. 我为友盟做了PHP SDK(comp ...
- 20个基于 WordPress 搭建的精美网站
WordPress 无处不在,小到人博客,大到广受欢迎的各类特色网站,你都能发现 WordPress 的影子,因为它是创建和维护一个网站最容易使用的平台. 另外,网络上有很多资源来创建你的网站,你基本 ...
- ReactNative ScrollView或ListView头部莫名其妙多了20px
之前在还没有加TabBarIOS时,ScrollView一直是好好的,然后随着深入,需要做其他tab页面的时候问题来了,当我把首页加入TabBarIOS.Item时..我首页中的ScrollView头 ...
- ArcPy之Python介绍
1.Python简介 Python是一种面向对象.解释型计算机程序设计语言;Python是一种简单易学,功能强大的编程语言.它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语 ...
- ARP投毒及其防御方法
1.攻击原理 ARP欺骗就是中间人欺骗pc机,告诉pc机它是服务器.再欺骗服务器,告诉服务器它就是pc机.以致获取服务器与pc机的会话信息. 中间人欺骗服务器时,会给服务器发一个报文,发之前把报文中的 ...