java - 如何从 Spring boot 依赖注入(inject)中的对象列表中查找特定的类对象

标签 java spring spring-boot spring-mvc dependency-injection

我正在创建一个插件系统,插件将从数据库中获取,我的实现如下

基本插件接口(interface)

@Service
public interface Plugin{
   somemethod();
}

在插件包中加载所有插件,其中内部包名称将是插件名称和带有插件名称的类

package <>.plugin.Myplugin

import ....

@Service 
class MyPlugin implements Plugin {
   @Override
   somemethod() {}
}

我正在依赖注入(inject)中加载Plugin接口(interface)的所有实现类

@Controller
public class MyCon {

   private List<Plugin> plugins

   public MyCon(List<Plugin> plugins) {
        this.plugins = plugins;
   }

   ssomefuncitonality() {

        String objectNeedOfClass = <CLASS_NAME>;
        //Here
        System.out.println(this.plugins);
   }
}

这里可以看到列表中的所有对象,但是如何获取提供的类名的特定对象。

最佳答案

迭代列表并检查类名:

Optional<Plugin> plugin = this.plugins.stream()
        .filter(p -> p.getClass().getSimpleName().equals(objectNeedOfClass))
        .findFirst();

如果插件可能很大并且您经常这样做,请在构造函数中构建一个 map :

private Map<String, Plugin> plugins

public MyCon(List<Plugin> plugins) {
    this.plugins = plugins.stream().collect(Collectors.toMap(
            p -> p.getClass().getSimpleName(), Function.identity()));
}

ssomefuncitonality() {
    String objectNeedOfClass = ...;
    Plugin plugin = this.plugins.get(objectNeedOfClass);
    ...
}

关于java - 如何从 Spring boot 依赖注入(inject)中的对象列表中查找特定的类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60963222/

相关文章:

java - 考虑到其创建顺序,如何管理片段和 Activity ?

java - 如何拦截安卓设备上的音频流?

java - Tomcat 8.0 不会以纯 Spring MVC 模板启动

java - 在 Spring Data REST 中发布 @OneToMany 子资源关联

Java 考虑在添加 mongoDB 支持时在配置异常中定义一个类型的 bean

java - Play框架高延迟

java - 在 JavaFX 上,如何在不处理它和关闭应用程序的情况下隐藏它?

java - Intellij 下找不到 *.xml 文件

spring - 创建帐户、忘记密码和更改密码

java - 无法读取 spring boot 应用程序中的 application.properties