SpringMVC如何在调用构造函数时从会话范围获取bean

时间:2010-07-30 12:54:55

标签: java spring spring-mvc

我对Springframework很新(正如你猜的那样)并遇到了一种迫切需要帮助的情况。

我在这里做了一个J2EE应用程序,在tomcat上运行了许多旧代码。无论如何,我们决定将Spring框架用于某些任务。例如,我们希望将安全对象(包含用户名和其他与身份验证相关的属性)存储为会话范围的bean。 由于有很多旧代码调用这个“安全对象”的构造函数,我的问题如下:

是否可以从会话中获取该对象(以弹簧的任何魔法方式)或者构造函数调用是否会生成一个全新的对象?

我读过一些关于“autowire机制”的内容......会不会对我有所帮助?

感谢您的回答和时间!

2 个答案:

答案 0 :(得分:2)

如果使用new运算符,则自己构造对象并调用构造函数。通过new创建对象时不涉及Spring。

答案 1 :(得分:1)

如果您的代码通过调用类的构造函数(即通过调用new Security())来创建安全对象的实例,则每次都会获得 new 实例。

在spring applicationContext.xml文件中为安全对象声明一个bean。要使安全对象会话作用域,您需要将其scope声明为session将其设为代理

<bean id="securityObject" class="com.xyz.Security" scope="session">
    <aop:scoped-proxy /> <!-- important -->
</bean>

现在,客户端不是调用new Security(),而是从Spring应用程序上下文中获取Security对象(参见第1行):

void someMethod() {
    //...
    Security securityObject = applicationContext.getBean("securityObject"); // 1
    securityObject.doSomething(); // 2
    //...
}

Spring将负责为每个会话创建Security的实例。第1行调用返回的对象不是实际的Security对象,而是代理对象。在第2行调用securityObject.doSomething()时,代理对象将查找为该会话创建的实际对象,并将调用委托给它。这将由Spring管理。

请注意,要在第2行获取bean,首先需要一个ApplicationContext对象的句柄。如何获得该对象取决于调用代码的位置。 修改:统一实现这一目标的一种简单方法是实施ApplicationContextAware界面。

注意:不是从应用程序上下文中获取bean,而是可以通过Spring连接它,但这需要您为所有需要安全对象的客户端声明bean。由于您正在修改现有应用程序,我认为上述方法更好。