我对Springframework很新(正如你猜的那样)并遇到了一种迫切需要帮助的情况。
我在这里做了一个J2EE应用程序,在tomcat上运行了许多旧代码。无论如何,我们决定将Spring框架用于某些任务。例如,我们希望将安全对象(包含用户名和其他与身份验证相关的属性)存储为会话范围的bean。 由于有很多旧代码调用这个“安全对象”的构造函数,我的问题如下:
是否可以从会话中获取该对象(以弹簧的任何魔法方式)或者构造函数调用是否会生成一个全新的对象?
我读过一些关于“autowire机制”的内容......会不会对我有所帮助?
感谢您的回答和时间!
答案 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。由于您正在修改现有应用程序,我认为上述方法更好。