我有一个旧项目,我需要与Spring 2.5.x集成(3.0不可能)。
我创建了一个bean,它必须自己初始化其字段userSession:
public class SomeBean {
UserSession userSession;
@PostContrust
public void init() {
HttpSession session = WebContext.current().getSession();
userSession = (UserSession) session.getAttribute("userSession");
}
}
是否有可能编写某种自动装配处理程序来解析userSession并将其传递给Spring自动装配,所以我的bean看起来就像:
public class SomeBean {
@Autowire UserSession userSession;
}
和处理程序如:
public class AutowireHanlder {
public boolean isCandidate(Class<?> type) {
return type.equals(UserSession.class);
}
public Object resolve(Class<?> type) {
HttpSession session = WebContext.current().getSession();
return (UserSession) session.getAttribute("userSession");
}
}
答案 0 :(得分:4)
我会使用会话范围的FactoryBean
:
public class UserSessionFactoryBean extends AbstractFactoryBean<UserSession> {
@Override
public Class<?> getObjectType() {
return UserSession.class;
}
@Override
protected UserSession createInstance() throws Exception {
HttpSession session = WebContext.current().getSession();
return (UserSession) session.getAttribute("userSession");
}
}
将UserSessionFactoryBean
定义为bean:
<bean scope="session" class="com.xyz.UserSessionFactoryBean"/>
...然后你应该能够将UserSession
自动装配到任何其他bean中。
此处的复杂性是UserSessionFactoryBean
必须session-scoped(请参阅bean scopes上的文档),因为它必须为每个HttpSession
返回一个新值。这意味着它自动装入的任何bean必须也是会话范围的,否则它将失败。您可以使用scoped-proxies来解决此限制。