JASON内部动作可以与Spring Autowire一起使用吗?

时间:2018-07-03 06:17:59

标签: spring artificial-intelligence agents-jade agents

我正在使用JADE,JASON(代理框架)和Spring Boot开发应用程序。基本上,我拥有的是一个JADE容器,在该容器中同时注册了Jade和Jason Agents。由于我使用的是Spring,因此我倾向于自动装配服务。在这种情况下,我需要访问一些Jason内部动作(我自定义编写为扩展DefaultInternalAction类)中的某些服务。这似乎不起作用。我知道如何自动装配以及Bean如何工作。我的怀疑是这些内部行动是否在春季进行。我想不是。这就是为什么Autowire可能无法正常工作的原因。有人可以向我解释一下玉器容器内部的实际动作和内部动作,以便让我对在杰森内部动作中使用Autowire有所不同。

1 个答案:

答案 0 :(得分:0)

据我所知,内部动作是由jason创建的,而不是spring,因此不能自动装配服务。个人而言,我创建了工厂并将其用于获取服务实例。像这样:

public class SpringPluginFactory {
    private static final SpringPluginFactory INSTANCE = new SpringPluginFactory();
    private ApplicationContext applicationContext;

    private SpringPluginFactory(){}

    private <T> T createPlugin(Class<T> iface) {
      if(applicationContext == null){
        throw new IllegalStateException("applicationContext cannot be null");
      }
      try {
          return applicationContext.getBean(iface);
      } catch (Exception e) {
          throw new RuntimeException("factory unable to construct instance of " + iface.getName());
      }
  }

  public static <T> T getPlugin(Class<T> iface){
      return INSTANCE.createPlugin(iface);
  }

  public void setApplicationContext(ApplicationContext applicationContext) {
      this.applicationContext = applicationContext;
  }

}

然后我创建bean来设置aplicationContext:

@Bean
public SpringPluginFactory pluginFactory(ApplicationContext applicationContext){
    SpringPluginFactory pluginFactory = SpringPluginFactory.INSTANCE;
    pluginFactory.setApplicationContext(applicationContext);
    return pluginFactory;
}

并在任何行为或内部行为中使用工厂

SpringPluginFactory.getPlugin(YouService.class).doSomething();

也许会有所帮助。