Зависимости Spring MVC в зависимых бинах и условия гонки - PullRequest
2 голосов
/ 18 февраля 2011

У меня есть некоторые серьезные сомнения в отношении зависимостей bean-компонентов области действия из-за недостатка знаний о Spring.

Я прочитал справочное руководство по 3.5.4.5 Bean-компонентам в качестве зависимостей и успешно реализовал пример этого.

Однако прежде чем идти дальше, я хотел бы поделиться своими проблемами.

Позвольте мне поделиться своим примером использования и небольшими деталями реализации

Для каждого запроса пользователя, который я хотел бысоздать город для каждого пользователя.

@Configuration
public class CityFactory{

   @Bean(name = {"currentCity" , "loggedInCity"})
   @Scope(value = WebApplicationContext.SCOPE_REQUEST,proxyMode = ScopedProxyMode.TARGET_CLASS)
   @Autowired
   public CityBean getCityBean(HttpServletRequest request) {
      return CityUtil.findCityWithHostName(request.getServerName());
   }

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

@RequestMapping("/demo")
@Controller
public class DemoController {

    @Autowired
    CityBean city;

    @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
    public ModelAndView helloWorld(@PathVariable("name") String name, Model model) {
        Map<String, Object> myModel = new HashMap<String, Object>();
        model.addAttribute("hello", name);
        model.addAttribute("test", "test in " + city.getDomainName() + "  !!!    ");

        return new ModelAndView("v3/test", "m", model);
    }
}

Мои вопросы:

1) Есть ли какое-либо состояние гонки?Я боюсь переключений контекста, которые разрушат мое приложение в среде с несколькими запросами.

2) Мне известно о другом решении, которое создает контроллер для запроса, но оно более подвержено ошибкам, чем текущее решение.Потому что другой разработчик может забыть определить контроллеры для отправки запроса.

Как сделать так, чтобы контроллеры глобально запрашивали область действия?Просто из-за маленького любопытства.

Спасибо ...

Ответы [ 2 ]

0 голосов
/ 18 февраля 2011

Здесь нет условий гонки.

В этом суть прокси-серверов с заданной областью - экземпляр CityBean, внедренный в DemoController, является прокси, который делегирует вызовы его метода фактическому экземпляру, привязанному к запросу.из CityBean, так что каждый запрос работает со своим собственным CityBean.

Я согласен с тем, что вам не следует настраивать запрос в самом контроллере - это может сбить с толку других людей, поскольку это не типичноподход в приложениях Spring MVC.

Вы также можете следовать подходу, предложенному Bozho, и вообще избавиться от bean-объекта, ограниченного запросами, хотя у этого подхода есть недостаток, поскольку он требует добавления дополнительного аргумента в методы контроллера..

0 голосов
/ 18 февраля 2011

Нет условий гонки - каждый запрос имеет свою нить

Но я думаю, что есть более простой способ сделать то, что вы хотите. Вы можете иметь свой CityBean:

@Service
public class CityBean {
    public String getDomainName(String serverName) {
        // obtain the name based on the server name
    }
}

А в вашем контроллере:

  • @Autowired CityBean bean
  • передать HttpServletRequest в качестве аргумента метода и вызвать cityBean.getDomainName(request.getServerName());

(Если вы используете какой-либо ORM, возможно, у вас будет сущность City, которую вы можете извлекать и передавать, просто опасаясь ленивых коллекций)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...