Работают ли внутренние действия JASON с Spring Autowire?

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


person Damith    schedule 03.07.2018    source источник


Ответы (1)


Насколько я знаю, внутренние действия создаются jason, а не spring, поэтому вы не можете использовать сервисы 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();

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

person nikelyn    schedule 09.07.2018
comment
Спасибо, и я сделал то же самое раньше. Но это не совсем Autowire. Как и здесь, мы делаем поиск в контексте весны. Я сделал то же самое, но чувствовал себя уродливым. Но нет другого варианта, я думаю, чтобы сделать это. - person Damith; 12.07.2018