[英]Adding Spring bean using annotations : placing it & initializing properties values
[英]Initializing a Spring Session Bean using an HttpRequest (using annotations)
我正在嘗試構建(或擴充)使用Spring Bean(已通過注釋初始化)的Web應用程序。 我有一個需要初始化的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。 任何幫助/建議/等。 將不勝感激
看起來您缺少的是“ 春季范圍豆 ”功能。
基本上,作用域Bean是指在春季之前進行管理(創建/銷毀)的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請求=(((ServletRequestAttributes)RequestContextHolder
@Bean
@Scope("request")
public UserBean userBean() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return new UserBean(request);
}
如果我理解正確,則您正在嘗試創建某種服務器端會話存儲。
在這種情況下,最好的選擇是使用Servlet環境隨附的會話處理。 根據Spring的文檔,@ @RequestMapping
注釋的方法可以使用javax.servlet.http.HttpServletRequest
類型的參數。
在此對象上,可以使用getSession()
方法獲取用戶的會話,或者如果不存在則生成一個新的會話。 您的UserBean
-class將不再是bean,而只是普通對象。 您可以使用setAttribute(String, Object)
將其存儲在會話中setAttribute(String, Object)
並使用getAttribute(String)
方法讀取它。
然后,無論您位於哪個控制器中,此會話對象都應包含相同的UserBean
對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.