美文网首页
SpringBoot 获取接口所有实现类

SpringBoot 获取接口所有实现类

作者: Tinyspot | 来源:发表于2022-10-18 22:22 被阅读0次

1. ListableBeanFactory#getBeansOfType

@Slf4j
@Component
public class BusinessExecutor implements ApplicationContextAware {

    public Map<String, IExecutor> executorMap = new HashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 根据接口类型获取相应的 bean
        executorMap = applicationContext.getBeansOfType(IExecutor.class);
        log.info("executorMap: " + JSON.toJSONString(executorMap));
    }

    public Map<String, IExecutor> getExecutorMap() {
        return executorMap;
    }
}
public interface IExecutor {
    void execute(String name);
}
@Service
public class UserExecutor implements IExecutor {
    @Override
    public void execute(String name) {
        System.out.println("UserExecutor...");
    }
}
@Service
public class OrderExecutor implements IExecutor{
    @Override
    public void execute(String name) {
        System.out.println("OrderExecutor...");
    }
}

2. 自定义方式

@RestController
@RequestMapping("/business")
public class BusinessController {
    @Resource
    private ExecutorFactory executorFactory;

    @RequestMapping("/execute")
    public String execute(String businessCode) {
        AbstractExecutor executor = executorFactory.processMap.get(businessCode);
        return executor.execute();
    }
}
@Component
public class ExecutorFactory {

    public ConcurrentHashMap<String, AbstractExecutor> processMap = new ConcurrentHashMap<>();

    public void register(String name, AbstractExecutor executor) {
        if (processMap.containsKey(name)) {
            return;
        }
        processMap.put(name, executor);
    }
}
public abstract class AbstractExecutor implements InitializingBean {
    @Resource
    private ExecutorFactory executorFactory;

    @Override
    public void afterPropertiesSet() throws Exception {
        executorFactory.register(getProcess().name(), this);
    }

    public abstract ProcessEnum getProcess();

    public abstract String execute();
}

@Component
public class QueryExecutor extends AbstractExecutor {
    @Override
    public String execute() {
        return "QueryExecutor";
    }
    @Override
    public ProcessEnum getProcess() {
        return ProcessEnum.QUERY;
    }
}

@Component
public class UpdateExecutor extends AbstractExecutor {
    @Override
    public String execute() {
        return "UpdateExecutor";
    }
    @Override
    public ProcessEnum getProcess() {
        return ProcessEnum.UPDATE;
    }
}
public enum ProcessEnum {
    QUERY("queryExecutor", "查询"),
    UPDATE("updateExecutor", "更新"),
    ;

    private String name;
    private String desc;

    ProcessEnum(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
}

相关文章

  • 工厂模式

    一个接口,多个实现类,根据工厂类获取接口的实例。

  • Redis操作

    Maven依赖: SpringBoot中 application配置: 接口: 实现类: 调用:使用@Autowi...

  • springboot 引用自定义外部依赖

    1、创建A springboot工程,2、创建接口类ceshi111,实现类3、maven install 一下,...

  • 接口

    接口 必须知道的接口特性 接口不可以被实例化 实现类必须实现接口的所有方法 实现类可以实现多个接口 接口中的变量都...

  • spring-data-jpa 源码阅读

    RepositoryFactorySupport 根据repo注解生成bean 根据接口注解获取元数据,获取实现类...

  • Java动态获取实现某个接口下所有的实现类对象集合

    最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行。 我想的方案是:直接获取某个接口下面所有的实现类...

  • 第十三章接口

    Java中继承为单继承,只有一个父类 接口 特性 接口不能被实例化 实现类必须实现接口的所有方法 实现类可以实现多...

  • 设计模式之组合模式

    组合模式 View顶层接口,随便搞个获取背景方法,不要在意没有返回值哈哈 文字类,实现View接口。 图片类,实现...

  • 12. SynchronousQueue

    SynchronousQueue类实现了BlockingQueue接口。阅读BlockingQueue文本以获取有...

  • java基础

    抽象类实现某个接口,可以不实现所有接口的方法,可以由它的子类实现。而普通类即非抽象类则必须实现接口里的全部方法。

网友评论

      本文标题:SpringBoot 获取接口所有实现类

      本文链接:https://www.haomeiwen.com/subject/vlyjzrtx.html