Spring在会话/请求范围bean上调用'destroy'方法

时间:2012-02-06 09:22:54

标签: spring session request

Spring如何知道何时在会话/请求范围内调用'destory'方法(换句话说,它如何检测相关bean是否超出范围)?

我在某处读到它使用请求/会话侦听器来通知这些事件。但是这些列表器需要在web.xml中定义,并且没有提到在Spring文献中定义这样的监听器。那么这是如何工作的?

3 个答案:

答案 0 :(得分:2)

  

并没有提到在Spring文献中定义这样的听众

哦,有:

  

为了支持在requestsession和全局会话级别(Web范围的bean)中对bean进行范围设定,在定义bean之前需要进行一些小的初始配置。[... ]

     

如果您使用Servlet 2.4+ Web容器,则需要将以下javax.servlet.ServletRequestListener添加到Web应用程序web.xml文件中的声明[...]

来自:4.5.4.1 Initial web configuration

另请注意,Spring在prototype - 范围内的bean上执行调用destroy。

答案 1 :(得分:2)

org.springframework.web.servlet.DispatcherServlet做到了。它使用自己的代码,例如注册所有这些范围内的bean的org.springframework.web.context.request.RequestAttributes#registerDestructionCallback回调列表功能。

答案 2 :(得分:1)

您可以为会话范围的bean实现接口DisposableBeanInitializingBean

org.springframework.beans.factory.InitializingBean接口允许bean在容器设置bean的所有必要属性后执行初始化工作。 InitializingBean接口指定单个方法afterPropertiesSet()

实现org.springframework.beans.factory.DisposableBean接口允许bean在包含它的容器被销毁时获得回调。 DisposableBean接口指定单个方法destroy()

在此处详细了解:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-nature