Прокси-сервер с привязкой к сеансу AOP получает область singleton

#java #spring #spring-mvc #spring-aop

#java #весна #spring-mvc #spring-aop

Вопрос:

Я пытаюсь внедрить компонент InputForm с сессионной областью в контроллер с одноэлементной областью, но вместо этого компонент InputForm получает одноэлементную область. Любая помощь приветствуется.

 @Controller
@RequestMapping("/app")
public class MyAppController {

// AOP session scoped proxy type CGLIB
@Autowired  private InputForm inputForm;

@RequestMapping(value = "/home", method = RequestMethod.GET)
public ModelAndView returnHome() {
    Map<String, Object> modelMap = new HashMap<String, Object>();
    modelMap.put("inputForm", inputForm);
    return new ModelAndView("homePage", modelMap); 
}

@RequestMapping(value = "/process", method = RequestMethod.POST)
public ModelAndView processData(@ModelAttribute("inputFormAttr")                                                    
     InputForm inputFormBinding) {
// inputFormBinding is the data bound from inputs in jsp page.
this.inputForm = inputFormBinding;
}


<bean id="inputForm" class="<package>.InputForm" 
                    scope="session" init-method="init">
    <property name="id" value="${property_id}"/>
    <property name="name" value="${property_name}"/>
    <property name="phoneNo" value="${property_phone}"/>
    <aop:scoped-proxy proxy-target-class="true"/>
</bean>
  

Комментарии:

1. Как вы можете определить, что это одноэлементный?

2. Как вы загружаете Controller класс?

3. <context:annotation-config /> @Sotirios: Область действия по умолчанию — singleton, верно?

4. Да, по умолчанию используется одноэлементный. Но вы не использовали область по умолчанию. Вы использовали session .

5. Извините, я имел в виду, что контроллер находится в одноэлементном, а не в введенном компоненте

Ответ №1:

То, что вы делаете, прекрасно. Spring введет прокси-сервер в цель внедрения

 @Autowired  private InputForm inputForm;
  

Но когда вы вызываете методы для этого объекта, прокси-сервер делегирует объект, который будет храниться в HttpSession .

Обратите внимание, что каждый из целевых компонентов будет иметь одинаковые свойства, установленные через ваши заполнители свойств

 <property name="id" value="${property_id}"/>
  

Это может ввести вас в заблуждение при отладке, но у компонента есть область сеанса.

Комментарии:

1. Но тогда как я могу получить свойства в области сеанса?

2. @User49234123412341 Вы устанавливаете свойства всех объектов, созданных на основе этого определения компонента, в одно и то же значение. Если вы измените один в одном сеансе, это не повлияет на другой в другом сеансе.

3. Но это моя проблема. Я открыл приложение на другом компьютере, и они видят те же свойства в InputForm, что и на первом компьютере. Как вы можете видеть, запрос get просто получает прокси и устанавливает в карту модели

4. @User49234123412341 Вы изменили значения свойств на любом из компьютеров?

5. Все, что изменяется на первом компьютере с помощью запроса post другого контроллера, отображается на втором компьютере при вызове запроса get