java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java获取接口所有实现类

Java获取接口的所有实现类方法总结示例

作者:FeelTouch Labs

这篇文章主要给大家介绍了关于Java获取接口的所有实现类方法的相关资料,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下

业务开发中,有时需要获取到某个接口或抽象类的所有实现方法,然后再某个类中集中进行处理,都有哪些方法呢?

一、 如果是普通的Java应用,可以使用JDK自带的一个类加载器ServiceLoader,其实就是SPI机制。

ServiceLoaderloader = ServiceLoader.load(IWork.class);

因为在ServiceLoader.load的时候,是根据传入的接口类,遍历META-INF/services目录下的以该类命名的文件中的所有类,并实例化返回。所以,不适用于抽象类。

二、如果在Springboot工程中,接口的实现可以由IOC容器来托管,就可以非常简单的从Spring容器中获取到实现类集合。具体包括2种渠道。

三、Springboot具体实现实例讲解

1)接口类

IWorkService.java

public interface IWorkService {
    String workPlace();
}

2)实现类

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实现类

WorkServiceLocator.java

@Component
public class WorkServiceLocator implements ApplicationContextAware {

    //手动获取,key是bean的name,value是实现类
    private Map<String, IWorkService> workServiceMap;
    
    //手动获取,list是所有的实现类
    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工程实现获取接口所有实现类需要借助SPI机制,且仅限于接口;对于Spring工程,则有@Autowired自动获取和实现ApplicationContextAware手动获取2种,既支持接口实现类、也支持抽象类的实现类。

附:java获取实现某个接口的所有实现类集合

关键在于: applicationContext.getBeansOfType(ChartService.class);

                  获得Map对象的key为实现类的名称如:chartSimpleServiceImpl

                  获得Map对象的value为实现类对象如: com.read.data.cms.service.impl.ChartExtraServiceImpl@5c85b6e9

applicationContext的获取方法有很多种,我这里暂列两种

第一种方式实现接口所有类集合(注解)

@Autowire
private ApplicationContext applicationContext;

Map<String,ChartService> res = applicationContext.getBeansOfType(ChartService.class);
res.get("实现类的字符串如:chartSimpleServiceImpl")
res.get获得的结果,就是当前实现类对象

第二种方式实现接口所有类集合(实现接口)

/**
 * @author: tianyong
 * @Time: 2019/6/26 11:17
 * @description:服务工厂(主要用于动态注入接口实现类)
 */
@Component
public class ServiceFactory implements ApplicationContextAware {

    //定义成员变量
    private static Map<String,ChartService> res;

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

    /**
      * @author: tianyong
      * @time: 2019/6/27 16:05
      * @description:根据标记返回当前接口实现类
      */
    public static <T extends ChartService> T getServices(String flag){
        return (T)res.get(flag);
    }
}

到此这篇关于Java获取接口的所有实现类方法的文章就介绍到这了,更多相关Java获取接口所有实现类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文