JavaWeb学习-注解-1-注解快速入门

落日映苍穹つ 2024-04-17 05:48 203阅读 0赞

前面学习了Filter的基本特点和做了几个练习,接下来学习注解,学习完注解,再来学习动态代理。本篇主要了解什么是注解,注解用来干嘛。总的来说,注解是框架定义的,解析也是框架来做,我们只需要学会使用注解就好。

什么是注解

从语法上来说,具备以下这种格式就是注解。

@注解名称 例如Junit中的@Test

以后在编程中看到@名称 就要想起这是一个注解。接下来看看注解有什么好处,也就是注解的作用。

注解的作用

使用注解就是用来取代配置文件,就是这么一个作用。例如在Servlet3.0中,我们可以不再需要使用web.xml来配置Servler和Filter等配置,全部可以采用注解来实现,这时候注解就取代了xml配置文件。注解的核心作用就是起到配置作用,配置包含定义和读取。

注解是由框架来读取和使用的

怎么来理解这个标题呢?第一小点,注解是有框架来定义的。例如Junit中@Test就是Junit框架来定义。第二小点,注解是由框架来解析和使用,还是Junit中,@Test表示以下方法是一个测试用例,这个是Junit来解析出来。

或者,拿我们java web动态项目中的web.xml,之前我们没有学习注解,我们Servlet和Filter都在web.xml中写入配置。这些配置都是框架来使用和读取,这里的框架,就是我们的web服务器,也就是tomcat。如果我们在web.xml中写入了错误的配置,tomcat在启动过程中读取到web.xml中存在错误,就会报错。

注解的使用

我们在学习和使用注解,可以从下面三点去着手。

  • 定义注解类
  • 使用注解
  • 读取注解

其实,注解也是一个类,我们在一个类中定义了注解,一般这个定义注解都是框架来实现。然后开发人员只需要学会使用注解,一般常用的注解是需要掌握基本使用,然后再由框架解析和读取注解。

注解的定义举例

下来来用代码实现一个定义注解的过程。定义注解不能使用class,enum和interface,而是使用@interface

创建一个java 项目,在一个包下新建一个Demo1.java类。

  1. package annotation;
  2. public class Demo1 {
  3. }
  4. /**
  5. * 定义注解
  6. * @author Anthony
  7. *
  8. */
  9. @interface MyAnnotation{
  10. }

注解的使用

下面注解可以写在成员变量,方法参数,构造方法,类,方法的前面。

  1. package annotation;
  2. @MyAnnotation
  3. public class Demo1 {
  4. @MyAnnotation
  5. private String name;
  6. @MyAnnotation
  7. public void fun1() {
  8. }
  9. public void fun2(@MyAnnotation String name) {
  10. @MyAnnotation
  11. String nickName = "hello";
  12. }
  13. }
  14. /**
  15. * 定义注解
  16. * @author Anthony
  17. *
  18. */
  19. @interface MyAnnotation{
  20. }

注解不可以写在 导包语句前面(其实也可以,但是没啥用),还有不能写在调用方法语句前面。

  1. public void fun1() {
  2. @MyAnnotation
  3. System.out.println("Hello");
  4. }

注解的作用目标

通过上面的注解使用代码练习,这里来总结下注解的作用目标

  • 类(接口和枚举)
  • 方法
  • 构造器
  • 局部变量
  • 参数
  • 包(没啥用)

注解的属性

定义属性

格式: 类型 名称();

类型就是我们Java中熟悉的八大数据类型,名称就是熟悉别名,注意后面跟着一对小括号。小括号一定要有,不然会报错,小括号里也不能写参数。下面来看看代码中如何定义一个注解属性。

  1. /**
  2. * 定义注解
  3. * @author Anthony
  4. *
  5. */
  6. @interface MyAnnotation{
  7. String name();
  8. int age();
  9. }

定义属性就是这样格式。

使用注解属性

下面来解释使用注解的时候,需要给属性赋值。定义了多少个就需要几个赋值,不然会报错。

  1. package annotation;
  2. @MyAnnotation(name="tom", age=18)
  3. public class Demo1 {
  4. }
  5. /**
  6. * 定义注解
  7. * @author Anthony
  8. *
  9. */
  10. @interface MyAnnotation{
  11. String name();
  12. int age();
  13. }

属性写在小括号内,多个属性逗号隔开。如果学习过TestNG或者Junit的人,就明白这个属性赋值的作用。

注解属性的默认值

前面我们定义了name和age两个属性,也学会了使用注解属性赋值。有时候,注解属性是需要默认值,这个就需要在定义属性的时候提供默认值。

  1. package annotation;
  2. @MyAnnotation(name="tom")
  3. public class Demo1 {
  4. }
  5. /**
  6. * 定义注解
  7. * @author Anthony
  8. *
  9. */
  10. @interface MyAnnotation{
  11. String name();
  12. int age() default 18;
  13. }

直接在定义属性的时候使用default后面跟着默认值。上面使用注解的时候,小括号里不写age属性赋值就表示使用默认值。

名为value的属性的特权

这是什么意思呢?如果你定义了一个属性,属性名称叫value, 当使用属性的时候,并且只给value赋值的时候,value=值1,可以简写成值1,这就是叫value的属性的特权。下面来代码演示下。

  1. package annotation;
  2. @MyAnnotation("tom")
  3. public class Demo1 {
  4. }
  5. /**
  6. * 定义注解
  7. * @author Anthony
  8. *
  9. */
  10. @interface MyAnnotation{
  11. String value();
  12. int age() default 18;
  13. }

这里因为age有默认值,所以赋值的时候不需要给出具体值去覆盖18,就剩下value一个属性需要设置值,@MyAnnotation(“tom”) 相当于@MyAnnotation(value=”tom”),这里value的特权就是可以省略value=这个字符串。

注解属性的类型

前面注解属性我们知道有8中基本数据类型,还使用了Sting类型,其实还有其他类型。

  • 8中基本数据类型
  • String
  • Enum(枚举)
  • Class
  • 注解类型
  • 以上类型的一维数组类型

下面看看这些类型的定义和使用赋值的代码。

  1. package annotation;
  2. @MyAnnotation(
  3. a = 100,
  4. b = "hello",
  5. c = MyEnum.A,
  6. d = String.class,
  7. e = @MyAnnotation2(),
  8. f = {"tom", "lisi"}
  9. )
  10. public class Demo1 {
  11. }
  12. /**
  13. * 定义注解
  14. * @author Anthony
  15. *
  16. */
  17. @interface MyAnnotation{
  18. int a();
  19. String b();
  20. MyEnum c();
  21. Class d();
  22. MyAnnotation2 e();
  23. String[] f();
  24. }
  25. @interface MyAnnotation2 {
  26. }
  27. enum MyEnum {
  28. A,B, C
  29. }

发表评论

表情:
评论列表 (有 0 条评论,203人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [JAVA学习1]注解

    一个多月没写了,app开发告一段落,已经提交到appstore,但还在审核。 昨天刚刚接触当今最热门的语言java。没办法,不想学这个,公司偏偏又用这个。不过2天下来,觉得

    相关 JavaWeb 注解

    java中有很多注解 按运行机制分 源码注解 只在源码中存在 编译时注解 在class中依然存在,如@Deprecated 运行时注解 运行阶段起作用,如