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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringSecurity 認證、注銷、權限控制功能(注銷、記住密碼、自定義登入頁)
SpringSecurity是一個強大的Java框架,用于保護應用程序的安全性,它提供了一套全面的安全解決方案,本文給大家介紹SpringSecurity認證、注銷、權限控制和注銷、記住密碼、自定義登入頁等知識總結,感興趣的朋友一起看看吧2025-03-03springboot的EnvironmentPostProcessor接口方法源碼解析
這篇文章主要介紹了springboot的EnvironmentPostProcessor接口方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08教你用java實現(xiàn)學生成績管理系統(tǒng)(附詳細代碼)
教學管理系統(tǒng)很適合初學者對于所學語言的練習,下面這篇文章主要給大家介紹了關于如何用java實現(xiàn)學生成績管理系統(tǒng)的相關資料,文中給出了詳細的實例代碼,需要的朋友可以參考下2023-06-06深入了解Java中Cookie和Session的區(qū)別
會話跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話,常用的會話跟蹤技術是Cookie與Session,本文就詳細的介紹一下Java中Cookie和Session的區(qū)別,感興趣的可以了解一下2023-06-06據(jù)說這個是可以擼到2089年的idea2020.2(推薦)
這篇文章主要介紹了據(jù)說這個是可以擼到2089年的idea2020.2,本教程給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Spring security基于數(shù)據(jù)庫中賬戶密碼認證
這篇文章主要介紹了Spring security基于數(shù)據(jù)庫中賬戶密碼認證,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03Java?C++題解leetcode字符串輪轉KMP算法詳解
這篇文章主要為大家介紹了Java?C++題解leetcode字符串輪轉KMP算法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09SpringBoot監(jiān)控SQL運行情況的流程步驟
Druid是Java語言中最好的數(shù)據(jù)庫連接池,雖然?HikariCP?的速度稍快,但是,Druid能夠提供強大的監(jiān)控和擴展功能?,也是阿里巴巴的開源項目,本文給大家介紹了SpringBoot監(jiān)控SQL運行情況的流程步驟,需要的朋友可以參考下2024-03-03