设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

创建你自己的Java注解类

2014-8-4 09:46| 发布者: joejoe0332| 查看: 4728| 评论: 0|原作者: LeoXu, lwei|来自: oschina

摘要: 如果你已经在使用Java编程,并且也使用了任何像Spring和Hibernate这样的流行框架,那么你应该对注解的使用非常地熟悉。使用一个现有框架工作的时候,通常使用它的注解就够了。但是,你是不是也有时候有要创建属于你 ...

  如果你已经在使用Java编程,并且也使用了任何像Spring和Hibernate这样的流行框架,那么你应该对注解的使用非常地熟悉。使用一个现有框架工作的时候,通常使用它的注解就够了。但是,你是不是也有时候有要创建属于你自己的注解的需求呢?


  不久之前,我找到了一个自己创建一个注解的理由,那是一个涉及验证存储在多种数据库中的常用数据的项目。


场景描述

  该业务有多种数据库都存储着相同的数据,它们有各自不同的保持数据更新的方法. 该业务曾计划把所有这些数据都整合到一个主数据库中,以减轻涉及到多种数据源所带来的问题的复杂性. 


  不过在项目开始之前,业务还需要知道数据距离可以同步还有多少差距,并做出任何必要的修正来使其可以进行同步. 第一步需要创建一个展示那些数据多种数据库的通用数据的报表,并对其值进行验证, 对那些不符合条件的记录进行高亮显示. 这里有一个对当时需求的简短摘要:


  • 比对多种数据库间公共部分的数据,诸如客户,公司或者目录信息.

  • 默认的值应该根据值的类型匹配所有的数据库.

  • 对于某些字段,我们只想展示其值,而不要进行任何数据比较.

  • 对于某些字段,我们只想要对比其值,并在指定的特定数据源上进行数据验证.

  • 对于某些字段,我们可能想要做一些复杂的数据比较,可能会基于记录内的其它字段.

  • 对于某些字段,我们可能想要用一种特定格式对数据进行格式化,比如钱币数量 使用 $000,000.00 .

  • 报表应该用MS Excel格式的,每一行都包含来自每个数据源的字段值. 任何不匹配数据验证规则的行都应该用黄色高亮显示.


注解

  经过一阵子对需求和一些想法的推敲之后,我决定使用注解来驱动对于数据比对和报表处理的配置. 我们需要的东西得是简单,而高度灵活可扩展的. 这些注解将会是字段级别的,而我就喜欢配置不会被隐藏在classpath某个地方的文件中. 如此,你就能够直接查看同一个字段相关联的注解,以便知晓它具体是如何进行处理的.


  在最简单的情况下,注解无非就是一个标记,就只是提供信息而不会对代码执行的操作本身有直接影响的元数据. 如果你一直在从事Java编程,那么现在你对它们的使用应该相当的熟悉了, 但是可能你从来没有过创建属于你自己的注解的需求. 为此,你需要创建一个带有Java类型@interface的新类型,它将包含能指定元数据详细信息的要素.


  这里有一个来自这个项目的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReconField {
 
    /**
     * Value indicates whether or not the values from the specified sources should be compared or will be used to display values or reference within a rule.
     *
     * @return The value if sources should be compared, defaults to true.
     */
    boolean compareSources() default true;
 
    /**
     * Value indicates the format that should be used to display the value in the report.
     *
     * @return The format specified, defaulting to native.
     */
    ReconDisplayFormat displayFormat() default ReconDisplayFormat.NATIVE;
 
    /**
     * Value indicates the ID value of the field used for matching source values up to the field.
     *
     * @return The ID of the field.
     */
    String id();
 
    /**
     * Value indicates the label that should be displayed in the report for the field.
     *
     * @return The label value specified, defaults to an empty string.
     */
    String label() default "";
 
    /**
     * Value that indicates the sources that should be compared for differences.
     *
     * @return The list of sources for comparison.
     */
    ReconSource[] sourcesToCompare() default {};
 
}


  这是驱动数据比对过程如何运作的主要注解. 它包含的基本要素,可以满足不同数据源间数据进行比较的大部分需求. @ReconField 可以处理除更加复杂的比对之外,我们所期望的大多数需求, 而更加复杂的情况我们将会在稍后有所讨论. 这些要素的大多数在代码清单中一对一的注释中都有介绍, 而需要指出的是,在我们的@ReconField上有几个关键的注解.


  • @Target – 这个注解可以让你来指定你的注解应该被用在那个java元素上. 可能的目标类型是 ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER 和 TYPE. 在我们的 @ReconField 注解中他被指定到了 FIELD 级别.

  • @Retention – 它可以让你指定注解在何时生效. 可能的值有 CLASS, RUNTIME 和 SOURCE. 因为我们将会在运行时 RUNTIME 处理这个注解, 所以那就是我们需要设置的值.



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部