如何在Spring 2.5中处理自定义自动对象?

时间:2011-01-25 10:07:36

标签: java spring spring-mvc

我有一个旧项目,我需要与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");
    }
}

1 个答案:

答案 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来解决此限制。