Springboot
沐雨金鳞
大行不顾细谨
展开
-
mybatis动态标签拼接sql提高插入速度
实验室的项目,Excel文件的数据入库,原始录入语句如下:void insertCaculatePlanData(@Param("excelName") String excelName, @Param("CaculatePlanColumnName") List<String>CaculatePlanColumnName, @Param("InsertIntoCaculatePlanDat原创 2021-04-09 16:43:53 · 753 阅读 · 0 评论 -
RPC原理
服务提供者在容器启动的时候,将自己所有的服务信息注册到注册中心,然后不断监听是否有服务调用信息,当有服务调用到来时,利用netty的编解码器进行数据解析后,对请求信息(包含了反射使用的信息)通过反射调用本地方法进行处理,处理后返回响应。 服务消费者不断监听服务注册中心的服务信息,将所有被注解标注的接口赋值为代理类,该代理类将接口信息和请求信息封装成Request对象,从注册中心拿到可以执行服务的服务地址端口等信息,通过netty连接到服务提供者,将Request信息发送至服务提供者端,接受...原创 2020-12-22 11:11:31 · 173 阅读 · 2 评论 -
Spring事务失效的8大原因
8种:数据库引擎不支持事务(都默认InnoDB了,一般不会发生) 没有被 Spring 管理(这......代码没写好,类没被加载到) 方法不是 public 的(这------这还真得⚠️) 自身调用问题(常见!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) 数据源没有配置事务管理器(emmmm) 不支持事务(emmmm) 异常被吃了(常见!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) 异常类型错误(常见!!!!!!!!!!!!!!!!!!!!!!!!!!!转载 2020-12-11 15:49:31 · 604 阅读 · 0 评论 -
计算机科学领域的任何问题的解决方法
“Any problem in computer science can be solved by another layer of indirection.”“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”原创 2020-12-09 09:29:48 · 590 阅读 · 0 评论 -
优化接口性能的八个建议
数据量比较大,批量操作数据入库 耗时操作考虑异步处理 恰当使用缓存 优化程序逻辑、代码 SQL优化 压缩传输内容 考虑使用文件/MQ等其他方式暂存,异步再落地DB 跟产品讨论需求最恰当,最舒服的实现方式...原创 2020-11-15 12:07:11 · 290 阅读 · 0 评论 -
HandlerMapping解析
Spingmvc中的HandlerMapping负责解析请求URL,对应到Handler进行处理(这里的Handler一般为Controller里的一个方法method,也可以为servlet或者Controller等)来看一个http请求的入口DispatcherServlet:DispatcherServlet继承FrameworkServlet,FrameworkServlet继承HttpServletBean,HttpServletBean继承HttpServlet。可以看出..原创 2020-10-04 15:09:02 · 6869 阅读 · 0 评论 -
Tomcat的连接器和容器简介
Tomcat有两个核心功能:处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。 加载和管理 Servlet,以及具体处理 Request 请求。Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。最顶层是 Server 服务器,这里的 Server 指的就是一个 Tomcat 实例。一个 Server 中有一个或者多个 Service,一个 Service原创 2020-09-21 16:07:19 · 1207 阅读 · 0 评论 -
事务的7种传播行为
一、什么是事务传播行为?事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行。例如:methodA方法调用methodB方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。二、事务的7种传播行为Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。 事务传播行为是Spring框架独有的事.原创 2020-09-21 14:51:55 · 34087 阅读 · 3 评论 -
springboot整合log4j2详细流程
第一步:pom文件如果某个没有排除,会出现下面的错误:整体:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0..原创 2020-09-19 10:06:17 · 1772 阅读 · 0 评论 -
log4j2日志简介
常用日志框架java.util.logging:是JDK在1.4版本中引入的Java原生日志框架 Log4j:Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件等,可以控制每一条日志的输出格式,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。虽然已经停止维护了,但目前绝大部分企业都是用的log4j。 LogBack:是Log4j的一个改良版本 Log4j2:Log4j2已经不仅仅是Log4j的一个升级版本了,它从头到尾都被重写了日志门面sl.转载 2020-09-19 09:49:23 · 336 阅读 · 0 评论 -
单点登陆sso实现(基于全局session实现)
本篇博客实现借鉴自:大厂架构演进实战之手写 CAS 单点登录如果不想按下面的步骤一个一个粘贴,我也提供了github地址:https://github.com/XuBaozhao/sso一、实现目标:登陆淘宝,跳转登陆页面,登陆后,进入淘宝主页,再次登陆天猫,发现不用登陆,直接进入了天猫主页。我省略了和数据库打交道的一点,并且也省略了验证token相同的环节,因为只是简单的熟悉流程,细节问题并不考虑在内。看下面的结果展示,你就明白了。(1)taobao 首先访问,被拦截,检测到没有原创 2020-09-18 14:28:07 · 1258 阅读 · 4 评论 -
Spring AOP二(CGLib代理)
CGLIB,这套API,即使没有接口,它也可以帮我们产生这个对象的代理对象。它的内部是怎么去产生这个对象的代理对象的呢?——实际上产生的是这个对象的子类,也即我们把一个对象交给CGLIB,它返回出来的似乎是一个代理对象(但它不是要产生一个对象的代理对象),但其实这个代理对象就是这个对象的子类,利用子类的方式来创建代理对象。 在Spring里面就是这样做的,Spring里面有一个AOP编程(即面向切面编程,说白了就是动态代理,我们经常会交给Spring一个对象,它就会返回代理对象给我们,它在返回代理原创 2020-09-17 10:17:09 · 231 阅读 · 0 评论 -
Spring AOP实现一(JDK动态代理)
package proxy;public interface UserService { void save(); void delete(); void update(); void find();}package proxy;public class UserServiceImpl implements UserService{ @Override public void save() { System.out...原创 2020-09-17 10:11:41 · 272 阅读 · 0 评论 -
Springboot部署项目
1、clean + package2、 比如原有的项目使用的是8055端口,那么首先将原有项目删除,然后看端口是否还被占用netstat -tunlp | grep 8055如果是这种情况,说明被占用需要把占用端口的进程kill掉。3、kill -9 80554、部署项目nohup java -jar 上面package的项目jar包> myout.out 2>&1 &...原创 2020-09-14 10:55:10 · 97 阅读 · 0 评论 -
@responseBody + 序列化
为什么转载@responseBody这个注解的博客呢?因为我在看序列化的时候,就在考虑,Spring中使用@responseBody的Json序列化,为啥不用最常用的Serializable序列化呢?直接转换为二进制流不好吗???先说@responseBody1、@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处原创 2020-09-13 20:13:15 · 2653 阅读 · 0 评论 -
七、高并发下的数据安全
我们知道在多线程写入同一个文件的时候,会存现“线程安全”的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程安全的)。如果是MySQL数据库,可以使用它自带的锁机制很好的解决问题,但是,在大规模并发的场景中,是不推荐使用MySQL的。秒杀和抢购的场景中,还有另外一个问题,就是“超发”,如果在这方面控制不慎,会产生发送过多的情况。我们也曾经听说过,某些电商搞抢购活动,买家成功拍下后,商家却不承认订单有效,拒绝发货。这里的问题,也许并不一定是商家奸诈,而是转载 2020-09-12 08:28:38 · 842 阅读 · 0 评论 -
六、作弊的手段:进攻与防守
秒杀和抢购收到了“海量”的请求,实际上里面的水分是很大的。不少用户,为了“抢“到商品,会使用“刷票工具”等类型的辅助工具,帮助他们发送尽可能多的请求到服务器。还有一部分高级用户,制作强大的自动请求脚本。这种做法的理由也很简单,就是在参与秒杀和抢购的请求中,自己的请求数目占比越多,成功的概率越高。这些都是属于“作弊的手段”,不过,有“进攻”就有“防守”,这是一场没有硝烟的战斗哈。同一个账号,一次性发出多个请求部分用户通过浏览器的插件或者其他工具,在秒杀开始的时间里,以自己的账号,一次发送.转载 2020-09-11 16:18:27 · 189 阅读 · 0 评论 -
五、大并发带来的挑战
请求接口的合理设计一个秒杀或者抢购页面,通常分为2个部分,一个是静态的HTML等内容,另一个就是参与秒杀的Web后台请求接口。通常静态HTML等内容,是通过CDN的部署,一般压力不大,核心瓶颈实际上在后台请求接口上。这个后端接口,必须能够支持高并发请求,同时,非常重要的一点,必须尽可能“快”,在最短的时间里返回用户的请求结果。为了实现尽可能快这一点,接口的后端存储使用内存级别的操作会更好一点。仍然直接面向MySQL之类的存储是不合适的,如果有这种复杂业务的需求,都建议采用异步写入。当然,转载 2020-09-11 16:14:16 · 270 阅读 · 0 评论 -
四、秒杀架构设计
秒杀系统为秒杀而设计,不同于一般的网购行为,参与秒杀活动的用户更关心的是如何能快速刷新商品页面,在秒杀开始的时候抢先进入下单页面,而不是商品详情等用户体验细节,因此秒杀系统的页面设计应尽可能简单。 商品页面中的购买按钮只有在秒杀活动开始的时候才变亮,在此之前及秒杀商品卖出后,该按钮都是灰色的,不可以点击。 下单表单也尽可能简单,购买数量只能是一个且不可以修改,送货地址和付款方式都使用用户默认设置,没有默认也可以不填,允许等订单提交后修改;只有第一个提交的订单发送给网站的订单子系统,其余用户提交订单后只能转载 2020-09-11 16:02:54 · 118 阅读 · 0 评论 -
三、秒杀架构原则
尽量将请求拦截在系统上游传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,并发高响应慢,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小【一趟火车其实只有2000张票,200w个人来买,基本没有人能买成功,请求有效率为0】。读多写少的多使用缓存这是一个典型的读多写少的应用场景【一趟火车其实只有2000张票,200w个人来买,最多2000个人下单成功,其他人都是查询库存,写比例只有0.1%,读比例占99.9%】,非常适合使用缓存。...转载 2020-09-11 15:42:20 · 75 阅读 · 0 评论 -
二、秒杀技术挑战
假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有:1、对现有网站业务造成冲击秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必然会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。解决方案:将秒杀系统独立部署,甚至使用独立域名,使其与网站完全隔离。2、高并发下的应用、数据库负载用户在秒杀开始前,通过不停刷新浏览器页面以保证不会错过秒杀,这些请求如果按照.转载 2020-09-11 15:40:54 · 162 阅读 · 0 评论 -
一、 秒杀业务分析
正常电子商务流程查询商品; 创建订单; 扣减库存; 更新订单; 付款; 卖家发货;秒杀业务的特性低廉价格; 大幅推广; 瞬时售空; 一般是定时上架; 时间短、瞬时并发量高;转载 2020-09-11 15:36:00 · 162 阅读 · 0 评论 -
三高问题解决思路
在互联网公司,经常面临一个“三高”问题:高并发 高性能 高可用一、缓存使用空间换时间的思想 代码在访问数据的时候,尽量使用缓存命中率高的方式 缓存之所以能够大幅提高系统的性能,关键在于二八定律:「百分之八十的数据访问是集中在 20% 的数据上」 缓存分类:1. 本地缓存2. 分布式缓存(一致性 Hash 算法) 适合缓存的场景:1、读多写少 2、计算耗时大,且实时性不高 不适合缓存的场景:1、写多读少,频繁更新 2、对数据一致性要求严格 3、数据访问完全随机 缓存更新的..原创 2020-09-11 15:33:29 · 985 阅读 · 0 评论 -
Springboot内置Tomcat原理
SpringBoot的启动主要是通过实例化SpringApplication来启动的,启动过程主要做了以下几件事情:配置属性、获取监听器,发布应用开始启动事件初、始化输入参数、配置环境,输出banner、创建上下文、预处理上下文、刷新上下文、再刷新上下文、发布应用已经启动事件、发布应用启动完成事件。 在SpringBoot中启动tomcat的工作在刷新上下这一步。而tomcat的启动主要是实例化两个组件:Connector、Container,一个tomcat实例就是一个Server,一个Server包含转载 2020-09-08 11:12:30 · 1401 阅读 · 0 评论 -
Spring Validation最佳实践及其实现原理
一、背景Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。 hibernate validation是对这个规范的实现,并增加了校验注解如@Email、@Length等。 Spring Validation是对hibernate validation的二次封装,用于支持spring mvc参数自动校验。二、引入依赖如果spring-boot版本小于2.3.x,spring-boot-starter-web会自动传入hibernate.转载 2020-09-08 10:40:50 · 1669 阅读 · 1 评论 -
Spring的Controller是单例还是多例,怎么保证并发的安全
看到了公众号里这篇文章,算是解决了我现在项目的bug的燃煤之急!喵了个咪的,我在controller层写了多线程,然后呢,多次快速调用该controller的时候,出现了错误,问题就是下面的情况:答案:controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。我们下面来简单的验证下:@ControllerpublicclassScopeTestController{privateintnum=0;...原创 2020-09-07 17:31:05 · 367 阅读 · 0 评论 -
Spring事务实现
Spring事务一、没有添加事务的实现1、实体类:2、Dao:3、Service:4、XML文件配置:5、测试:6、结果:没有事务管理,所以异常上面的代码成功执行,下面的代码不执行,导致钱转出去了,没收到,总金额少了!二、编程式事务实现1、XML配置事务:在applicationContext.xml中添加事务管理器和事务管理器模版的配置2、注解方式配置事务:注解方式配置事务管理器和事务管理器模版3、修改UserSe原创 2020-08-08 16:22:56 · 370 阅读 · 0 评论 -
注册bean到容器的三种方法
spring在启动时会自己把bean(java组件)注册到ioc容器里,实现控制反转,在开发人员使用spring开发应用程序时,你是看不到new关键字的,所有对象都应该从容器里获得,它们的生命周期在放入容器时已经确定!三种注册bean的方法:@ComponentScan @Bean @Import一、@ComponentScan注册指定包里的bean(找到指定路径下,指定注解的类,注册到IOC容器中)Spring容器会扫描@ComponentScan配置的包路径,找到标记@Compo.原创 2020-08-04 16:58:45 · 939 阅读 · 0 评论 -
Spring容器:BeanFactory和ApplicationContext
spring容器:spring容器负责了对象的整个生命周期--创建、装配、销毁。 而这里对象的创建管理的控制权都交给了Spring容器,所以这是一种控制权的反转,称为IOC容器。BeanFactory和ApplicationContext之间的关系(都是IOC容器!!!)BeanFactory和ApplicationContext是Spring的两大核心接口,而其中ApplicationContext是BeanFactory的子接口。 它们都可以当做Spring的容器,Spring容器是.原创 2020-08-04 16:49:38 · 221 阅读 · 0 评论 -
@EnableAutoConfiguration注解
借助@Import的支持,收集和注册特定场景相关的bean定义。@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义注册到IoC容器,仅此而已!@EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。@Enabl原创 2020-08-04 16:20:20 · 3154 阅读 · 0 评论 -
@ComponentScan注解
一、@ComponentScan注解作用:(扫描指定注解的类注册到IOC容器中)@ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类注册到IOC容器中。 会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等。 其作用等同于<context:component-scan base-package="com.maple.learn" />配置。二、@ComponentSca.原创 2020-08-04 15:53:31 · 11628 阅读 · 1 评论 -
@Configuration注解
被该注解标识的类,表明该类是一个JavaConfig形式的Spring Ioc容器的配置类一、基于JavaConfig的配置方式:@Configurationpublic class MockConfiguration{ //bean定义}任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。二、注册bean定义层面:@Configurationpublic class MockConfiguration{ @Bean原创 2020-08-04 15:26:21 · 1403 阅读 · 0 评论 -
下载文件HTTP请求及处理过程
客户端请求:平淡无奇,其实就是对应了在网址中输入url,浏览器就能直接下载文件:服务器端处理:根据请求参数找到文件 设置响应头:response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); 将文件二进制数据保存到文件输入流 将文件二进制数据通过缓冲区保存到文件输出流 // 首先根据请求,找到服务器端文件存储地址,并创建F原创 2020-07-24 10:15:21 · 8880 阅读 · 0 评论 -
上传文件保存到服务器的HTTP请求及处理过程
HTTP request header:请求行:POST /upload HTTP/1.1因为是上传的文件, 文件大小不定,所以我们一般会使用POST请求进行文件上传 请求URL HTTP协议请求头:其他的都平淡无奇,主要是看上面被标注的项Content-Type:multipart/form-data; boundary=----WebKitFormBoundarysyCsUaLV5WrP69tBContent-Type 里指明了数据是以 mutipart/f..原创 2020-07-24 09:48:53 · 5476 阅读 · 0 评论 -
Servlet详解
1、什么是Servlet?Servlet其实就是一个遵循Servlet开发的java类。Servlet是由服务器调用的,运行在服务器端。2、为什么要用到Servlet?我们编写java程序想要在网上实现 聊天、发帖、这样一些的交互功能,普通的java技术是非常难完成的。sun公司就提供了Servlet这种技术供我们使用。3、JAVAWEB目录结构以上图说明:bbs目录代表一个web应用 bbs目录下的html,jsp文件可以直接被浏览器访问 WEB-INF目...原创 2020-07-23 23:25:17 · 703 阅读 · 0 评论 -
CommonResult模版
1、CommonResult用作模版用于前后台连调import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class CommonResult<T> { private Integer code; private String message;原创 2020-07-22 09:19:46 · 6397 阅读 · 1 评论 -
mac配置IDEA热部署
1、pom文件中添加依赖<!-- 开启热部署 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional>原创 2020-07-19 16:47:04 · 2986 阅读 · 0 评论 -
SpringBoot自动装配原理
我们知道SpringBoot简化了Spring的配置,提供了一站式的J2EE解决方案,其中最重要的元素之一就是提供了自动配置功能。那SpringBoot的自动装配原理是什么呢?@SpringBootApplication注解表示一个类为启动类,它是一个复合注解。 在@SpringBootApplication中有个很重要的注解:@EnableAutoConfiguration注解,该注解也是个复合注解。 在@EnableAutoConfiguration中有个很重要的注解:@Import注解。原创 2020-06-25 11:36:26 · 143 阅读 · 0 评论