导航网站怎么赚钱,竞彩足球最新比赛,四川网站建设seo优化,网店代理免费一件代发java word批注如果您一直在用Java编程并且使用诸如Spring和Hibernate之类的任何流行框架#xff0c;那么您应该对使用注释非常熟悉。 当使用现有框架时#xff0c;其注释通常就足够了。 但是#xff0c;您是否发现需要创建自己的注释#xff1f; 不久之前#xff0c;我找… 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_TYPECONSTRUCTORFIELDLOCAL_VARIABLEMETHODPACKAGEPARAMETER和TYPE。 在我们的ReconField批注中它特定于FIELD级别。 Retention –这使您可以指定注释何时可用。 可能的值为CLASSRUNTIME和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.htmljava word批注