У меня есть класс контроллера, который вызывается первым в моем приложении. Там я планировал получить значение из Карты из класса Service.Когда запускать карту в службе, вызванной контроллером весной с впрыском зависимостей?
Вот контроллер:
@Controller
public class AppController {
public Service doSomethingWithTheMap(String key) {
return ServiceImpl.getMapValueFor(key).exec();
}
}
я получаю вопросы, потому что во время инициализации, а во надетой ценностей на карте Службы, чтобы быть более точным, я требовать BeanFactory, поскольку значения в карте Служащих реализации. Выполнение этого в статическом блоке приведет к тому, что BeanFactory будет нулевым, потому что он не вводится, но я бы догадался.
Таким образом, в результате этого вызова initMap() я чувствую себя немного ... должно быть лучшее решение.
Любые подсказки кто-нибудь?
Должен признать, что я новичок в весне и, может быть, я все испортил. FYI Карта пришла мне в голову после бесконечных, если еще проверяет, какая служба вызывается на основе ввода String. Поэтому я заменил его на карту и простой один вкладыш в контроллере.
ServiceImpl.getMapValueFor(key).exec();
Вот класс обслуживания:
@Service
public class ServiceImpl {
private static Map<String, Service> map;
private static ApplicationContext context;
@Autowired
public void setApplicationContext(ApplicationContext factory) {
this.context = factory;
}
public static Service getMapValueFor(String key) {
if (map == null) {
initMap();
}
return map.get(key);
}
private static void initMap() {
/*
* FIXME: We can not init the map in a static block or directly
* initialize it since the factory is not injected until execution of a
* static block and will be null.
*/
BeanFactory factory = context;
map = new HashMap<String, Service>();
map.put("key", factory.getBean(SomeService.class));
}
}
Взгляните на: http://stackoverflow.com/questions/1192823/spring-wire-a-static- класс – davesbrain
Спасибо @Dave. Понимаю. Похоже, моя проблема - это порядок инициализации. Пробовал это теперь, используя способ конструктора, инициализирующий (или проводку) класс, содержащий карту, но все же, NullPointer, потому что контекст/фабрика не существует при переносе на карту. – init5