Annotations
一、介绍
注解,可以将注解看成一种特殊的接口。是一种特殊种类的元数据,它能够关联Java语言中不同元素和结构。有意思的是,在Java生态系统中大多数使用样板XML描述符的地方,注解在消除这些XML描述符上做出了很大的贡献。注解引入了新的,类型安全以及非常强健的配置和个性化技术。
二、分析
1、注解作为特殊接口
就像我们在前文中所提到的一样,注解用来关联Java语言中的元数据和不同的元素。
注解本身对它所注解的元素不会造成任何直接的影响。但是,依靠注解和它的定义方式,它们可以被Java编译器注解处理器和运行时代码使用反射和其他的虚拟机内省技术使用。
让我们来看一个最简单的注解@interface,@interface关键字引入了新的注解类型,这也是为何注解可以被当做专门的接口看待,注解可以声明有默认值和没有默认值的属性.如果注解声明了没有默认值的属性,那么在该注解被应用的所用地方都应该提供注解属性值。为了方便,如果注解只有一个属性并且属性的名称是value,那么属性的名称就可以被省略。
2、注解及其保留策略(Retention Policy)
每个注解都有一个被称为保留策略(Retention Policy)的特征,它是一组如何保留注解的策略组合的枚举(RetentionPolicy类型)。保留策略可以设置为CLASS、RUNTIME、SOURCE。
3、注解以及元素类型(ElementType)
注解的另外一个特征就是每个注解必须有它能够应用的元素类型。有点类似于保留策略,元素类型被定义成一组可能的元素类型的枚举(ElementType)。
4、注解与继承(Annotations and inheritance)
在Java中,声明注解与继承之间存在非常重要的联系。默认情况下,子类不能够继承父类中声明的注解,但是,有一种方法就是可以通过使用@Inherited注解在类层次结构中传递指定的注解。
5、注解处理器(Annotation processors)
Java编译器支持一种称为注解处理器的特殊类型的插件(使用-processor命令行参数),它可以在编译阶段处理注解。 注解处理器可以分析注解的作用(执行静态代码分析),创建额外的Java源文件或资源(可以被编译和处理),或者改变注解的代码。
在告知编译器那个注解可以被注解处理器应用和处理,保留策略(Retention Policy)扮演了非常关键的角色。
注释处理器被广泛使用,但是编写一个注解处理器需要一些关于Java编译器如何工作和编译过程本身的知识。
6、注解自身局限性
注解也有一些限制,在某些情况下使用注解可能会不太方便。
首先,注解不能继承其他的注解。
其次,不能通过编码的形式使用new关键字创建注解实例。
第三,注解只能声明基本数据类型属性,String或者 Class<?>类型及其数组。
第四,注解中不允许声明方法和构造器。
三、Named、RequstScoped、Model注解
请求(@RequestScoped):
在Web应用程序中的单个HTTP请求期间,请求范围仍然存在。应用程序由单个请求和响应组成,bean使用请求范围。
@Named:
该注解可以用来处理单接口与多个实现类的注入。@Named注解作用于成员变量或者方法参数,可以通过此标注的参数来区分不同的实现类。
@model:
@Model注解称为构造型,是用于封装其他注释的注释的术语。
Annotations的更多相关文章
- How those spring enable annotations work--转
原文地址:http://blog.fawnanddoug.com/2012/08/how-those-spring-enable-annotations-work.html Spring's Java ...
- Android注解使用之使用Support Annotations注解优化代码
前言: 前面学习总结了Java注解的使用,博客地址详见Java学习之注解Annotation实现原理,从本质上了解到什么注解,以及注解怎么使用?不要看见使用注解就想到反射会影响性能之类,今天我们就来学 ...
- Scala Macros - scalamela 1.x,inline-meta annotations
在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...
- [Android]使用自定义JUnit Rules、annotations和Resources进行单元测试(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5795091.html 使用自定义JUnit Rules.ann ...
- EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
I.EF里的默认映射 上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF里的默认映射.具体分为: 数据库映射:Code First ...
- Multiple annotations found at this line
Multiple annotations found at this line 在使用MyEclipse的时候,通过MVN导入项目时候,webapp下面的JSP页面报了如下的错误: 这种情况通常的原因 ...
- How do annotations work internally--转
原文地址:http://stackoverflow.com/questions/18189980/how-do-annotations-work-internally The first main d ...
- How Do Annotations Work in Java?--转
原文地址:https://dzone.com/articles/how-annotations-work-java Annotations have been a very important par ...
- 使用Android Annotations开发
使用Android Annotations框架gradle配置1.修改Module下的build.gradle apply plugin: 'com.android.application' appl ...
- Entity Framework Code First (三)Data Annotations
Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...
随机推荐
- nvm 安装使用
事先说明-------先安装nvm,再安装nodejs [nvm参考安装地址] nvm install 6.9.4 # 安装nodejs6.9.4版本 nvm use 6.9.4 # 使用nodejs ...
- python框架之Django(11)-中间件
介绍 在django中,中间件其实就是一个类,在一个请求到来和这个请求结束之前,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 M ...
- 设置mac笔记本为固定ip
第一步.点击Mac桌面“系统偏好设置”图标 第二步.在打开的系统偏好设置界面,点击互联网和无线选项中的“网络” 第三步.在网络界面,点击“高级”,进入高级设置. 第四步.在以太网设置界面,在TCP/ ...
- 师兄带你轻松入门GitHub
小白:师兄,师兄,我最近总是听到Github,看起来好高大上那,可是不懂是做什么得那? 师兄:你知道微博吧,Github就是程序员的微博,你可以在这里看到全世界最优秀的程序员在做什么. 小白:师兄就是 ...
- pytorch预训练模型的下载地址以及解决下载速度慢的方法
https://github.com/pytorch/vision/tree/master/torchvision/models 几乎所有的常用预训练模型都在这里面 总结下各种模型的下载地址: 1 R ...
- laravel自定义验证
1.在控制器中直接写验证$this->validate($request, [ 'video_ids' => [ function($attribute, $value, $fail) { ...
- python-16
#知识点一.函数的作用域 int() #内置变量 B v = 6 #全局变量G def outer(): x = 5 #嵌套变量 E def inner(): b = 10 #局部变量 L print ...
- xxnet to google部署
1,github上下载xxnet项目 2,启动(点击 start) 3,确定启动好后访问 www.google.com (此时是可以访问的) 4,注册google账号或直接登陆 5,访问 https: ...
- 连接mysql数据库,创建用户模型
1.安装与配置python3.6+flask+mysql数据库 (1)下载安装MySQL数据库 (2)下载安装MySQL-python 中间件 (3)pip install flask-sqlalch ...
- Array 转 Set
Array 转 Set: Set<String> oldCandidateNames = new HashSet<String>(Arrays.asList(candidate ...