Spring高階註解-Day1
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 高階工程師-Java註解工程師Java
- 【進階】Spring中的註解與反射Spring反射
- Java高階特性-註解:註解實現Excel匯出功能JavaExcel
- Spring進階案例之註解和IoC案例Spring
- Spring註解Spring
- 【Spring註解】事務註解@TransactionalSpring
- SPRING-spring註解整理Spring
- Spring boot註解Spring Boot
- Spring : @SessionAttributes註解SpringSession
- Spring新註解Spring
- Spring註解大全Spring
- Spring常用註解Spring
- Spring Boot系列十八 Spring AOP + 註解實現統一註解Spring Boot
- Spring系列之新註解配置+Spring整合junit+註解注入Spring
- Spring 註解程式設計之模式註解Spring程式設計模式
- Spring: @ModelAttribute註解用法Spring
- Spring(使用註解配置)Spring
- Spring-註解注入Spring
- spring註解開發Spring
- spring boot 註解@ComponentSpring Boot
- Spring註解之@ConditionalSpring
- Spring註解?啥玩意?Spring
- Spring 註解開發Spring
- Spring註解之@ImportSpringImport
- Spring註解簡析Spring
- spring 框架常用註解Spring框架
- Spring註解系列——@PropertySourceSpring
- 七、Spring MVC高階技術SpringMVC
- Spring 高階原始碼核心思想:Spring IoCSpring原始碼
- Spring IoC 公共註解詳解Spring
- Spring AOP的AspectJ註解Spring
- 【Spring 註解】@Configuration和@BeanSpringBean
- Spring Boot註解 之 @RequestXSpring Boot
- Spring條件註解@ConditionalSpring
- Spring Cache快取註解Spring快取
- Spring中重要的註解Spring
- Spring @Transactional註解淺談Spring
- Spring 框架快取註解Spring框架快取