如何在 Drool 中使用 Spring 托管 beans

How to use Spring managed beans in Drool

我有一个由 spring 管理的服务,我想在 drool 规则中使用或注入依赖项。如何在 Drool 规则中使用服务 bean?

@Service 
public class SomeService {

     public void doSomething() {}
}



dialect "mvel"

rule "something"
    when
       ................
    then 
       service.doSomething()
end

在调用它们时将 bean 实例传递到工作内存中,就像传递任何其他数据一样。这样您就可以自动装配或以其他方式利用依赖注入来获取 Spring 管理的单例bean,然后在您的规则中使用相同的 bean,而无需新建另一个实例。

@Component
class RuleExecutor {

  private final SomeService service; // Bean set via constructor injection

  public RuleExecutor(SomeService service) {
    this.service = service;
  }

  public void fireRules( ... ) { // assuming other data passed in via parameter
    KieSession kieSession = ...; 
    kieSession.insert( this.service); // insert bean into the working memory
    kieSession.insert( ... );  // insert other data into working memory
    kieSession.fireAllRules();
  }
}

在这个例子中,我使用了构造函数注入来传入bean实例。我们可以假设 @Service 和这个 @Component 都被组件扫描拾取了。

然后您可以在规则中与它进行交互,就像您对任何其他数据进行交互一样:

dialect "mvel"

rule "something"
when
  service: SomeService()
then 
  service.doSomething()
end

请记住,service: SomeService() 匹配工作内存中的 SomeService 实例,并将其分配给 service 变量以供在规则中使用。它不是新建一个新实例。