我正在尝试开发一个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? 是否有更好的方法来做我想要的事情?
答案 0 :(得分:3)
我建议您将步骤声明为原型bean。不要在数据库中保存类名,而是保存bean名称。然后从spring上下文中获取步骤和插件(即使用getBean())。