每日问答5

1.SpringMvc中的bean是线程安全的吗? 说出你的解决方案?

Spring管理的Bean对象默认是单例模式,当多线程操作Bean对象时就会出现线程安全问题;因为在多线程中线程改变了bean对象的可变成员变量时,其他线程就无法访问该bean对象的初始状态,这样就造成数据错乱。所以需要用线程同步来处理这个问题。

方法一、使用ThreadLocal,ThreadLocal会为每一个线程提供一个独立的变量副本,这样在多线程对数据访问就不会出现冲突。因为每一个线程都拥有自己的变量副本,因此也就不需要同步该变量。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

方法二、如果时web应用,可以使用Spring Bean的作用域中的request,在controller类前面加上@Scope("request"),表明每次请求都会生成一个新的Bean对象。这样也能起到线程安全的作用。

方法三、使用线程同步,关键字synchronized

当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要block ,多线程并发量大的时候会对性能有一定的影响。

方法四:避免定义全局变量

2.SpringMVC的流程

用户发送请求,springMVC的前端控制器DispatcherServlet接收该请求,并根据请求类别交与相对应的Handler处理器进行处理,Handler将该处理结果返回给前端处理器DispatcherServlet,前端处理器DispatcherServlet将处理结果转发给jsp页面,经过视图渲染之后返回给前端控制器DispatcherServlet一个html页面,最后,前端控制器将这个html页面响应给用户。

1、 用户发送请求至前端控制器DispatcherServlet

2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

5、 执行处理器(Controller,也叫后端控制器)。

6、 Controller执行完成返回ModelAndView

7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器

9、 ViewReslover解析后返回具体View

10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户

3.@RequestBody 和 @ResponseBody的区别

@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换。

@RequestBody

1、@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,

比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。

作用:

  • 注解用于将Controller的方法参数,根据HTTP Request Header的content-Type的内容,通过适当的HttpMessageConverter转换为JAVA类

  • 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。配合@RequestBody注解,以及HTTP Request Header中的Content-Type属性,HTTP Request Body中包含的XML或者JSON数据可以自动被转换成对应的Java对象。

@ResponseBody

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。配合@ResponseBody注解,以及HTTP Request Header中的Accept属性,Controller返回的Java对象可以自动被转换成对应的XML或者JSON数据。这个过程是通过HttpMessageConverter即消息转换器机制实现的。实现对象转xml的类为Jaxb2RootElementHttpMessageConverter,转换成功的条件:

a) 返回对象的类具有XmlRootElement注解。b) 请求头中的Accept属性包含application/xml。

对象转换成json数据时需要把Jackson2或者GSON加入工程的class path,Spring就会自动把GsonHttpMessageConverter加进来,这样Spring就会选择MappingJackson2HttpMessageConverter或者GsonHttpMessageConverter来进行数据转换。

4.@RequestParam 和 @PathViriable 的区别

`@RequestParam@PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是

@RequestParam

使用 @RequestParam 绑定请求参数值

在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法– value或name:请求参数的参数名– required:是否必须。默认为 true, 表示请求参数中必须包含对应 的参数,若不存在,将抛出异常– defaultValue:请求参数的默认值

@PathVariable

注解:映射 URL 绑定的占位符

带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的 意义

通过 @PathVariable 可以将 URL 中占位符参数绑定到控 制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable("xxx") 绑定到操作方法的入参中。

5.Resource 和 @AutiWired/@Qualifier 的区别

Autowired是spring的注解

Autowired是按照byType的方式注入,默认情况下要求依赖对象必须存在,如果允许null值,设置它的require属性为false.

autowired根据bean类型从spring上线文中进行查找,注册类型必须唯一,否则报异常

当接口存在两个实现类的时候必须使用@Qualifier指定注入哪个实现类,否则可以省略.

 

Resource是J2EE的注解

Resource默认是按照byName自动注入,有两个重要属性name和type.spring将Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值