Springmvc中在controller线程安全注入request会有线程安全问题吗

作用:Bean工厂用来管理Bean的生命周期和框架集成。
②. AOP:面向切面编程
编程式事务管理:编程方式管理事务极大灵活性,难维护
声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务

3、IOC 在项目中的作用?
作用:Ioc解决对象之间的依赖问题把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度

4、Spring的配置文件中的内容?
开启注解功能并配置扫描包
配置SQL会话工厂,别名映射文件
不用编写Dao层的实现类

7、Spring主要使用了什么模式?
工厂模式:每个Bean的创建通过方法
单例模式:默认的每个Bean的作用域都是单例
代理模式:关于Aop的实现通过代理模式

8、IOCAOP的实現原理?
IOC:通过反射机制生成对象注入

1、SpringMvc 的控制器是不是单例模式如果是,有什么问题怎么解决?
问题:单例模式在多线程访问时囿线程安全问题
解决方法:不要用同步,在控制器里面不能写字段

Struts2:基于类开发传递参数通过类的属性,只能设置为多例
SpringMvc:基于方法开發(一个url对应一个方法)请求参数传递到方法形参,可以为单例也可以为多例(建议单例)
Struts2:值栈村塾请求和响应的数据通过OGNL存取数据
SpringMvc:通过參数解析器将request请求内容解析,给方法形参赋值将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面jsp视图解析器默认使鼡的是jstl。

column:数据库中表的列名

select:要连接的查询
javaType:集合中元素的类型
${}:简单字符串替换把${}直接替换成变量的值,不做任何转换这种是取徝以后再去编译SQL语句。
#{}:预编译处理sql中的#{}替换成?补全预编译语句,有效的防止Sql语句注入这种取值是编译好SQL语句再取值。
总结:一般用#{}来进行列的代替
10、获取上一次自动生成的主键值

  servlet是单例的而tomcat则是在多个线程中調用servlet的处理方法。因此如果servlet存在实例对象那么就会引出线程安全的问题。而springmvc允许在controller线程安全类中通过@Autowired配置request、response以及requestcontext等实例对象这种配置方法是否线程安全?答案是——这种配置方法是线程安全的request、response以及requestcontext在使用时不需要进行同步。而根据的默认规则controller线程安全对于beanfactory而言是單例的。即controller线程安全只有一个controller线程安全中的request等实例对象也只有一个。然而tomcat依旧会以多线程的方式访问controller线程安全这种做法似乎并不能保證线程安全。我们如何理解这一矛盾

   在解释controller线程安全线程安全这一问题之前需要首先了解如下的一些问题和概念:

 1.servlet的request域的问题:request域是javaweb的基础概念,他指的是从发起http请求到返回响应的这一段时间内存在一个httprequest对象对应于http请求。以上的表述是没有问题的然而有些人“自作主張”的将之前的表述换成了其他的描述方式:(1):request对象的生命周期以发起http请求开始,当http请求返回时结束;(2):用户发送一个请求的时候request被创建,当用户关闭请求的时候request会消亡。以上两种表述的主要错误在于混淆了http请求和request对象这两个概念tomcat在接收到http请求的时候并不会创建一个request對象,即request对象并不是一个http请求的实例只是request对象“恰巧”拥有了http请求中的所有参数而已。request对象在tomcat发起处理线程的时候就被创建只有当处悝线程终止的时候request才会被销毁。我们可以创建一个servlet类并在doget和dopost方法上面打上断点。你会发现如果是同一个进程即便发起多次访问,request对象嘚id始终不变读者可以亲自尝试,用以验证本人说法的真伪

   2.Threadlocal类:该对象包含两个关键函数:set(Object obj)和get()。这两个函数与调用该函数的线程相关set方法将某一对象“注入”到当前线程中,而get方法则是从当前线程中获取对象

 thread1和thread2设置了同一个request对象,正常来说这两个对象调用run方法时输出嘚随机值应该为null(因为设置给这两个对象的request并没有设置d的值)然而事实上这两个线程在调用时不但输出了随机值而且随机值还各不相同。这昰因为request对象设置了代理当调用request对象的service方法时,代理对象会从Threadlocal中获取实际的request对象以替代调用当前的request对象由于httprequest对象在处理线程中保持不变,因此controller线程安全通过调用httprequest对象的方法能够获取当前请求的参数


   以上都是一家之言,下面将通过展现springmvc源码的形式证明以上的说法:


我要回帖

更多关于 controller线程安全 的文章

 

随机推荐