springboot如何获取接口下所有实现类

 更新时间:2022年09月29日 10:38:08   作者:喝酸奶要舔盖儿  
这篇文章主要介绍了springboot如何获取接口下所有实现类问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springboot获取接口下所有实现类

首先定义一个接口

public interface LoginUserService {
    /**
     * 判断手机号是否允许登录
     *
     * @param phone 手机号
     * @return 是否允许
     */
    boolean hasUser(String phone) throws ServiceException;
    /**
     * 通过Phone获取用户信息
     *
     * @param phone 手机号
     * @return 用户信息
     */
    UserDTO getUserInfoByPhone(String phone) throws LoginException;
}

编写实现类,三个

在这点我的登陆接口上继承了LoginUserService

在运行时需要通过查找bean,但是又不知道具体需要使用哪个bean,在这里自定义一个注解来标记使用哪个实现类

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface OrgainzationType {
    LoginTypeEnum value();
}

在实现类上标记具体类型

通过service使用bean进行查询想要的实现类

@Slf4j
@Service
public class LoginServiceImpl implements LoginService, InitializingBean, ApplicationContextAware {
    private ApplicationContext applicationContext;
    protected Map<LoginTypeEnum, LoginUserService> serviceMap = new HashMap<>();
    @Override
    public void afterPropertiesSet() throws Exception {
        // 查找所有LoginUserService接口的实现类
        Map<String, LoginUserService> beanMap = applicationContext.getBeansOfType(LoginUserService.class);
        for (LoginUserService impl : beanMap.values()) {
        	// 获取注解上的类型
            OrgainzationType annotation = AnnotationUtils.findAnnotation(impl.getClass(),OrgainzationType.class);
            // 如果没有添加注解则不需要使用
            if (Objects.isNull(annotation)) {
                continue;
            }
            serviceMap.put(annotation.value(), impl);
        }
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
 }

运行时的类

springboot动态调用实现类

因为项目需要,我们有一个功能的接口UserReader。其他的类都是实现这个接口。那么会有多个实现UserReader接口的实现类。现在需要在程序 中动态的去调用不通实现类中的方法getUser()。

下面既是功能实现代码:

1、添加接口

package com.example.mavenceshi.service;
/**
 * @author by CLP
 * @Classname UserReader
 * @Description
 * @Date 2020/9/8 15:16
 */
public interface UserReader {
    String getUser();
}

2、创建实现类

1)实现类UserReaderImpl1

package com.example.mavenceshi.service.impl;
import com.example.mavenceshi.service.UserReader;
import org.springframework.stereotype.Component;
/**
 * @author by CLP
 * @Classname UserReader1
 * @Description
 * @Date 2020/9/8 15:17
 */
@Component
public class UserReaderImpl1 implements UserReader {
    @Override
    public String getUser() {
           return "访问的UserReaderImpl1";
    }
}

2)实现类 UserReaderImpl2

package com.example.mavenceshi.service.impl;
import com.example.mavenceshi.service.UserReader;
import org.springframework.stereotype.Component;
/**
 * @author by CLP
 * @Classname UserReaderImpl2
 * @Description
 * @Date 2020/9/8 15:18
 */
@Component
public class UserReaderImpl2 implements UserReader {
    @Override
    public String getUser() {
          return "访问的UserReaderImpl2";
    }
}

3、获取实现类的相关接口 

package com.example.mavenceshi.config;
import com.example.mavenceshi.service.UserReader;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
 * @author by CLP
 * @Classname BeanConfig
 * @Description
 * @Date 2020/9/8 15:28
 */
@Component
public class BeanConfig implements InitializingBean, ApplicationContextAware {
    private Map<String, UserReader> queryServiceImplMap = new HashMap<>();
    private ApplicationContext applicationContext;
    public UserReader createQueryService(String type) {
        UserReader userReader = queryServiceImplMap.get(type);
        if (userReader == null) {
            return queryServiceImplMap.get("UserReader1Impl");
        }
        return userReader;
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        Map<String, UserReader> beanMap = applicationContext.getBeansOfType(UserReader.class);
        //遍历该接口的所有实现,将其放入map中
        for (UserReader serviceImpl : beanMap.values()) {
            queryServiceImplMap.put(serviceImpl.getClass().getSimpleName(), serviceImpl);
        }
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 教你如何用Java简单爬取WebMagic

    教你如何用Java简单爬取WebMagic

    今天给大家带来的是关于Java爬虫的相关知识,文章围绕着Java如何爬取WebMagic展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Spring中的底层架构核心概念类型转换器详解

    Spring中的底层架构核心概念类型转换器详解

    这篇文章主要介绍了Spring中的底层架构核心概念类型转换器详解,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • java for循环内执行多线程问题

    java for循环内执行多线程问题

    这篇文章主要介绍了java for循环内执行多线程问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 详解Java ScheduledThreadPoolExecutor的踩坑与解决方法

    详解Java ScheduledThreadPoolExecutor的踩坑与解决方法

    最近项目上反馈某个重要的定时任务突然不执行了,很头疼,开发环境和测试环境都没有出现过这个问题。定时任务采用的是ScheduledThreadPoolExecutor,后来一看代码发现踩了一个大坑。本文就来和大家聊聊这次的踩坑记录与解决方法,需要的可以参考一下
    2022-10-10
  • Java实现整数的逆序输出的三种方法

    Java实现整数的逆序输出的三种方法

    这篇文章主要介绍了Java实现整数的逆序输出的三种方法,第一种是无限制整数的逆序输出,第二种是非负整数的逆序输出,第三种是非特殊情况的逆序输出,每种方法给大家讲解的非常详细需要的朋友可以参考下
    2022-11-11
  • 基于Java实现无向环和有向环的检测

    基于Java实现无向环和有向环的检测

    这篇文章主要介绍了如何在 Java 中实现无向环和有向环的检测,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-04-04
  • Java中关键字final finally finalize的区别介绍

    Java中关键字final finally finalize的区别介绍

    这篇文章主要给大家分享的是 Java中final,finally,finalize 到底有什么区别,文章围绕final,finally,finalize的相关资料展开详细内容,具有一定的参考的价值,需要的朋友可以参考一下
    2022-04-04
  • Java关于jar包的知识详解

    Java关于jar包的知识详解

    这篇文章主要介绍了Java关于jar包的知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 超全面的SpringBoot面试题含答案

    超全面的SpringBoot面试题含答案

    这篇文章主要收录了44道面试中经常被问的SpringBoot问题,不管你是正在求职的新手还是已经工作很久的高手,这篇关于SpringBoot的面试题总结一定会让你有新的理解,让我们一起来看看吧
    2023-03-03
  • Mybatis中的游标查询Cursor(滚动查询)

    Mybatis中的游标查询Cursor(滚动查询)

    这篇文章主要介绍了Mybatis中的游标查询Cursor(滚动查询),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论