百度
360搜索
搜狗搜索

controller是线程安全的吗,AsyncController到底有何作用?如何实现详细介绍

本文目录一览: SpringMVC的Controller线程安全吗?

SpringMVC的Controller线程不安全,因为 Controller默认情况下是Singleton(单例)的。
如和避免线程安全问题?有两种常用方式:

Springboot controller线程安全吗?

controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。

我们下面来简单的验证下:

我们首先访问 http://localhost:8080/testScope ,得到的答案是 1 ;然后我们再访问 http://localhost:8080/testScope2 ,得到的答案是 2 。

接下来我们再来给controller增加作用多例注解 @Scope("prototype")

我们依旧首先访问 http://localhost:8080/testScope ,得到的答案是 1 ;然后我们再访问 http://localhost:8080/testScope2 ,得到的答案还是 1 。

spring bean作用域有以下5个:

Spring MVC的Controller是线程安全的么

Spring MVC默认是单例,所以是线程不安全的,但是由于是可以配置的,你可以把Controller配置成多例(Scope)的,这样就是线程安全的。 判断线程安全就是会不会同时有两个或者多个线程访问到一个对象中的某个属性或者方法,如果是单例,就是说两个线程会同时获取一个对象,如果其中一个线程修改了这个对象的属性,但是另外一个对象正在使用这个属性的话,就造成了与预期的结果不一致,这就是线程不安全(我说的比较通俗,不完全)。 多例的话会给每个线程分配一个对象,多个线程之间互不干扰,所以是线程安全的

Spring MVC的Controller是线程安全的么

默认线程不安全。
Spring MVC默认注册bean都是单例模式,即:@Scope("singleton"),所有线程调用的都是同一个实例对象,所以线程不安全。不过可以手动指定javabean的scope为多例,即:@Scope("prototype"),每个线程调用都会重新实例化一个对象,这样就线程安全了。
@Controller@Scope("prototype")@RequestMapping("/user")public class UserController { // ...}

springboot框架开发的rest api工程,异步请求方法同步调用执行,怎么做?

1、controller本身就是单例的,非线程安全,多线程会共用对象
2、controller不要涉及业务层,从其属性来看,控制层来连接请求触发服务
3、根据需求,两种方法都可行,只要不在controller层处理业务;
4、如果三个方法都是需要返回数据的,建议各自写各自的controller层,清晰明白;其实,如果三个方法业务性质一样,也可以封装起来,通过参数判断具体执行那部分代码

Spring中Bean(@Controller、@Service、@Repository)线程安全情况分析

如果每次请求打到Controller时,都是一个新的Controller来处理的话,这里的RateLimiter是不会起作用的,所以这里的Controller应该是单例的,那如果是单例的话,是不是会有线程安全的问题?
请求结果
可以看到,在单例模式下Controller中只有用ThreadLocal封装的变量是线程安全的。为什么这样说呢?我们可以看到3次请求结果里面只有ThreadLocal变量值每次都是从0+1=1的,其他的几个都是累加的,而user对象呢,默认值是0,第二交取值的时候就已经是1了,关键他的hashCode是一样的,说明每次请求调用的都是同一个user对象。 下面将TestController 上的@Scope注解的属性改一下改成多实例的:@Scope(value = "prototype"),其他都不变,再次请求,结果如下:
分析这个结果发现,多实例模式下普通变量,取配置的变量还有ThreadLocal变量都是线程安全的,而静态变量和user(看他的hashCode都是一样的)对象中的变量都是非线程安全的。也就是说尽管TestController 是每次请求的时候都初始化了一个对象,但是静态变量始终是只有一份的,而且这个注入的user对象也是只有一份的。静态变量只有一份这是当然的咯,那么有没有办法让user对象可以每次都new一个新的呢?当然可以:
在config里面给这个注入的Bean加上一个相同的注解@Scope(value = "prototype")就可以了,再来请求一下看看:
可以看到每次请求的user对象的hashCode都不是一样的,每次赋值前取user中的变量值也都是默认值0。

controller中方法可以调用controller的方法吗

如果是方法的话,能不能调用还真不知道,没有尝试过。
如果是控制器,可以肯定是不能直接调用的,只能跳转。
如果你需要掉的是方法,请抽离出来,不要放在Controller里面,因为这不符合MVC设计的理念。
如果可以,不是线程安全的。

AsyncController到底有何作用?如何实现

控制器,说白了,就像一个物流公司一样的 控制中心,当你根据不同的物流请求 就会发货到哪里(也就是 发行到 不同的action 中)

SpringMVC当中的Controller接口和Struts2当中的Action有什么区别

总体来说没有很大区别。
SpringMVC和Struts2同属于javaWeb框架,springmvc属于spring子框架
其中,controller和action的区别:
相同点:
绑定url请求路径,实现简化请求映射操作
不同点:
controller传值在方法中,action确是在类的属性中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

//springMVC传值
//返回页面参数的第一种方式,在形参中放入一个map
@RequestMapping(value = "/hello1.htm")
public String hello(int id,Map

map){

System.out.println("hello1 action:"+id);

map.put("name", "huangjie");

return "hello";

}

//struts2传值

public class UserDRAction {

private UserDto user = new UserDto();

public String add(){

System.out.println("1111111111111");

System.out.println(

"user:"+user.getUser()

+" pass:"+user.getPass());

return "success";

}

}

action在不与spring整合时,每次用户访问则创建一个对象

本回答由电脑网络分类达人 郭强推荐

评论

0 0

张震超 V1 | JavaWeb行家向TA咨询

擅长: IT

其他回答

1. springmvc可以精确控制到方法上,controller可以单例开发,Struts2的action则是多例prototype开发,基于类进行拦截请求的。

2. springmvc的速度一般比Struts2要快,主要是s标签的原因。所以建议使用jstl表达式。

3.Struts2曾经爆出重大漏洞,就是ognl表达式URL注入的漏洞。目前springmvc还没有发现什么漏洞

SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action

虽然都是表现层,但隶属于不通的框架。

springmvc更安全,struts2的出现过漏洞,而springmvc没有。

springmvc速度更快,相对于struts2的拦截

使用上基本相同。

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

其实都是控制层,Spring MVC 在controlller中可以用注解,struts2获取值get set 方法获取,controller 方法里可以传参数,strust2里不能,并且strust2 安全,属于单例,线程安全。。。

接口是相同的,只是2代比前代传输速率快了许多。

首先这二者起到的作用都是相似的,都是页面请求转发到controller或者action去通过不同的方式获取数据。

以下是二者具体的区别:

这二者主要的区别以及比较明显的去边就是action是通过getter setter方法去注入数据的,而controller是通过@注解去实现的。

一个action会对应一个request请求的上下文,且一个action只可以对应一个url;controller是一个方法对应一个request请求上下文,同时一个方法和一个url对应。

再者就是性能问题了。spring mvc controller 一般比struts2 action返回要快一些。当然了,是在代码逻辑相同的情况下。

阅读更多 >>>  多线程原理,Java的多线程有什么用处

网站数据信息

"controller是线程安全的吗,AsyncController到底有何作用?如何实现"浏览人数已经达到20次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:controller是线程安全的吗,AsyncController到底有何作用?如何实现的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!