通過Interface掃描獲取所有實(shí)現(xiàn)類方式
通過Interface掃描獲取所有實(shí)現(xiàn)類
當(dāng)我們?cè)诖a中定義了一個(gè)接口,很多功能累實(shí)現(xiàn)了這個(gè)接口。所以我們可以統(tǒng)一管理這個(gè)接口,避免自己手動(dòng)創(chuàng)建對(duì)象。避免在后續(xù)的新功能假如是實(shí)現(xiàn)時(shí)修改過多的代碼,而導(dǎo)致意外出現(xiàn)。
ClassPathScanningCandidateComponentProvider 提供了一個(gè)從指定包中掃面接口實(shí)現(xiàn)類的功能。
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(BaseHandler.class));
Set<BeanDefinition> definitionSet = provider.findCandidateComponents("com.test.xxxx.handler");
for (BeanDefinition beanDefinition : definitionSet) {
Class<?> clazz = Class.forName(beanDefinition.getBeanClassName());
LOGGER.info("初始化數(shù)據(jù)同步處理service:{}", beanDefinition.getBeanClassName());
BaseHandler handler= (BaseHandler) clazz.newInstance();
//其他的業(yè)務(wù)邏輯,可以用map統(tǒng)一管理
//例如接口中加如一個(gè)方法,強(qiáng)制實(shí)現(xiàn)類實(shí)現(xiàn),并給出自己的唯一Id
HandlerDto handlerDto = service.getUnique();
}這樣我們就可以獲取到所有的實(shí)現(xiàn)類并在需要的時(shí)候,傳入?yún)?shù)獲取其對(duì)象。
完整實(shí)現(xiàn)測(cè)試
如下所示:
接口
public interface BaseHandler {
/**
* 獲取處理器的唯一編碼
*/
DataHandlerDto getUnique();
/**
* 業(yè)務(wù)實(shí)現(xiàn)邏輯
*/
void dealData(Object obj);
}統(tǒng)一管理和獲取實(shí)現(xiàn)對(duì)象
@Component
public class HnadlerManager {
public static final Map<HandlerDto, Class< ? extends BaseHandler>> HANDLER_SERVICE_MAP = new HashMap<>();
@PostConstruct
private static void initOperateService(){
LOGGER.info("初始化數(shù)據(jù)同步處理handler");
registerCollect();
}
private static void registerCollect(){
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(BaseHandler.class));
Set<BeanDefinition> definitionSet = provider.findCandidateComponents("com.eshore.cnomp.handler");
try {
for (BeanDefinition beanDefinition : definitionSet) {
Class<?> clazz = Class.forName(beanDefinition.getBeanClassName());
LOGGER.info("初始化數(shù)據(jù)同步處理service:{}", beanDefinition.getBeanClassName());
BaseHandler service = (BaseHandler) clazz.newInstance();
HandlerDto handlerDto = service.getUnique();
boolean iscontain = false;
for(Map.Entry<HandlerDto,Class< ? extends BaseHandler>> entry: HANDLER_SERVICE_MAP.entrySet()){
HandlerDto dto = entry.getKey();
if(dto.getId.equals(handlerDto.getId())){
iscontain = true;
LOGGER.info("已存在相同數(shù)據(jù)同步處理類:{}, {}",entry.getValue().getName(), JSON.toJSONString(dto));
}
}
if(!iscontain){
HANDLER_SERVICE_MAP.put(HandlerDto, service.getClass());
}
}
}catch (Exception e){
LOGGER.error("初始化數(shù)據(jù)同步處理service失敗", e);
throw new RuntimeException("初始化數(shù)據(jù)同步處理service失敗");
}
}
public static BaseHandler getHandler(String id){
for(Map.Entry<HandlerDto,Class< ? extends BaseHandler>> entry: HANDLER_SERVICE_MAP.entrySet()){
HandlerDto dto = entry.getKey();
if(dto.getId.equals(id)){
Class<? extends BaseHandler> clazz = entry.getValue();
try {
return clazz.newInstance();
} catch (Exception e) {
LOGGER.error("構(gòu)建采集兌現(xiàn)失敗", e);
return null;
}
}
}
return null;
}
}以上實(shí)現(xiàn)是單個(gè)兌現(xiàn)的實(shí)現(xiàn)。
如果需要以鏈路的方式,即同一個(gè)對(duì)象可以被多個(gè)處理器順序處理,則需要調(diào)整其存儲(chǔ)的方式為list并加入排序。
總結(jié)
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot中@Import三種使用方式實(shí)例詳解
這篇文章主要介紹了Spring?Boot中@Import三種使用方式,主要有引入普通類,引入importSelector的實(shí)現(xiàn)類及引入importBeanDefinitionRegister的實(shí)現(xiàn)類,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-11-11
Java判斷范圍型的數(shù)據(jù)是否存在重疊的方法
遇到了個(gè)問題,同一天可以輸入多個(gè)時(shí)間段,但是每個(gè)時(shí)間段的時(shí)間不能出現(xiàn)重疊,這不就是判斷數(shù)據(jù)返回是否有重疊的變種嗎,所以本文給大家介紹了Java判斷范圍型的數(shù)據(jù)是否存在重疊的方法,需要的朋友可以參考下2024-07-07
SpringBoot整合Jackson超詳細(xì)用法(附Jackson工具類)
這篇文章主要介紹了SpringBoot整合Jackson超詳細(xì)教程,本篇講的是Jackson的詳細(xì)用法,Jackson工具類在文章最后,直接復(fù)制粘貼即可使用,需要的朋友可以參考下2023-03-03
java.sql.SQLTransientConnectionException連接超時(shí)異常原因及解決方案
這篇文章主要介紹了java.sql.SQLTransientConnectionException連接超時(shí)異常原因及解決方案,通過文中介紹的方法可以幫助開發(fā)者快速定位并解決連接超時(shí)問題,需要的朋友可以參考下2025-09-09
mybatis-plus多表分頁(yè)查詢最佳實(shí)現(xiàn)方法(非常簡(jiǎn)單)
這篇文章主要給大家介紹了關(guān)于mybatis-plus多表分頁(yè)查詢最佳實(shí)現(xiàn)方法,文中介紹的方法非常簡(jiǎn)單,MyBatis-Plus中分頁(yè)查詢是比較方便的,這個(gè)功能在網(wǎng)站中也是非常常用的,這方面的知識(shí)點(diǎn)是必備的知識(shí)點(diǎn),需要的朋友可以參考下2023-08-08
Java實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題與讀者寫者問題詳解
這篇文章主要介紹了Java實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題與讀者寫者問題詳解,小編覺得挺不錯(cuò)的,這里分享給大家,供需要的親朋好友參考。2017-11-11

