我正在尝试构建(或扩充)使用Spring bean的webapp,并使用注释进行初始化。我有一个我需要初始化的bean,但是bean需要HttpServletRequest
来正确初始化(它是用户身份bean)。
我浏览了文档,我已经看到了我需要的部分,但这些部分似乎并没有组装成一个完整的解决方案。
伪示例:
@Configuration
public class MyConfig {
@Bean
public UserBean userBean() {
// initialize with HttpRequest somehow?
}
}
@Controller
public class MyController {
@Resource
UserBean userBean;
@RequestMapping(value="/userId", method=RequestMethod.GET)
public String getUserInfo() {
// do stuff with the initialized user bean here
}
}
请注意,有多个控制器类,所以我不确定首先会遇到哪个。
我看到可以做的两件事:
MyConfig
类中以懒惰方式初始化bean。但我不确定如何访问HttpServletRequest
对象。getUserInfo()
方法将bean注入会话。但是,类中的每个方法都可能需要相同的初始化逻辑,而且我不确定如何将初始化的UserBean注入到会话中,以便其他控制器可以访问同一个UserBean。任何帮助/建议/等。将不胜感激
答案 0 :(得分:1)
看起来你缺少的是“spring scoped beans”功能。
基本上,scoped bean是由spring管理(创建/销毁)的bean,因此您不必担心这一点。您也不必担心初始化。 Spring会为你处理它。
请试试这个。将Scope
定义添加到UserBean
并将HttpServletRequest
注入您的UserBean
@Bean
@Scope("request")
public UserBean userBean() {
return new UserBean();
}
@Component
public class UserBean {
@Inject
HttpServletRequest request;
@PostConstruct
public void init(){
// Access request object to initialize your object
}
}
修改强>
如果您无法修改UserBean,您可以获得请求&在java配置中初始化bean。例如:
HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder
@Bean
@Scope("request")
public UserBean userBean() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return new UserBean(request);
}
答案 1 :(得分:0)
如果我理解正确,您正在尝试创建某种服务器端会话存储。
如果是这种情况,您最好的选择可能是使用Servlet环境附带的会话处理。根据Spring文档,javax.servlet.http.HttpServletRequest
- 带注释的方法可以采用getSession()
类型的参数。
在此对象上,您可以使用UserBean
方法获取用户的会话,或者如果不存在则生成新会话。你的setAttribute(String, Object)
- 类不再是bean了,只是一个普通的对象。您可以使用getAttribute(String)
将其存储在会话中,并使用UserBean
- 方法进行阅读。
无论您使用何种控制器,此会话对象都应包含相同的{{1}}对象。