我有一个旧项目需要与 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");
}
}
是否可以编写某种 Autowiring 处理程序来解析 userSession 并将其 Autowiring 传递给 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");
}
}
最佳答案
我会使用 session 范围的 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
Autowiring 到任何其他 bean 中。
这里的复杂性在于 UserSessionFactoryBean
必须是 session-scoped (参见 bean scopes 上的文档),因为它必须为每个 HttpSession
返回一个新值。这意味着它被 Autowiring 到的任何 bean 都必须也是 session 范围的,否则它将失败。您可以使用 scoped-proxies 绕过此限制.
关于java - 如何在 Spring 2.5 中处理自定义 Autowiring 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4792140/