SpringMVC的Controller是单例还是多例,有没有并发安全问题,如何解决

Spring的IOC容器中bean默认都是单例的,controller也是单例的,单例虽然可以减少创建对象和垃圾回收的时间,但同时也会造成线程不安全的问题,当所有请求访问同一个controller,此时controller中的成员变量是所有线程共用的,某个线程如果修改了这个变量,别的请求再来拿这个变量就是修改后的值了

解决:最好在controller中不要定义成员变量

非要在controller中定义一个成员变量的话:
1.在controller上加注解@Scope(“prototype”),将controller设置为多例模式,每次请求都实例化一个controller
2.使用ThreadLocal变量,让每一个线程都有自己独立的变量

RequestMapping 和 GetMapping有什么区别

@GetMapping是一个组合注解,既是@RequestMapping(method = RequestMethod.GET)的缩写,只接收get请求的方法,属于restful风格请求,通过名词定位资源,可以将请求参数直接写在路径中

@RequestMapping 没有指定请求方式,可以接收get、post等各种类型的请求

SpringBoot部分

相比Spring,Spring Boot有哪些优点

springboot是一个基于spring的框架,对spring做了大量的简化,使开发流程更快,更高效:

1.大量简化了maven依赖,管理了大量的基础依赖
2.基于注解配置,无需xml配置
3.内嵌tomcat,部署流程简单
4.打包和部署更加灵活,允许独立运行

SpringBoot如何做全局异常处理

1.使用@ControllerAdvice注解,定义一个全局异常处理类
2.在方法上打上@ExceptionHandler注解,定义这是一个异常处理方法
3.在@ExceptionHandler注解的参数上定义处理捕捉的异常类型,来捕获具体的异常并作出相应的处理

通常情况下,后台向前台返回结果时,会将结果封装成包含有错误码,错误信息以及数据本身的json数据,因此可以自定义异常类,自定义枚举错误码,在捕获全局异常后,向前台返回一个包含错误码的信息

@SpringBootApplication注解的含义

@SpringBootApplication是SprnigBoot项目的核心注解,目的是开启自动配置,并表示该类为主启动类。它包含三个子标签

  • @ComponentScan注解:开启ioc自动扫描注解,默认扫描当前包及其子包中@Controller,@Service等,并把这些bean加载到ioc器中
  • @EnableAutoConfiguration注解:启用springboot自动配置,自动所有扫描classpath目录下面所有jar中的spring.factories文件实现配置类批量注册
  • @SpringBootConfiguration注解:标志该类为springboot配置类

spring-boot-starter-parent的作用

这是SpringBoot的父工程,它的作用是帮我们管理了很多的基础jar包,同时它继承了spring-boot-dependencies,在spring-boot-dependencies项目中通过管理了大量的依赖,同时通过维护了这些依赖的版本号

但是在项目中,还需要通过 去导入具体的依赖才能使用