Spring高階註解-Day1

專注的阿熊發表於2021-07-23

package com.example.typefilter;

import com.example.annotations.District;

import org.springframework.core.io.support.PropertiesLoaderUtils;

import org.springframework.core.type.filter.AbstractTypeHierarchyTraversingFilter;

import org.springframework.util.AntPathMatcher;

import org.springframework.util.ClassUtils;

import org.springframework.util.PathMatcher;

import java.util.Properties;

/**

  * 自定義掃描規則過濾器

  */

public class DistrictTypeFilter extends AbstractTypeHierarchyTraversingFilter {

     // 定義路徑校驗物件

     private PathMatcher pathMatcher;

     /** 定義區域名稱

      * 此處的資料應該是讀取配置檔案獲取的

      * 此處不能使用 @Value 註解讀取 properties 配置檔案的內容

      * 因為負責填充屬性值的 InstantiationAwareBeanPostProcessor TypeFilter 例項建立毫無關聯

     */

     private String districtName;

     public DistrictTypeFilter(){

         /**

          * 呼叫父類的建構函式

          * 第一個引數,不考慮基類

          * 第二個引數,不考慮介面上的資訊

          */

         super(false,false);

         // 藉助 Spring Resource 萬用字元路徑方式

         pathMatcher = new AntPathMatcher();

         // 讀取配置檔案

         try {

             Properties properties = PropertiesLoaderUtils.loadAllProperties("district.properties");

             // districtName 賦值

             districtName = properties.getProperty("common.district.name");

         }catch (Exception e){

             e.printStackTrace();

         }

     }

     // 本類將註冊為 Exclude ,返回 true 表示拒絕

     @Override

     protected boolean matchClassName(String className) {

         try {

             /**

              * 判斷是否在指定包下的類(只處理和區域相關的業務類)

              */

             if(!isPotentialPackageClass(className)){

                 // 不符合路徑規則

                 return true;

             }

             // 判斷當前區域和配置區域是否一致,外匯跟單gendan5.com不一致則不能註冊到 Spring IOC 容器中

             Class<?> clazz = ClassUtils.forName(className,DistrictTypeFilter.class.getClassLoader());

             // 獲取 District 註解

             District district = clazz.getAnnotation(District.class);

             // 判斷是否有此註解

             if(district == null){

                 return true;

             }

             // 取出註解的屬性

             String districtValue = district.value();

             // 校驗,如果取出的 value 屬性的值和配置檔案中提供的一致,則註冊到 IOC 容器中,返回 false ,否則返回 true

             return (!districtName.equalsIgnoreCase(districtValue));

         }catch (Exception e){

             throw new RuntimeException(e);

         }

     }

     // 定義可以處理類的類名,指定 package 下的

     private static final String PATTERN_STANDARD = ClassUtils.convertClassNameToResourcePath("com.example.service.*.*");

     /**

      * 本類邏輯中可以處理的類

      * @param className

      * @return

      */

     private boolean isPotentialPackageClass(String className){

         // 將類名轉換成為資源路徑,以匹配是否符合掃描條件

         String path = ClassUtils.convertClassNameToResourcePath(className);

         // 校驗

         return pathMatcher.match(PATTERN_STANDARD,path);

     }

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2783012/,如需轉載,請註明出處,否則將追究法律責任。

相關文章