我在Spring 3中尝试使用会话范围的bean。我有以下bean定义:
<bean id="userInfo" class="net.sandbox.sessionbeans.UserInfo" scope="session" />
这是net.sandbox.controllers.RegistrationController
,一个需要访问这个bean的控制器类。为了简洁起见,我已经取出了进口产品。
@Controller
@RequestMapping("/register")
public class RegistrationController {
private UserInfo userInfo; // This should reference the session-scoped bean
@RequestMapping(method = RequestMethod.GET)
public String showRegForm(Model model) {
RegistrationForm regForm = new RegistrationForm();
model.addAttribute("regform", regForm);
return "regform";
}
@RequestMapping(method = RequestMethod.POST)
public String validateForm(@Valid RegistrationForm regForm, BindingResult result, Model model) {
if (result.hasErrors()) {
return "regform";
}
userInfo.setUserName(regForm.getFirstName());
model.addAttribute("regform", regForm);
return "regsuccess";
}
}
有没有办法自动将我定义的会话范围bean绑定到private UserInfo userInfo
中的成员变量RegistrationController
?
答案 0 :(得分:8)
是的 - 请参阅section 3.4.5.4 of the Spring manual, "Scoped beans as dependencies"。
简而言之,您可以要求Spring将会话范围的bean包装在单例代理中,该代理在您调用范围bean上的方法时查找正确的会话。这称为“范围代理”,并使用<aop:scoped-proxy>
配置宏。然后,您可以像注释其他任何内容一样注入引用(例如<property>
或@Autowired
)。有关详细信息,请参阅上面的链接。
答案 1 :(得分:1)
默认情况下,Spring通过在运行时实现接口来创建代理。因此,代理上可用的唯一方法是UserInfo实现的任何接口(如果有)中定义的方法。您可能必须创建一个包含setUserName()方法的合适接口。
或者,您需要强制使用基于CGI的代理(代理是在运行时创建的类的子类,因此它不需要接口)。指定:
<bean id="userInfo" class="net.sandbox.sessionbeans.UserInfo" scope="session" >
<aop:scoped-proxy proxy-target-class="true"/>
</bean>
答案 2 :(得分:0)
关于此评论:
我尝试应用这种技术。我放 在豆子里面 定义和我@Autowired'd私人 UserInfo userInfo。它似乎工作, 但由于某种原因豆子的二传手 功能未正确执行...... i.imgur.com/zkxVA.png - 彼得1小时 前
如果使用基于接口的代理,则除非接口具有setter方法,否则setter方法在Proxy上不可用。
答案 3 :(得分:0)
如果你不喜欢XML,你也可以像这样使用ObjectFactory<T>
:
@RestController
public class MyController {
private final ObjectFactory<MySessionScopedComponent> OFSession;
@Autowired
public MyController(ObjectFactory<MySessionScopedComponent> OFSession) {
this.OFSession = OFSession;
}
@RequestMapping(path = "/path", method = RequestMethod.GET)
public String myMethod () {
MySessionScopedComponent sessionBean = OFSession.getObject();
// Do some stuff
return bean.myValue();
}
}
注意:使用Spring Boot 1.5.6(Spring 4.3)进行测试