亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java獲取接口的所有實現(xiàn)類方法總結示例

 更新時間:2024年06月14日 11:29:56   作者:FeelTouch?Labs  
這篇文章主要給大家介紹了關于Java獲取接口的所有實現(xiàn)類方法的相關資料,文中通過代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下

業(yè)務開發(fā)中,有時需要獲取到某個接口或抽象類的所有實現(xiàn)方法,然后再某個類中集中進行處理,都有哪些方法呢?

一、 如果是普通的Java應用,可以使用JDK自帶的一個類加載器ServiceLoader,其實就是SPI機制。

ServiceLoaderloader = ServiceLoader.load(IWork.class);

因為在ServiceLoader.load的時候,是根據(jù)傳入的接口類,遍歷META-INF/services目錄下的以該類命名的文件中的所有類,并實例化返回。所以,不適用于抽象類。

二、如果在Springboot工程中,接口的實現(xiàn)可以由IOC容器來托管,就可以非常簡單的從Spring容器中獲取到實現(xiàn)類集合。具體包括2種渠道。

  • 直接使用Spring注解@Autowired

  • 實現(xiàn)ApplicationContextAware接口獲取并管理所有實現(xiàn)類。 就可以很簡單的利用@Autowired來獲取到實現(xiàn)類的list或map集合。

三、Springboot具體實現(xiàn)實例講解

1)接口類

IWorkService.java

public interface IWorkService {
    String workPlace();
}

2)實現(xiàn)類

TeacherWorkService.java

@Service
public class TeacherWorkService implements IWorkService {

    @Override
    public String workPlace() {
        return "school";
    }
}

DoctorWorkService.java

@Service
public class DoctorWorkService implements IWorkService{

    @Override
    public String workPlace() {
        return "hospital";
    }
}

3)Aware實現(xiàn)類

WorkServiceLocator.java

@Component
public class WorkServiceLocator implements ApplicationContextAware {

    //手動獲取,key是bean的name,value是實現(xiàn)類
    private Map<String, IWorkService> workServiceMap;
    
    //手動獲取,list是所有的實現(xiàn)類
    private List<IWorkService> workServiceList;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        workServiceMap = applicationContext.getBeansOfType(IWorkService.class);
        workServiceList = new ArrayList<>(workServiceMap.values());
    }


    public Map<String, IWorkService> getAllMap() {
        return workServiceMap;
    }

    public IWorkService getByName(String beanName) {
        return workServiceMap.get(beanName);
    }


    public List<IWorkService> getAllList() {
        return workServiceList;
    }
    
}

3)Test入口類

@SpringBootTest(classes = {Application.class})
@RunWith(SpringRunner.class)
public class WorkServiceTest {

    /**
     * 方式1:直接使用spring依賴注入注解
     */
    @Autowired
    private Map<String, IWorkService> workServiceMap;

    /**
     * 方式2:直接使用spring的依賴注入注解
     */
    @Autowired
    private List<IWorkService> workServiceList;

    /**
     * 方式3:借助spring的ApplicationContextAware
     */
    @Autowired
    private WorkServiceLocator workServiceLocator;

    @Test
    public void testAll() {

        Map<String, IWorkService> allMap = workServiceLocator.getAllMap();
        List<IWorkService> allList = workServiceLocator.getAllList();

        IWorkService iWorkService = workServiceLocator.getByName("teacherWorkService");

    }
}

四、總結

對于普通的Java工程實現(xiàn)獲取接口所有實現(xiàn)類需要借助SPI機制,且僅限于接口;對于Spring工程,則有@Autowired自動獲取和實現(xiàn)ApplicationContextAware手動獲取2種,既支持接口實現(xiàn)類、也支持抽象類的實現(xiàn)類。

附:java獲取實現(xiàn)某個接口的所有實現(xiàn)類集合

關鍵在于: applicationContext.getBeansOfType(ChartService.class);

                  獲得Map對象的key為實現(xiàn)類的名稱如:chartSimpleServiceImpl

                  獲得Map對象的value為實現(xiàn)類對象如: com.read.data.cms.service.impl.ChartExtraServiceImpl@5c85b6e9

applicationContext的獲取方法有很多種,我這里暫列兩種

第一種方式實現(xiàn)接口所有類集合(注解)

@Autowire
private ApplicationContext applicationContext;

Map<String,ChartService> res = applicationContext.getBeansOfType(ChartService.class);
res.get("實現(xiàn)類的字符串如:chartSimpleServiceImpl")
res.get獲得的結果,就是當前實現(xiàn)類對象

第二種方式實現(xiàn)接口所有類集合(實現(xiàn)接口)

/**
 * @author: tianyong
 * @Time: 2019/6/26 11:17
 * @description:服務工廠(主要用于動態(tài)注入接口實現(xiàn)類)
 */
@Component
public class ServiceFactory implements ApplicationContextAware {

    //定義成員變量
    private static Map<String,ChartService> res;

    /**
      * @author: tianyong
      * @time: 2019/6/27 16:04
      * @description:設置上下文參數(shù)
      */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        res = applicationContext.getBeansOfType(ChartService.class);
    }

    /**
      * @author: tianyong
      * @time: 2019/6/27 16:05
      * @description:根據(jù)標記返回當前接口實現(xiàn)類
      */
    public static <T extends ChartService> T getServices(String flag){
        return (T)res.get(flag);
    }
}

到此這篇關于Java獲取接口的所有實現(xiàn)類方法的文章就介紹到這了,更多相關Java獲取接口所有實現(xiàn)類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論