在spring mvc中启动任何会话之前,为什么会话范围bean可以访问?

时间:2015-11-29 03:12:23

标签: java spring spring-mvc session spring-session

我正在尝试在spring mvc中使用会话范围bean以及以下bean定义

<bean id="test" class="com.gk.testScope.Test" scope="session">
<property name="name" value="mytest"></property>
<aop:scoped-proxy/>
</bean>

控制器代码

@Controller
public class MyController 
{


     @Autowired
     Test t;
     @RequestMapping(value="test1",method=RequestMethod.GET)
     public String test1(HttpServletRequest request) {

              System.out.println("name"+t.getName());
              request.getSession();
              return "test1";
      }

}

在运行上面的代码时,即使在开始任何会话之前,它也会打印 mytest 。有人可以解释会话范围在这里做什么吗?

2 个答案:

答案 0 :(得分:0)

下面的代码行实际上并不创建会话,它获取了servlet容器已经创建的会话。

request.getSession();

现在是重要的东西。如果您不熟悉Spring示波器,那么一开始就有点棘手。

在另一个单例bean中注入一个单独的bean是直观的,也是有意义的。你想把一个不是Singleton的bean注入一个Singleton bean怎么样?注射应按要求进行吗?所以要配置它,我们不能直接注入非单例的bean。我们为非单例bean注入一个代理,然后根据需要注入一个新的bean。

<aop:scoped-proxy/> 

上述标记有助于为服务器上创建的每个会话(因为范围是“会话”)创建一个新bean,并根据需要注入控制器。

我相信有人可以用更简单的方式解释。希望这可以帮助。

答案 1 :(得分:0)

spring框架提供了一个控制反转编码框架;这意味着你只需要关注你的业务逻辑并将其作为处理函数写下来,spring框架会处理剩下的事情并调用你的处理函数。

例如,在mvc spring框架中,http请求处理,http会话处理,bean生命周期管理都是在spring-framework中完成的,你只需编写&#34; test1()&# 34;客户端点击URL&#34; / test1&#34;。

时调用的函数

当客户端启动与spring Web服务器的HTTP会话时,框架将创建会话范围,并且将创建所有会话范围bean。当客户端发送HTTP请求时,框架将创建一个Request范围和所有创建请求级别范围bean。

请参阅春季参考文档中的6.5 Bean scopes