2011-01-25 51 views
1

我有一个老项目,我需要与Spring 2.5.x集成(3.0是不可能的)。如何处理Spring 2.5中的自定义自动装配对象?

我创建了一个豆,有通过自己initializate其领域userSession:

public class SomeBean { 
    UserSession userSession; 

    @PostContrust 
    public void init() { 
     HttpSession session = WebContext.current().getSession(); 
     userSession = (UserSession) session.getAttribute("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"); 
    } 
} 

回答

4

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:

我会使用会话范围FactoryBean做到这一点

<bean scope="session" class="com.xyz.UserSessionFactoryBean"/> 

...然后你应该然后能够自动装配UserSession到其它bean。

的复杂性在这里是UserSessionFactoryBean必须是session-scoped(见bean scopes文档),因为它必须返回每个HttpSession一个新值。这意味着它自动装入的任何bean必须会话范围,否则它会失败。您可以使用scoped-proxies避开此限制。

相关问题