Работают ли внутренние действия JASON с Spring Autowire? - PullRequest
0 голосов
/ 03 июля 2018

Я занимаюсь разработкой приложения с использованием JADE, JASON (платформы агента) и Spring Boot. По сути, у меня есть JADE-контейнер, в котором зарегистрированы агенты Jade и Jason. А поскольку я использую Spring, я склоняюсь к сервисам Autowire. В этом случае мне нужен доступ к некоторым службам внутри некоторых из моих внутренних действий Джейсона (которые я специально написал, расширяя класс DefaultInternalAction). который, кажется, не работает. У меня есть идея, как Autowire и как работают Бобы. Я сомневаюсь, находятся ли эти внутренние действия в контексте весны или нет. Я думаю, что нет. Вот почему может быть, что Autowire вещь не работает. Может кто-нибудь объяснить, пожалуйста, о реальном действии внутри контейнера Jade и внутренних действиях, чтобы я мог по-другому взглянуть на использование Autowire во внутренних действиях Jason.

1 Ответ

0 голосов
/ 09 июля 2018

Насколько я знаю, внутренние действия создаются Джейсоном, а не пружиной, поэтому вы не можете использовать сервисы autowire. Персонально, я создаю фабрику и использую ее для получения экземпляра сервиса. Примерно так:

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();

Может быть, это поможет.

...