使用Spring Boot

时间:2017-01-03 14:19:21

标签: spring spring-boot dependency-injection java-8 dynamic-class-loaders

我正在尝试开发一个spring-boot应用程序,它为用户提供了创建和调用一些简单工作流程的可能性。

已经编写了工作流程的步骤(它们都扩展了同一个类),并且当用户创建工作流程时,他/她只选择他想要包含在其中的步骤。步骤和工作流程保存在数据库中。

当用户调用工作流程时,我的问题出现了:我想使用类加载器动态地实现每个步骤,但是使用spring注入的依赖项!

以下是插件的示例:

public class HelloWorldStepPlugin extends StepPlugin {

    private static final Logger LOG = LogManager.getLogger();

    @Autowired
    private HelloWorldRepository repository;

    public HelloWorldStepPlugin() {
        super(HelloWorldStepPlugin.class.getSimpleName());
    }

    @Override
    public void process() {
        LOG.info("Hello world!");
        this.repository.findAll(); // <= throw a NullPointerException because this.repository is null
    }

}

以下是我执行工作流程的方法(在另一个类中):

ClassLoader cl = getClass().getClassLoader();
for (Step s : workflow.getSteps()) {
    StepPlugin sp = (StepPlugin) cl.loadClass(STEP_PLUGIN_PACKAGE + s.getPlugin()).newInstance();
    sp.process();
}

如何让Spring注入HelloWorldRepository? 是否有更好的方法来做我想要的事情?

1 个答案:

答案 0 :(得分:3)

我建议您将步骤声明为原型bean。不要在数据库中保存类名,而是保存bean名称。然后从spring上下文中获取步骤和插件(即使用getBean())。