「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
1、springboot controller 单例
Spring中 controller默认是单例的,因为单例所以不是线程安全的。
所以需要注意下面几点
1、不要在Controller中定义成员变量,可能会造成数据混乱。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。
3、在Controller中使用ThreadLocal变量解决多线程问题
扩展阅读
spring bean作用域:
singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;
prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;
2、Springboot 环境变量配置
在开发的过程中不是所有的配置文件都可以写入yaml或者properties文件中,可能需要动态的从容器中读取,看下如何配置
现在看看如果我们使用环境变量的方式来配置我们的参数,如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${DEMO_APP_JDBC_URL:jdbc:mysql://127.0.0.1/demo?serverTimezone=Asia/Shanghai}
username: ${DEMO_APP_JDBC_USERNAME:demo}
password: ${DEMO_APP_JDBC_PASSWORD:demo}
hikari:
maximum-pool-size: ${DEMO_APP_JDBC_POOL_MAX_SIZE:30}
max-lifetime: ${DEMO_APP_JDBC_POOL_MAX_LIFE_TIME:60000}
minimum-idle: ${DEMO_APP_JDBC_POOL_MIN_SIZE:5}
以上使用${ENV:defauleValue}的形式配置了我们应用的相关参数,如果我们的运行环境配置了上面用到的环境变量,则使用环境变量中的配置,如果没有配置则使用默认的,比如我配置了环境变量DEMO_APP_JDBC_POOL_MAX_SIZE = 100,则应用程序中的连接池最大连接数就变成100了。
配合docker 使用更香哦
3、restful 接口
现在的应用基本上都是前后端分离的,所以后端接口基本上都是restful接口,怎么做呐?
在controller 的class 上增加注解 @RestController,就会生成restful接口
@RestController的作用 相当于@Controller + @ResponseBody
@RestController
@RequestMapping("/api/v1/h5Adapter")
@Api(description = "server-h5-adapter")
public class BaMessageConverterController {
4、@ResponseBody 和 @RequestBody 的区别
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。