IT修真院·小课堂丨互联网职业小课堂在线学习平台

课堂课题:

什么是Annotation,怎么自定义Annotation,Annotation和XML的优缺点各是什么?

关联任务:

任务五

直播时间:

2018-12-29 15:30:00


课堂内容:

视频链接:

PPT链接:

提交按钮:

小课堂内容格式


标题:

【修真院xx(职业)小课堂】课题名称

开场语:

大家好,我是IT修真院XX分院第X期的学员XX,一枚正直纯洁善良的XX程序员,今天给大家分享一下,修真院官网XX(职业)任务X,深度思考中的知识点——XXX

(1)背景介绍:

背景介绍的时候,尽可能的要宽广,讲清楚来龙去脉,讲清楚为什么会需要这个技术。

(2)知识剖析:

讲知识点的时候,尽可能的成体系,学会成体系的去给别人介绍知识。现在很多做的都是零散的,没有分类。

(3)常见问题:

最少列出1个常见问题。

(4)解决方案:

写清楚常见问题的解决方案。

(5)编码实战:

尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。

(6)拓展思考:

知识点之外的拓展思考,由分享人进行讲解,这些东西就是所谓的深度,也是一个人技术水准高低比较的表现。

(7)参考文献:

引入参加文献的时候,在引用的句子后面加上序号【1】。参考文献中列出详细来源。不要去抄别人的东西,这是一个基本的态度。

(8)更多讨论:

Q1:提问人:问题?
A1:回答人(可以是分享人,也可以是其他学员):回答
Q2:提问人:问题?
A2:回答人(可以是分享人,也可以是其他学员):回答
Q3:提问人:问题?
A3:回答人(可以是分享人,也可以是其他学员):回答

(9)鸣谢:

感谢XX、XX师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

什么是Annotation,怎么自定义Annotation,Annotation和XML的优缺点各是什么?    

辅导师兄 [真传弟子]JAVA-徐铭培


大家好,我是IT修真院深圳分院第13期的学员,一枚正直纯洁善良的java程序员
今天给大家分享一下,修真院官网Java任务7,深度思考中的知识点————什么是Annotation,怎么自定义Annotation,Annotation和XML的优缺点各是什么?

1.背景介绍

在Spring早期的1.x版本中,由于当时的JDK并不能支持注解,因此只能使用XML.而很
快随着JDK升级到 JDK5, 它加入了注解的新特性, 这样注解就被广泛地使用起来。

到了 Spring 3.0后, 引入了更多的注解功能, 于是在 Spring中产生了这样一个很大的分歧, 即是 使用注解还是使用 XML?

对于 XML 的引入, 有些人觉得过于繁复, 而对于注解的使用, 会使得注解 分布得到处都是, 难以控制, 有时候还需要了解很多框架的内部实现才能准确使用注解开发所需的功 能 这个时候大家形成了这样的一个不成文的共识, 对于业务类使用注解,而对于一些公用的Bean 例如:对于数据库(如Redis),第三方资源等则使用XML进行配置。

2.知识剖析

什么是Annotation?

Annotation其实是一种接口。通过Java的反射机制相关的API来访问annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。 annotation是不会影响程序代码的执行,无论annotation怎么变化,代码都始终如一地执行。

Java语言解释器在工作时会忽略这些annotation,因此在JVM中这些annotation是“不起作用”的,只能通过配套的工具才能对这些annontaion类型的信息进行访问和处理。

Annotation 分类
1.标准 Annotation

(1)1.标准 Annotation
包括Override, Deprecated, SuppressWarnings,标准 Annotation 是指 Java 自带的几个 Annotation,上面三个分别表示重写函数,函数已经被禁止使用,忽略某项 Warning

(2)元注解
在创建注解的时候,需要使用一些注解来描述自己创建的注解,就是写在@interface上面的那些注解,这些注解被称为元注解,如在Override中看到的@Target、@Retention等。

@Documented: 用于标记在生成javadoc时是否将注解包含进去。

@Target:用于定义注解可以在什么地方使用,默认可以在任何地方使用,也可以指定使用的范围

@Constraint:用于校验属性值是否合法

@Retention:注解的声明周期,用于定义注解的存活阶段,可以存活在源码级别、编译级别(字节码级别)、运行时级别

@Inherited:允许子类继承父类中的注解,可以通过反射获取到父类的注解

(3)自定义 Annotation 自定义 Annotation 表示自己根据需要定义的 Annotation,定义时需要用到上面的元注解

3.常见问题

Annotation和XML的优缺点各是什么?

4.解决方案

Annotation 的优点

(1)保存在 class 文件中,降低维护成本。

(2)无需工具支持,无需解析。

(3)编译期即可验证正确性,查错变得容易。

(4)提升开发效率。

Annotation的缺点

(1)若要对配置项进行修改,不得不修改 Java 文件,重新编译打包应用。


(2)配置项编码在 Java 文件中,可扩展性差。


xml的优点

(1)xml 作为可扩展标记语言最大的优势在于开发者能够为软件量身【定制】适用的标记,使代码更加通俗易懂。


(2)利用 xml 配置能使软件更具扩展性。例如 Spring 将 class 间的依赖配置在 xml 中,最大限度地提升应用的可扩展性。


(3)具有成熟的验证机制确保程序正确性。利用 Schema 或 DTD 可以对 xml 的正确性进行验证,避免了非法的配置导致应用程序出错。


(4)修改配置而无需变动现有程序。


xml的缺点

(1)需要解析工具或类库的支持。

(2)解析 xml 势必会影响应用程序性能,占用系统资源。

(3)编译期无法对其配置项的正确性进行验证,或要查错只能在运行期。

(4)IDE 无法验证配置项的正确性无能为力。

(5)查错变得困难。往往配置的一个手误导致莫名其妙的错误。

(6)开发人员不得不同时维护代码和配置文件,开发效率变得低下。

(7)配置项与代码间存在潜规则。改变了任何一方都有可能影响另外一方。

(8)配置文件过多导致管理变得困难。

没有一个事物是万能的,同样 xml 和 Java Annotation 都有各自的优缺点。 且他们的优缺点恰恰是互补的,xml 的强项是 Annotation 所不具备的,而 Annotation 的优势也是 xml 所欠缺的。 这也正是时下流行的 xml + Annotation 配置的原因所在。

5.编码实战

自定义注解(原作者的博客:https://blog.csdn.net/icehaopan/article/details/50261623)

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 定义一个注解
 */
@Target(ElementType.METHOD) // 这是一个对方法的注解,还可以是包、类、变量等很多东西
@Retention(RetentionPolicy.RUNTIME) // 保留时间,一般注解就是为了框架开发时代替配置文件使用,JVM运行时用反射取参数处理,所以一般都为RUNTIME类型
@Documented // 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化
public @interface OneAnnotation {

    // 定义注解的参数,类型可以为基本类型以及String、Class、enum、数组等,default为默认值
    String parameter1() default "";
    int parameter2() default -1;
}
/**
 * 一个用到了自定义的注解的类
 */
public class OneClass {

    @OneAnnotation(parameter1="下午好", parameter2=1550)
    public void oneMethod () {
    }
}
import java.lang.reflect.Method;


public class TestThis {

    public static void main(String[] args) throws Exception {
        // 提取到被注解的方法Method,这里用到了反射的知识
//         getDeclaredMethod:返回Method方法对象;
        Method method = OneClass.class.getDeclaredMethod("oneMethod");


        // 从Method方法中通过方法getAnnotation获得我们设置的注解
        OneAnnotation oneAnnotation = method.getAnnotation(OneAnnotation.class);

        // 得到注解的俩参数
        System.out.println(oneAnnotation.parameter1());
        System.out.println(oneAnnotation.parameter2());
    }
}

6.参考文献

CSDN、百度百科、师兄们提供的资料
一些相关参考
https://blog.csdn.net/icehaopan/article/details/50261623
https://blog.csdn.net/lzhang616/article/details/46681919
https://blog.csdn.net/vbirdbest/article/details/78822646

7.更多讨论

(1)自定义注解内容怎么定义?
注解的内容的语法格式: 数据类型 属性名() default 默认值,数据类型用于描述属性的数据类型,默认值是说当没有给属性赋值时使用默认值,一般String使用空字符串”“作为默认值,数组一般使用空数组{ }作为默认值.

(2)注解的使用场景?
可以通过注解的声明周期来分析注解的使用场景:
SOURCE源码级别:给编译器使用,如@Override、@Deprecated 等, 这部分开发者应该使用的场景不多

CLASS:字节码级别,这部分也很少见到

RUNTIME:运行时级别,这个是最多的,几乎开发者使用到的注解都是运行时级别,运行时注解常用的有以下几种情况
注解中没有任何属性的,空的注解,这部分注解通常起到一个标注的作用,如@Test、@Before、@After,通过获取这些标记注解在逻辑上做一些特殊的处理
可以使用约束注解@Constraint来对属性值进行校验,如@Email, @NotNull等
可以通过在注解中使用属性来配置一些参数,然后可以使用反射获取这些参数,这些注解没有其他特殊的功能,只是简单的代替xml配置的方式来配置一些参数。使用注解来配置参数这在Spring boot中得到了热捧,如@Configuration

(3)怎么选择xml 和annotation?
关于配置方式xml vs annotation, 一般使用xml配置一些和业务关系不太紧密的配置,使用注解配置一些和业务密切相关的参数。

8.鸣谢:
感谢修真院的师兄和CSDN博客上相关的作者,此教程是在他们之前技术分享的基础上完善而成。

9.结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~



评论

请您登录 后进行评论