Я разрабатываю приложение с использованием JADE, JASON (среды агентов) и Spring Boot. По сути, у меня есть контейнер JADE, в котором зарегистрированы агенты Jade и Jason. И поскольку я использую Spring, я склоняюсь к службам Autowire. В этом случае мне нужно получить доступ к некоторым службам внутри некоторых моих внутренних действий Джейсона (которые я специально написал, расширяя класс DefaultInternalAction). который кажется не работает. У меня есть идея, как Autowire и как работают Beans. Я сомневаюсь, что эти внутренние действия находятся в весеннем контексте или нет. Я думаю, что нет. Вот почему может быть, что Autowire не работает. Может кто-нибудь объяснить мне о реальных действиях внутри контейнера нефрита и внутренних действиях, чтобы я мог по-другому думать об использовании Autowire внутри внутренних действий Джейсона.
Работают ли внутренние действия JASON с Spring Autowire?
Ответы (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
Спасибо, и я сделал то же самое раньше. Но это не совсем Autowire. Как и здесь, мы делаем поиск в контексте весны. Я сделал то же самое, но чувствовал себя уродливым. Но нет другого варианта, я думаю, чтобы сделать это.
- person Damith; 12.07.2018