通過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)文章
Java防止頻繁請(qǐng)求、重復(fù)提交的操作代碼(后端防抖操作)
在客戶端網(wǎng)絡(luò)慢或者服務(wù)器響應(yīng)慢時(shí),用戶有時(shí)是會(huì)頻繁刷新頁面或重復(fù)提交表單的,這樣是會(huì)給服務(wù)器造成不小的負(fù)擔(dān)的,同時(shí)在添加數(shù)據(jù)時(shí)有可能造成不必要的麻煩,今天通過本文給大家介紹下Java防止頻繁請(qǐng)求、重復(fù)提交的操作代碼,一起看看吧2022-04-04
SpringCloud大文件分片斷點(diǎn)上傳實(shí)現(xiàn)原理
這篇文章主要介紹了SpringCloud大文件分片斷點(diǎn)上傳實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決
這篇文章主要給大家介紹了關(guān)于java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決辦法,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02
Java中將String轉(zhuǎn)換為int的多種方法
字符串轉(zhuǎn)換為整數(shù)是一個(gè)常見需求,本文主要介紹了Java中將String轉(zhuǎn)換為int的多種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07

