Springboot 重点知识点最强整理

云惠网小编 2021年11月25日13:18:31
评论
4895字阅读16分19秒
摘要

目录1、springboot controller 单例2、Springboot 环境变量配置3、restful [email protected] 和 @RequestBody [email protected] 的获取方式和线程安全1、springboot controller 单例Spring中 controller默认是单例的,因为单例所以不是线程安全的。所以需要注意下面几点不要在Controller中定义成员变量,可

广告也精彩

异步调用主要处理一些不要求及时返回的任务,springboot提供了支持

@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json [email protected] 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

SpringBoot中使用 async实现异步调用

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
@EnableCircuitBreaker
@EnableCaching
@EnableScheduling
public class Application {
​
   public static void main(String[] args) {
       SpringApplication.run(Application.class, args);
   }
}
​

6、async异步调用

现在看看如果我们使用环境变量的方式来配置我们的参数,如下:

Controller中获取request对象后,如果要在其他方法中(如service方法、工具类方法等)使用request对象,需要在调用这些方法时将request对象作为参数传入

1、springboot controller 单例

  1. 不要在Controller中定义成员变量,可能会造成数据混乱。
  2. 万一必须要定义一个非静态成员变量时候,[email protected](“prototype”),将其设置为多例模式。
  3. 在Controller中使用ThreadLocal变量解决多线程问题
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}

基于注解的使用方式包括如下三步:

3、restful 接口

    //每天凌晨1点执行
   @Scheduled(cron = "0 0 1 * * ?")
   public void doTask() {
   
   }

此时request对象是方法参数,相当于局部变量,毫无疑问是线程安全的。

所以需要注意下面几点

定义线程池

《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略 官方作序推荐教材》(段超飞)【摘要 书评 试读】- 京东图书

7、request 的获取方式和线程安全

主要是以下两步:

3、自动注入

不会有线程安全问题的 实际上spring 注入的是一个代理类

    @Autowired
   private HttpServletRequest request; //自动注入request

1、springboot controller 单例

package com.aispeech.bj.bams.msproduct.config;
​
import org.springframework.context.annotation.AdviceMode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
​
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
​
@Configuration
@EnableAsync(mode = AdviceMode.ASPECTJ)
public class ExecutorConfig {
​
   /** Set the ThreadPoolExecutor's core pool size. */
   private int corePoolSize = 10;
   /** Set the ThreadPoolExecutor's maximum pool size. */
   private int maxPoolSize = 300;
   /** Set the capacity for the ThreadPoolExecutor's BlockingQueue. */
   private int queueCapacity = 10;
​
   @Bean
   public Executor myAsync() {
       ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
       executor.setCorePoolSize(corePoolSize);
       executor.setMaxPoolSize(maxPoolSize);
       executor.setQueueCapacity(queueCapacity);
       executor.setThreadNamePrefix("MyExecutor-");
       // rejection-policy:当pool已经达到max size的时候,如何处理新任务
       // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
       executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
       executor.initialize();
       return executor;
   }
​
}
​

2、Springboot 环境变量配置

spring bean作用域:

singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;

prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;

[email protected]

2、Springboot 环境变量配置

[email protected]

7、request 的获取方式和线程安全

《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》(段超飞)【简介_书评_在线阅读】 - 当当图书

2、在方法上加上注解

6、async异步调用

3、restful 接口

在controller 的class 上增加注解 @RestController,就会生成restful接口

  @Async("myAsync")
   void notifyProductInfo(String thirdPartyId, ThirdPartyProductVO thirdPartyProductVO) {}

以上使用${ENV:defauleValue}的形式配置了我们应用的相关参数,如果我们的运行环境配置了上面用到的环境变量,则使用环境变量中的配置,如果没有配置则使用默认的,比如我配置了环境变量DEMO_APP_JDBC_POOL_MAX_SIZE = 100,则应用程序中的连接池最大连接数就变成100了。

Spring中 controller默认是单例的,因为单例所以不是线程安全的。

对象是线程局部变量(ThreadLocal),因此request对象也是线程局部变量;这就保证了request对象的线程安全性。

在开发的过程中不是所有的配置文件都可以写入yaml或者properties文件中,可能需要动态的从容器中读取,看下如何配置

@RestController
@RequestMapping("/api/v1/h5Adapter")
@Api(description = "server-h5-adapter")
public class BaMessageConverterController {

本书系统介绍了 docker 及 kubernetes 的相关知识,可以帮助读者快速了解及熟练配置 kubernetes。

1、静态类获取

@[email protected] + @ResponseBody

定时任务几乎是项目的标配了, SpringBoot内置了Sping Schedule定时框架,通过注解驱动方式添加所注解方法到定时任务,根据配置定时信息定时执行

2、函数参数

@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。

request 是来自前端的请求,怎么才能安全的获取request,线程安全的request 才能取出正确的数据,主要有下面几种方式

1、开启定时器

[email protected] 和 @RequestBody 的区别


配合docker 食用更香哦

使用异步 @Async 注解

现在的应用基本上都是前后端分离的,所以后端接口基本上都是restful接口,怎么做呐?

当当自营购买链接:

京东自营购买链接:

CKA/CKAD应试指南:从Docker到Kubernetes完全攻略

  1. [email protected](也可以在配置类中加上)

  2. 配置类中完成异步线程池的导入(这一个可以不要,采用默认的)

  3. [email protected]

@RequestMapping("/test")
   public void test(HttpServletRequest request) {
       ......
   }

[email protected] 和 @RequestBody 的区别

本书共分为 16 章。首先介绍了 docker 基础和 docker 进阶。其次介绍了 kubernetes 的基础操作,包括部署安装kubernetes 集群、升级 kubernetes、创建及管理 pod 等。然后重点介绍存储管理、密码管理、deployment、daemonset 及其他控制器、探针、job、服务管理、网络管理、包管理及安全管理等内容。最后通过一个综合实验 devops,全面复习本书所有内容。

本书适合想系统学习 docker 和 kubernetes,以及希望通过 CKA 和 CKAD 考试的读者学习使用。此外,本书中的许多案例还可以直接应用于生产环境。

HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();

目录

本文转自 https://blog.csdn.net/perfect2011/article/details/121473015

腾讯云618
云惠网小编
cgb2110-day06 java

cgb2110-day06

文章目录一,模拟用户登录过程--1,需求--2,测试--3,程序优化二,SQL攻击/注入--1,概述--2,解决方案--3,修改代码--4,两种传输器的区别三,练习新的传输器--1...
JAVA 初级程序员常见问题分析 java

JAVA 初级程序员常见问题分析

1、怎么样可以尽快拿到offer?针对心仪的企业、岗位进行调查。可以上招聘网站看看其岗位要求,以及企业的面试题。然后针对性的学习其要求的技术。这样有针对性的准备,投其所好,就可更快...
关于数据库学习的一些知识盲区 java

关于数据库学习的一些知识盲区

一.SQL拼接方法的安全风险 1. SQL注入问题(SQL Inject),使用字符串拼接构造SQL就会引起SQL注入。 2. SQL注入是存在安全风险的 3. 例如:在图书管理系...
szu-exp 安卓开发实验3我的校园 java

szu-exp 安卓开发实验3我的校园

发扬开源精神... 给个赞吧giegiejiejie们 实验目的与要求: 目的:掌握安卓中活动的编写、自定义用户界面的开发、碎片开发、广播机制以及数据持久化技术等;并能通过对课堂知...
腾讯云618

发表评论