java word批注_创建自己的Java批注

java word批注

如果您一直在用Java编程并且使用诸如Spring和Hibernate之类的任何流行框架,那么您应该对使用注释非常熟悉。 当使用现有框架时,其注释通常就足够了。 但是,您是否发现需要创建自己的注释?

不久之前,我找到了为涉及验证多个数据库中存储的公共数据的项目创建自己的注释的理由。

场景

该企业具有多个存储相同信息的数据库,并且具有使数据保持最新状态的各种方法。 该企业已经计划了一个将数据整合到主数据库中的项目,以缓解与拥有多个数据源有关的一些问题。

但是,在项目开始之前,业务部门需要了解数据之间的不同步程度,并进行必要的更正以恢复同步。 第一步需要创建一个报告,该报告显示属于多个数据库的公共数据并验证值,并根据定义的对帐规则突出显示所有不匹配的记录。 这是当时需求的简短摘要:

  • 比较多个数据库之间的数据以获取一条公共数据,例如客户,公司或目录信息。
  • 默认情况下,根据值的类型,找到的值应与所有数据库完全匹配。
  • 对于某些字段,我们只希望显示找到的值,而不执行任何数据比较。
  • 对于某些字段,我们只希望比较找到的值并在指定的特定数据源上执行数据验证。
  • 对于某些字段,我们可能希望根据记录中其他字段的值进行一些复杂的数据比较。
  • 对于某些字段,我们可能希望将数据格式化为特定格式,例如,金额为$ 000,000.00。
  • 该报告应采用MS Excel格式,每行应包含来自每个来源的字段值。 根据数据验证规则不匹配的任何行应以黄色突出显示。

注解

在研究了需求并提出了一些想法之后,我决定使用批注来驱动数据比较和报告过程的配置。 我们需要一些简单但又高度灵活和可扩展的东西。 这些注释将在字段级别,我喜欢这样的事实,即配置不会隐藏在类路径上的某个文件中。 取而代之的是,您将能够查看与字段相关联的注释,以确切了解将如何处理它。

用最简单的术语来说,注释不过是标记,即提供信息但对代码本身的操作没有直接影响的元数据。 如果您已经从事Java编程已有一段时间,那么您应该非常熟悉Java的使用,但是也许您根本不需要创建自己的Java。 为此,您需要创建一个使用Java类型@interface的新类型,该类型将包含指定元数据详细信息的元素。

这是该项目的一个示例:

@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处理此批注,因此需要对其进行设置。

此数据验证过程将对每个数据库运行一个查询,然后将结果映射到一个通用数据bean,该bean代表该特定类型的业务记录的所有字段。 此映射数据bean的每个字段上的注释告诉处理器如何针对该特定字段及其在每个数据库中找到的值执行数据比较。 因此,让我们看一些如何将这些注释用于各种数据比较配置的示例。

要验证该值是否存在并在每个数据源中完全匹配,您只需提供字段ID和应在报告中为该字段显示的标签。

@ReconField(id = CUSTOMER_ID, label = "Customer ID")
private String customerId;

要显示在每个数据源中找到的值,但不进行任何数据比较,则需要指定元素compareSources并将其值设置为false。

@ReconField(id = NAME, label = "NAME", compareSources = false)
private String name;

要验证在特定数据源(而非全部)中找到的值,可以使用元素sourcesToCompare 。 使用此选项将显示找到的所有值,但仅对元素中列出的数据源执行任何数据比较。 处理某些数据没有存储在每个数据源中的情况。 ReconSource是一个枚举,其中包含可用于比较的数据源。

@ReconField(id = PRIVATE_PLACEMENT_FLAG, label = "PRIVATE PLACEMENT FLAG", sourcesToCompare ={ ReconSource.LEGACY, ReconSource.PACE })
private String privatePlacementFlag;

既然我们已经满足了基本要求,我们就需要解决运行特定于相关领域的复杂数据比较的功能。 为此,我们将创建第二个注释,以驱动自定义规则的处理。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReconCustomRule {/**
* Value indicates the parameters used to instantiate a custom rule processor, the default value is no parameters.
*
* @return The String[] of parameters to instantiate a custom rule processor.
*/
String[] params() default {};/**
* Value indicates the class of the custom rule processor to be used in comparing the values from each source.
*
* @return The class of the custom rule processor.
*/
Class<?> processor() default DefaultReconRule.class;}

与先前的注释非常相似, @ ReconCustomRule注释中的最大区别是我们指定了一个在执行侦察过程时将执行数据比较的类。 您只能定义将要使用的类,因此处理器将必须实例化并初始化您指定的任何类。 在此批注中指定的类将需要实现自定义规则接口,规则处理器将使用该接口执行规则。

现在,让我们看一下此注释的几个示例。

在此示例中,我们使用一个自定义规则,该规则将检查证券交易所是否不是美国,如果是这种情况,则跳过数据比较。 为此,该规则将需要检查同一记录上的“交换国家/地区”字段。

@ReconField(id = STREET_CUSIP, label = "STREET CUSIP", compareSources = false)
@ReconCustomRule(processor = SkipNonUSExchangeComparisonRule.class)
private String streetCusip;

在下面的示例中,我们为自定义规则指定了一个参数,在这种情况下,这是一个公差值。 对于此特定数据比较,要比较的值相差不能超过1000。 通过使用参数指定容差量,这允许我们在具有不同容差量的多个字段上使用相同的自定义规则。 唯一的缺点是这些参数是静态的,由于注释的性质而不能是动态的。

@ReconField(id = USD_MKT_CAP, label = "MARKET CAP USD", displayFormat = ReconDisplayFormat.NUMERIC_WHOLE, sourcesToCompare =
{ ReconSource.LEGACY, ReconSource.PACE, ReconSource.BOB_PRCM })
@ReconCustomRule(processor = ToleranceAmountRule.class, params =	{ "10000" })
private BigDecimal usdMktCap;

如您所见,仅通过使用几个相当简单的注释,我们就为多个数据库的数据验证报告设计了相当多的灵活性。 对于这种特殊情况,注释正在驱动数据比较处理,因此我们实际上是在评估在映射的数据bean上找到的注释,并使用它们来指导处理。

结论

关于Java注释,它们的作用以及使用它们的规则,已经有许多文章发表了。 我想让本文更多地关注一个示例,说明为什么您可能想要考虑使用它们并直接看到其好处。

请记住,这只是一个起点,一旦您决定创建注释,您仍然需要弄清楚如何处理它们才能真正利用它们。 在第二部分中,我将向您展示如何使用Java反射来处理这些注释。 在此之前,这里有一些很好的资源,可以了解有关Java注释的更多信息:

  • Java注释教程– http://docs.oracle.com/javase/tutorial/java/annotations/
  • Java注释-http: //tutorials.jenkov.com/java/annotations.html
  • 注释的工作方式– http://java.dzone.com/articles/how-annotations-work-java

翻译自: https://www.javacodegeeks.com/2014/07/creating-your-own-java-annotations.html

java word批注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东芝硬盘插入台式机后滴滴响

问题&#xff1a;如题 个人解决&#xff1a; 插入到主机背后的USB接口&#xff0c;前置的USB可能供电不足

使用JUnit 5进行Spring Boot测试

JUnit 5 &#xff08;JUnit Jupiter&#xff09;已经存在了相当长的一段时间&#xff0c;并且配备了许多功能。 但令人意外JUnit 5它不是一个默认的测试库相关&#xff0c;当涉及到春节开机测试入门&#xff1a;它仍然是JUnit 4.12 &#xff0c;在2014年发布了回来&#xff0c;…

android-ViewPager不能显示

问题 如题 解决 忘了在PageAdapter中的instantiateItem&#xff08;&#xff09;方法中创建了视图后调用 container.add(view)&#xff0c;黑线。。。

AndroidStudio cmakelist找不到问题

这里写自定义目录标题AndroidStudio cmakelist找不到问题原因解决AndroidStudio cmakelist找不到问题 原因 在build.gradle中声明了externalNativeBuild &#xff0c;但CMakeList.txt并不存在 externalNativeBuild { cmake { path “CMakeLists.txt” } } 解决 把external…

Window网络无法查看其它设备的共享文件

项目场景&#xff1a; windows共享文件夹能查看到不能访问 问题描述 window中共享文件夹能查看到但不能访问 原因分析&#xff1a; 未添加对应的组或用户名 解决方案&#xff1a; 重新设置可共享的组或用户名 1. 文件夹-》属性-》共享-》确保已经共享 2. 安全-》组或者用户名…

javafx中css选择器_JavaFX技巧12:在CSS中定义图标

javafx中css选择器当您是像我这样来自Swing的UI开发人员时&#xff0c;您很有可能仍在代码中直接设置图像/图标。 最可能是这样的&#xff1a; import javafx.scene.control.Label; import javafx.scene.image.ImageView;public class MyLabel extends Label {public MyLabel(…

EA问题的JDK14实例

Tagir Valeev最近发布了一条有关即将发布的Java JDK14版本的预览功能的推文&#xff1a; &#xff03;Java14模式匹配将名称隐藏带入了更高的疯狂程度。 在这里&#xff0c;我为FLAG字段添加或删除了final修饰符&#xff0c;该修饰符仅在不可达的if分支中访问。 这实际上改变了…

python去除图像光照不均匀_CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法...

CVPR 2020 | 从重建质量到感知质量&#xff1a;用于低光照增强的半监督学习方法Code: https://github.com/flyywh/CVPR-2020-Semi-Low-Light1背景本篇为大家介绍我们组被2020年IEEE国际计算机视觉与模式识别会议(CVPR 2020)接收的工作《From Fidelity to Perceptual Quality: A…

jpa 手动预编译_编译时检查JPA查询

jpa 手动预编译JPA提供了几种查询数据的方法。 可以根据各种标准&#xff08;例如&#xff0c;使用的语言&#xff08;SQL与JPQL&#xff09;或查询是静态的&#xff08;编译时间&#xff09;还是动态的&#xff08;执行时间&#xff09;&#xff09;对此类替代方案进行分类。 …

多层陶瓷电容器用处_【科普贴】多层陶瓷电容器的制造工序,你知道吗?

本文将向大家介绍多层陶瓷电容器的结构及制造工序。多层陶瓷电容器的基本结构电容器用于储存电荷&#xff0c;其最基本结构如图1所示&#xff0c;在2块电极板中间夹着介电体。图1. 电容器的基本结构电容器的性能指标也取决于能够储存电荷的多少。多层陶瓷电容器为了能够储存更多…

使用ORM提取数据很容易! 是吗?

介绍 几乎任何系统都以某种方式与外部数据存储一起运行。 在大多数情况下&#xff0c;它是一个关系数据库&#xff0c;并且数据获取通常委托给某些ORM实现。 ORM涵盖了很多例程&#xff0c;并带来了一些新的抽象作为回报。 Martin Fowler写了一篇有关ORM的有趣文章 &#xff0…

分段式多级离心泵_离心泵与多级离心泵工作原理

离心泵工作原理&#xff1a;离心泵工作时&#xff0c;液体注满泵壳&#xff0c;叶轮高速旋转&#xff0c;液体在离心力作用下产生高速度&#xff0c;高速液体经过逐渐扩大的泵壳通道&#xff0c;动压头转变为静压头。性能特点&#xff1a;高效节能&#xff1a;泵有高效的水力形…

java8 javafx_JavaFX技巧8:美丽深层

java8 javafx如果您正在开发JavaFX的UI框架&#xff0c;请养成一种习惯&#xff0c;始终将自定义控件拆分为控件类和外观类。 来自Swing自己&#xff0c;这对我来说并不明显。 Swing还使用MVC概念&#xff0c;并将实际的组件呈现委托给UI委托&#xff0c;但是扩展Swing的人们大…

牛客网数据开发题库_数据库刷题—牛客网(21-30)

21.查找所有员工自入职以来的薪水涨幅情况&#xff0c;给出员工编号emp_no以及其对应的薪水涨幅growth&#xff0c;并按照growth进行升序CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16…

弹性堆栈介绍

当您运行对公司至关重要的软件时&#xff0c;您将无法获得仅用于分析一段时间前发生的事情的日志&#xff0c;让客户端告诉您您的应用程序已损坏&#xff0c;而您甚至不知道发生了什么是真实的问题。 解决该问题的方法之一是使用监视和日志记录。 大多数应用程序都将具有日志记…

access统计没有选课的人数_当代大学生发愁求职就业,更发愁“选课”,自主选课变成了负担...

当代大学生除了求职就业&#xff0c;最发愁的就是“选课”。不得不说&#xff0c;随着科技的发展&#xff0c;各行各业都发生了翻天覆地的变化。而在大学里的选课&#xff0c;也因此有了巨大的改变。过去&#xff0c;大学生上课&#xff0c;其实课程都是被安排好的&#xff0c;…

产线数字化软件源码_品质笔记⑥丨卢宇聪:把握数字化趋势,坚定创新发展道路...

6天5夜&#xff0c;跨越3座城市&#xff0c;深度走访7家企业&#xff0c;对话多位企业家……这是一趟开阔视野之旅。我接触了很多之前极少有机会接触的企业&#xff0c;比如做光缆的法尔胜泓晟集团、做节能装备的双良集团、做密封件的天生密封件有限公司等。我以前经常接触的是…

es 安装kopf_Elasticsearch-kopf导览

es 安装kopf当我需要一个插件来显示Elasticsearch的集群状态时&#xff0c;或者需要深入了解通常为经典插件elasticsearch-head所达到的索引时。 由于有很多建议&#xff0c;而且似乎是非官方的继任者&#xff0c;所以我最近更详细地研究了elasticsearch-kopf 。 我喜欢它。 我…

会导致小程序onhide码 手机息屏_小程序onshow事件

问题描述onShow 事件在小程序里面非常重要&#xff0c;场景之多&#xff0c;导致处理起来很复杂。很多业务场景依赖与onShow与onHide事件。比如分享给他人&#xff0c;在群里PK等等。息屏&#xff0c;新页面返回、Home键操作&#xff0c;也会触发onShow事件。以下是官网的说明&…

Spring@主要注释

介绍&#xff1a; 当存在多个相同类型的bean时&#xff0c;使用Spring Primary批注为标记的bean提供更高的优先级。 默认情况下&#xff0c;Spring按类型自动连线。 因此&#xff0c;当Spring尝试自动装配并且有多个相同类型的bean时&#xff0c;我们将获得NoUniqueBeanDefini…