사용자 정의 Java 메모 클래스를 만드는 방법

6964 단어 Java주해류
만약 당신이 자바 프로그래밍을 사용하고 스프링과 Hibernate 같은 유행 프레임워크를 사용하고 있다면, 주석의 사용에 대해 매우 익숙해야 합니다.기존의 프레임워크를 사용하여 작업할 때, 통상적으로 그것의 주석을 사용하면 충분하다.하지만, 당신도 때때로 당신만의 주석을 만들어야 하는 수요가 있지 않습니까?
얼마 전에 나는 여러 데이터베이스에 저장된 상용 데이터를 검증하는 데 관련된 주해를 만든 이유를 찾았다.
장면 묘사
이 업무에는 여러 종류의 데이터베이스가 모두 같은 데이터를 저장하고 있으며, 그들은 각기 다른 데이터 업데이트를 유지하는 방법을 가지고 있다.이 업무는 다양한 데이터 원본과 관련된 문제의 복잡성을 줄이기 위해 이 모든 데이터를 하나의 주 데이터베이스에 통합할 계획을 세웠다.
그러나 프로젝트가 시작되기 전에 업무는 데이터 거리가 동기화할 수 있는지 얼마나 차이가 있는지 알고 필요한 수정을 해서 동기화할 수 있도록 해야 한다.첫 번째 단계는 데이터의 다양한 데이터베이스를 보여주는 유니버설 데이터 보고서를 만들고 그 값을 검증하며 조건에 부합되지 않는 기록을 강조해야 한다.여기에는 당시 요구 사항에 대한 간략한 요약이 있습니다.
  • 다양한 데이터베이스 간의 공공 부분의 데이터, 예를 들어 고객, 회사 또는 디렉터리 정보에 비해..
  • 기본값은 값의 유형에 따라 모든 데이터베이스와 일치해야 합니다.
  • 일부 필드에 대해 우리는 그 값을 보여주고 싶을 뿐, 어떠한 데이터 비교도 하지 않는다
  • 일부 필드에 대해 우리는 그 값을 비교하고 지정한 특정 데이터 원본에서 데이터 검증을 하려고 한다
  • 일부 필드에 대해 우리는 복잡한 데이터 비교를 하려고 할 수도 있고 기록 내의 다른 필드를 바탕으로 할 수도 있다
  • 일부 필드에 대해 우리는 특정한 형식으로 데이터를 포맷하려고 할 수 있습니다. 예를 들어 화폐의 수량은 $000000.00을 사용합니다
  • 보고서는 MS Excel 형식으로 해야 하며, 줄마다 데이터 원본에서 온 필드 값을 포함해야 한다.데이터 검증 규칙과 일치하지 않는 줄은 노란색으로 강조표시해야 합니다.
  • 주해
    한동안 수요와 생각에 대한 퇴고를 거친 후에 나는 주해를 사용하여 데이터 비교와 보고서 처리에 대한 설정을 구동하기로 결정했다.우리가 필요로 하는 것은 간단하고 고도로 유연하며 확장할 수 있어야 한다.이 주석은 필드 레벨이 될 것입니다. 저는classpath 어딘가에 숨겨지지 않는 파일을 설정하는 것을 좋아합니다.이렇게 하면 같은 필드가 어떻게 처리되었는지 알기 위해 같은 필드와 관련된 주석을 직접 볼 수 있다.
    가장 간단한 상황에서 주해는 하나의 표기일 뿐 정보를 제공할 뿐 코드가 실행하는 조작 자체에 직접적인 영향을 미치지 않는 메타데이터일 뿐이다.만약 당신이 계속 자바 프로그래밍에 종사하고 있다면, 지금은 그것들의 사용에 대해 상당히 익숙해졌을 것이다. 그러나 아마도 당신은 지금까지 자신만의 주석을 만드는 것을 필요로 한 적이 없을 것이다.이를 위해서는 자바 형식 @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 C 이 주석은 자바 요소에 사용할 주석을 지정할 수 있습니다.가능한 대상 유형은 ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER 및 TYPE.우리의 @ReconField 메모에서 그는 FIELD 레벨로 지정되었습니다.
    @Retention C 메모가 언제 적용될지 지정할 수 있습니다.가능한 값은 CLASS, RUNTIME 및 SOURCE입니다.런타임 시 RUNTIME에서 이 메모를 처리하기 때문에 설정해야 할 값입니다.
    이 데이터 검증 과정은 모든 데이터베이스에 조회를 실행하고 특정한 업무 기록 유형에 대한 모든 필드를 보여주는 실체 bean에 결과를 비추게 됩니다.매핑 데이터 실체의 모든 필드에 대한 주석은 프로세서가 특정 필드와 데이터베이스에서 찾은 값에 대해 데이터 비교를 수행하는 방법을 알려 줍니다.따라서 이 주석들이 어떻게 서로 다른 데이터 비교에 사용되는지 몇 가지 예시를 살펴보자.
    기존의 값을 검증하고 모든 데이터 원본의 필드와 정확하게 일치하기 위해서는 필드 ID와 보고서에 표시될 필드만 제공해야 합니다.
    
     
    @ReconField(id = CUSTOMER_ID, label = "Customer ID")
    private String customerId;
    
    모든 데이터 원본에서 찾은 값을 보여주기 위해서, 데이터 비교를 하지 않기 위해서,compareSources 요소를 만들고, 그 값을false로 설정해야 할 수도 있습니다.
     
    
    @ReconField(id = NAME, label = "NAME", compareSources = false)
    private String name;
    
    지정한 데이터 원본에서 찾은 값이 전부가 아닌 것을 검증하기 위해서,elementsourcestoCompare에 사용할 수 있습니다.이 물건을 사용하면 찾은 모든 값을 보여주지만, 원소에 열거된 데이터 원본에서 찾은 값만 비교합니다.이렇게 하면 모든 데이터 원본에 저장되지 않는 데이터 장면을 처리할 수 있다.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 주석에서 우리가 지정한 클래스입니다. 이것은 재구성 처리가 실행될 때 데이터 비교를 실행할 수 있습니다.프로세서가 지정한 클래스를 실례화하고 초기화할 수 있도록 사용할 클래스만 정의할 수 있습니다.이 주석에서 지정한 클래스는 일반적인 규칙 인터페이스를 실현해야 하며, 규칙 프로세서에 의해 규칙을 실행할 수 있습니다.
    이제 이 주해를 사용한 예를 봅시다.
    이 예에서, 우리는 주식 거래소가 United States인지 확인하고, 만약 그렇다면 이 데이터를 건너뛰는 사용자 정의 규칙을 사용했다.이를 위해, 이 규칙은 같은 기록의 exchangecountry 필드를 검사해야 합니다.
     
    
    @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;
    
    보시다시피 우리는 몇 가지 간단한 주석만 사용하여 상당한 유연성을 가진 다중 데이터베이스 장면을 대상으로 하는 데이터 검증 보고 기능을 설계했다.이 특수한 상황에서 주해는 데이터의 비교 과정을 구동하기 때문에 우리는 실제로 주해를 사용하여 찾은 매핑 데이터 실체에 대해 계산하고 직접 그것들을 사용하여 처리한다.

    좋은 웹페이지 즐겨찾기