SpringBoot学习
文章平均质量分 78
爱叨叨的程序狗
码农,不只Coding.
展开
-
基于Java和Spring:实现图片压缩、WebP格式转换与水印添加
WebP官网WebP是一种由Google开发的现代图像格式,旨在提供更高的压缩率和更好的图像质量,相比于传统的JPEG、PNG等格式,能够显著减少图像文件的大小。WebP图像通常具有更小的文件大小,因此可以加快网页加载速度,节省带宽和用户的流量消耗。WebP图像支持有损压缩和无损压缩两种模式。在有损压缩模式下,WebP图像通常能够实现较高的压缩比,而在无损压缩模式下,WebP图像则可以保留原始图像的质量而实现较小的文件体积。原创 2024-02-24 14:02:26 · 1076 阅读 · 0 评论 -
深入分析 Spring 中 Bean 名称的加载机制
深入分析-Spring BeanDefinition构造元信息》XML配置文件、注解、Java配置类,从Spring Framework 3.0(2019年12月发布)版本开始推荐使用注解来定义Bean,而不是XML配置文件,因此,本文的重点是放在探索Spring Framework如何从使用注解定义的Bean元数据中获取到Bean的名称。在Spring Framework中用于生成基于注解的Bean名称,其主要作用是根据指定的注解信息,生成符合规范的Bean名称。原创 2024-01-13 22:39:29 · 927 阅读 · 0 评论 -
Spring Framework中BeanFactory与ApplicationContext的关系与区别
首先来看来自官方文档的描述:我们来翻译一下:beans和context是Spring Framework的IoC容器的基础。BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。IoC(Inversion of Control)是Spring Framework的核心设计思想:它将对象的创建、组装、管理交给容器(container),BeanFactory提供了访问IoC的接口,使得开发者可以更方便的使用Spring框架来实现控制和依赖注入。原创 2023-12-23 17:55:40 · 852 阅读 · 0 评论 -
订单场景-基于Redisson实现订单号生成
订单、指定长度随机码生成是业务系统中重要且不可避免的一个需求,往往在电商系统中,业务量、并发量庞大,如何不重复、快速、安全的生成一个订单号成了需要重点考虑的问题。当生成订单号的逻辑和订单创建、落库逻辑分开,每次点击提交订单时,前端调用单独的生成订单号接口,再拿着生成的订单号去请求订单创建、落库的逻辑,每次生成的订单号都不一致,这样便保证了每次的请求都不是重复的,接下来实现不重复的订单号逻辑即可。需要注意的是,使用分布式锁会增加系统的复杂度和开销,可能会影响系统的性能和可用性。原创 2023-12-01 15:52:10 · 616 阅读 · 1 评论 -
利用Spring Boot实现客户端IP地理位置获取
在当今互联的世界中,了解客户端的地理位置对于提供个性化服务和增强用户体验至关重要。无论是根据地区偏好定制内容,还是确保符合本地法规,访问客户端IP位置都是一项宝贵的资产。如抖音评论区、用户页都会展示用户的IP属地信息。在本文中,我们将探讨一个Spring Boot项目,它能够高效地获取客户端IP地址的地理位置,并讨论其应用场景和实现方式。原创 2023-11-29 12:01:55 · 1237 阅读 · 0 评论 -
Spring Framework IoC依赖注入-按Bean类型注入
依赖注入是一种先进的设计思想,它通过外部注入依赖对象来实现组件之间的松耦合。在 Spring 框架中,依赖注入的核心实现便是通过控制反转(Inversion of Control,IoC)容器。IoC 容器负责实例化、配置和组装应用中的对象,并在需要时将它们智能地注入到其他对象中。相较于传统的面向对象思想,当业务代码变得复杂时,通过直接使用new进行对象构造对象间的关系,容易导致代码耦合度的上升。Spring 通过控制反转巧妙地解决了这一问题,运用了好莱坞原则的理念:不要给我们打电话,我们会给你打电话。原创 2023-11-21 21:44:58 · 288 阅读 · 0 评论 -
Spring Framework IOC依赖查找 - 按类型查找解析
AppConfig配置类定义了两个名为"bean1"和"bean2"的MyBean类型的Bean,这两个类分别有不同的实现逻辑,在不同的逻辑中去调用。原创 2023-11-20 17:26:50 · 89 阅读 · 0 评论 -
Spring Framework IOC依赖查找 - 按名称查找解析
具体来说,在使用ApplicationContext作为容器时,如果不显式地配置为延迟初始化,那么所有的单例bean都会在容器启动时被实例化。是指在需要使用某个资源或对象时才进行加载,而不是在应用程序启动时就提前加载。在Spring Framework中,实时加载和延迟加载是指在容器启动时是否立即实例化bean的不同策略。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。在实际应用中,根据具体的需求和场景来选择合适的加载方式是非常重要的。原创 2023-11-19 15:22:14 · 87 阅读 · 0 评论 -
深度解析CompletableFuture:Java 异步世界的奇迹
是 Java 8 引入用于支持异步编程和非阻塞操作的类。对于没有使用过通过它这么长的名字就感觉到一头雾水,那么现在我们来一起解读一下它的名字。Completable:可完成Future:未来/将来这两个单词体现了它设计的目的:提供一种可完成的异步计算。result:存储异步计算的结果stack:存储观察者链NEXT:异步调用链中观察者链的管理这三个变量用于Completion类中tryFire方法的标志,表示不同的触发模式。SYNC。原创 2023-11-12 16:25:41 · 203 阅读 · 0 评论 -
Spring中@Async的使用技巧
异步方法是指在调用方法后,不会立即等待方法的返回结果,而是继续执行后续的操作。异步方法通常会创建一个线程或者利用线程池来处理任务,并通过回调、Future对象、CompletableFuture等方式获取最终的结果。异步方法是提高系统性能和并发能力的重要手段之一。通过使用@Async注解,我们可以很方便地实现异步方法。然而,在使用异步方法时,需要注意启用异步支持、避免在同一个类中调用异步方法以及合理处理异步方法的返回值类型等问题。关于我👋🏻你好,我是Debug.c。种颗代码技术树。原创 2023-11-06 10:02:59 · 131 阅读 · 0 评论 -
从源码中看@Qualifier注解
Qualifier注解通常和@Autowired注解一起使用,那么首先来看@Autowire是怎么把Bean对象注入到Spring容器中的。原创 2023-11-05 16:53:06 · 137 阅读 · 0 评论 -
深入解析 Spring Framework 中 @Autowired 注解的实现原理
Autowired注解在Spring中的作用是实现依赖注入(Dependency Injection),它用于自动装配(autowiring)Spring Bean 的依赖关系。具体来说,@Autowired自动装配依赖:通过在类的字段、构造函数、方法参数等地方使用@Autowired注解,Spring 容器会自动识别需要注入的依赖,并将适当的 Bean 实例注入到目标组件中。减少手动配置:使用@Autowired。原创 2023-10-30 12:02:11 · 398 阅读 · 0 评论 -
解析Spring Cloud Gateway在微服务中的角色
来自Spring官网的一段对于Spring Gateway的概述:大意为:这个项目提供了一个库,用于在Spring WebFlux之上构建API网关。Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到api,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。路由负载均衡请求功能增强。原创 2023-09-06 16:44:12 · 81 阅读 · 0 评论 -
基于SpringBoot实现MySQL与Redis的数据一致性
一致性的解决方案可以使用“先写MySQL,再删除Redis”策略,这种方案在极限条件下有不一致的可能性,但结合需求和技术实现可以综合评判。采用“先写MySQL,通过MySQL的Binlog特性,异步写入Redis”。综上所述,Cache Aside方案适用于读取频率较高、对数据实时性要求不高的场景,通过合理地使用缓存来提高系统性能和扩展性,并通过维护数据的一致性来避免数据不一致的问题。我已将canal实现数据同步代码开源,请自行下载领取,笔者不介意您宝贵的Star,如果能帮到您,十分荣幸。原创 2023-08-27 16:43:41 · 601 阅读 · 0 评论 -
Spring编程模型(范式)
契约接口(Aware)是Spring框架中的一个特性,它允许Bean对象意识到它们所在的环境并与之进行交互,用于提供特定的功能或信息给Bean对象。JDK动态代理是通过Java的反射机制实现的。代理对象实现了目标接口,并将方法调用转发给InvocationHandler的invoke()方法,在invoke()方法中可以添加切面逻辑。面向元编程的目标是通过编写代码来操作代码本身,以提高代码的灵活性、可扩展性和可重用性。它允许程序在运行时动态地创建、修改和执行代码,而不仅仅是编写静态的、预定义的代码。原创 2023-08-21 22:11:28 · 621 阅读 · 0 评论 -
Easy Excel参数校验实现
在导入需求中,往往要求用户输入值的合法性,如是否为空的校验、正则校验、存在性校验,在以往实现方案中,通常是使用for循环来实现的,但是在Excel工具解析文件的过程中,其实已经逐行解析数据过一遍,如果在业务逻辑中再次for循环读取一次,实则是没有必要的,因此,我们可以使用Easy Excel提供AnalysisEventListener监听器实现。在解析过程中,当 SAX 解析器读取到每个单元格数据时,EasyExcel 会触发相应的事件,并将读取到的数据传递给监听器进行处理。原创 2023-07-03 21:54:56 · 1548 阅读 · 0 评论 -
@ControllerAdvice如何实现@RestControllerAdvice的异同
在异常处理和统一响应处理方面的功能类似,只是注解的使用场景和响应格式有所不同。如果你的应用程序是基于MVC架构的传统应用,可以使用。如果你的应用程序是基于RESTful风格的API应用,可以使用。原创 2023-05-24 09:36:30 · 569 阅读 · 0 评论 -
新手向:一文搞懂RequestParam、PathVariable、RequestBody
@PathVariable和@RequestParam一般用于Get请求,分别是从路径里面去获取变量,也就是把路径当做变量,后者是从请求里面获取参数。RequestBody一般用于Post请求,获取请求Body中的JSON数据RequestParam @ApiOperation(value = "用户测试", notes = "用户测试notes") @GetMapping("localDateTime") public ResultMessage localDateTime.原创 2021-07-28 14:32:52 · 693 阅读 · 0 评论 -
fix bug:Spring中事务不生效的问题
事务注解不生效的问题出现该问题的主要原因主要有两点:Spring的事务没有生效出现异常时无法正常回滚Spring事务不生效的情况@Transactional用在非public方法上未通过代理手段调用事务方法事务注解用在非public方法上@Transactionalprivate Access createRecords(AccessDto accessDto);未通过代理调用的情况:Service正常注入Spring中,在调用方法时使用This调用事务方法,Spring不会注原创 2021-07-08 14:14:05 · 190 阅读 · 0 评论 -
EnableDiscoveryClient与EnableEurekaClient的作用和区别
作用:互相注册发现,表示当前服务可以作为服务的提供者,一般用于集群注册中心。区别:@EnableDiscoveryClient基于spring-cloud-commons@EnableEurekaClient基于spring-cloud-netflix。如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient,如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient。当然这两个注解是Spring Cloud早期版本(F版)中使用的注解,服务调原创 2021-05-16 22:39:27 · 795 阅读 · 0 评论 -
ClassNotFoundException/NoClassDefFoundError出现原因及解决
NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。ClassNotFoundException的产生原因:Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundExce原创 2021-02-28 15:41:51 · 25754 阅读 · 0 评论 -
学一学RSA加密吧,下次对接的时候就不会被对方Diss了
简介:RSA加密算法:是一种非对称加密算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密,加密和解密需要两个不同的密钥,因此被称为非对称加密,加密的双方在开发前根据明文的长度/数据加密等级需要协定好密钥的位数,目前可使用1024、2048、4096字节的密钥(key),安全性随字节长度升高而升高,性能随之而下降,时间复杂度为O(nlogn)。使用场景:用户登录、包含个人信息及手机号码时、输入银原创 2021-01-28 22:43:54 · 336 阅读 · 1 评论 -
因时区导致的数据创建时间不正确的问题
环境Ubuntu Serve 18.04JDK8H2数据库SpringBoot 2.4.0错误现象数据库报错数据时,发现插入的时间总是小于当前时间8个小时,所以初步判断是时区问题。Linux设置时区先查看当前系统时间运行tzselect修改etc文件查验-- 查看当前系统时区date -R-- 执行tzselecttzselect--此时会显示时区,注意:需要输入数字以代表不同的时区选择亚洲 4选择中国 9选择北京 1是否确认 1-- 复制文件c原创 2021-01-12 22:10:11 · 446 阅读 · 0 评论 -
Spring Security的责任链小小demo
链式过滤代码新写法:定义一个接口,不同的过滤项目类实现自接口,把接口放入List,list中放入对象,挨个去过滤,这样做的好处就是代码健壮性更好,当新增了一个类或者过滤类型时,代码改动较小。跟马老师学了一招/** * @author Liutx * @date 2021/1/6 21:47 * @Description eg: * 一个论坛,需要过滤不良言论,所以说需要针对不同的不良言论类型进行处理 */public class Main { public static void原创 2021-01-06 22:33:43 · 361 阅读 · 0 评论 -
基于SpringBoot的AES加密算法接口处理
Advanced Encryption StandardAdvanced Encryption Standard缩写:AES,译为高级加密标准。AES是用于取代DES的对称加密算法,既然有对称加密,那么会有非对称加密,常见的非对称加密有RSA加密。何谓对称和非对称?对称加密即为只有一个公钥,数据加密者和数据解密者共有一个公钥,可使用公钥完成数据的加密和解密,密钥由双方商定共同保管。而非对称加密的密钥可分为公钥和私钥,私钥用于数据的加密,公钥用于数据的解密,公私钥的其中一方无法完成数据的加密和解密,且原创 2021-01-03 20:36:54 · 3885 阅读 · 9 评论 -
Spring自定义注解常用元素
@Target作用:声明自定义的一个新注解,其ElementType属性表示自定义注解的作用范围。类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field decla原创 2021-01-03 19:28:06 · 244 阅读 · 4 评论 -
ResponseBody、RequestBodyAdvice解读
BodyAdvice用处:参数过滤字符的编码第三方的加解密RequestBodyAdvice:作用:进行统一接口请求参数处理优势:全局解决方案,使原本在Controller处理的内容统一全局处理,精简代码量、降低耦合度。官方API解读:Allows customizing the request before its body is read and converted into an Object and also allows for processing of the result原创 2021-01-03 14:32:27 · 559 阅读 · 1 评论 -
Resource引发的报错
事出有因:一个正常运行的项目再次运行的时候突然报错:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.Consider the following:If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.If原创 2020-12-28 22:39:33 · 2608 阅读 · 0 评论 -
基于RBAC模型的SpringSecurity权限控制能力
RBAC权限模型全名为:Role-Based Access Control 译为基于角色的访问控制。RBAC权限框架基于角色进行鉴权,在该框架中具有三大模块:角色(Role)、用户(User)、权限(Permissions),RBAC使用最小特权原则,当前请求访问的用户具备那些角色,该角色具备那些权限,所具备的权限中是否包含本次访问所需的权限?若具有,正常访问返回,若不具有,给予用户提示,所以,RBAC可以把权限粒度做到方法级。SpringSecurity是基于RBAC模型轻量级权限控框架,与之对等原创 2020-12-20 22:39:36 · 1272 阅读 · 0 评论 -
MyBatis-Plus代码生成器使用
导入所需依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.1</version> </dependency> <原创 2020-12-16 22:53:19 · 202 阅读 · 0 评论 -
SpringBoot整合Redis、MyBatis-Plus
最近笔者在搭一个自己的小框架,基于SpringBoot全家桶整合了SpringSecurity、Redis、MyBatis-Plus、RSA加密等,所以我打算将搭建过程记录下来以做学习只用,好了废话不多说,下面开始。针对Redis在项目中的使用场景,最基础的便是存取用户登录凭证----token,所以必须使用数据库去查询登录用户信息,那么文章就先从整合MyBatis-Plus开始。SpringBoot整合MyBatis-Plus写在前面:MyBatis-Plus是一个非常强大且轻量的ORM框架,原创 2020-12-15 23:06:10 · 973 阅读 · 1 评论 -
RBAC权限---SpringBoot整合Security
引入SpringSecurity模块 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>加入这个依赖后表示所有的接口都是被保护的状态,访问的时候被Securi原创 2020-12-13 21:47:54 · 352 阅读 · 0 评论 -
如何获取yml里的配置数据?
当我们在yml进行一些配置的时候,在Java中需要拿到yml中自定义的配置,我们可以使用**@ConfigurationProperties**注解去读取yml中的配置数据。使用方式demo在yml自定义jwt配置(jwt需要顶格,否则相当于在其他配置下,在Java代码中会拿不到数据)jwt: # 密匙KEY secret: JWTSecret # HeaderKEY tokenHeader: Authorization # Token前缀字符 tokenPrefix: Sa原创 2020-12-13 01:02:14 · 2585 阅读 · 4 评论 -
数据加密的各种姿势
数据加密数据按加密方式可分为对称加密和非对称加密和hash加密。对称加密:加解密密钥相同,假如有一把锁具,锁具在关闭(加密时)和开启(解密时)使用的是同一把钥匙(使用相同的密钥),则可以将该加密方式称为对称加密。常见的对称加密方式如:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6 和 AES图片源自网络非对称加密:密钥分为公钥和私钥,如果后端返回的明文接口数据使用公钥进行加密脱敏,前端在解密时则需要私钥进行解密,使用公钥则无法对已加密数据进行解密。反之,如果后端接原创 2020-12-06 22:23:56 · 301 阅读 · 0 评论 -
客官留步,您真的会使用@Component+@Bean注解(配置类)吗?
由此及彼我在写如何在Spring中优雅的使用单例模式?一文的时候有使用到@Component(“xxx”)注解,总所周知,该注解可以将普通的Java类实例化到Spring容器中,可以替代Spring 4.0 版本之前xml配置,xxx就等同于xml中的bean标签的id(所以需要保证唯一),不知道大家有没有了解过Spring配置类的Full模式和Lite模式?如果您第一次听到这个概念,您不妨花费几分钟往下读一读,或许可以让您少掉几根秀发。详细介绍Full模式、Lite模式是针对于Spring的配置“类原创 2020-12-05 23:18:53 · 3266 阅读 · 5 评论 -
基于SpringBoot的策略模式demo
策略模式策略模式是Java 23种设计模式之一,在https://refactoring.guru/design-patterns/网站中这样对策略模式进行了解释:Strategy is a behavioral design pattern that turns a set of behaviors into objects and makes them interchangeable inside original context object.白话翻译一下就是:策略模式可以根据上下文对象的不同原创 2020-11-29 02:07:30 · 878 阅读 · 0 评论 -
MyBatis_Plus联表分页查询
MyBatis_Plus联表分页查询当我们需要关联表格分页查询时,MyBatis_plus封装的单表方法已经满足不了我们的需求了,那么我们需要进行联表分页查询假设我们需要的 SQL 语句如下: SELECT su.id, su.username, su.sex, su.user_identity, su.user_company, su.status, su.third_typ原创 2020-11-29 00:06:33 · 6070 阅读 · 3 评论 -
SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘where clause‘
java.sql.SQLSyntaxErrorException: Unknown column 'XXX' in 'where clause' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.20.jar:8.0.20] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(原创 2020-11-25 23:16:07 · 1970 阅读 · 0 评论 -
IDEA远程调试服务端代码
需求:当我们部署在服务器中的代码线上出现问题的时候,除了tail -f xxxx查看日志外,还可以通过在 本地IDEA打断点调试远程部署在服务器的代码前提是本地的代码与服务器的代码是一致的,也就是说,服务器的代码和本地的代码是同步的。远程调试步骤一:在服务端存放项目jar的路径下,使用如下命令:java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 xxx.jarjava -jar原创 2020-11-24 15:19:50 · 361 阅读 · 0 评论 -
AOP前切、后切、环绕demo
Joint Point程序中可识别的点,这个点可以作为AOP的切入点,JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。Joint Point可提供的信息:# 返回目标对象,即被代理的对象Object getTarget();# 返回切入点的参数Object[] getArgs();# 返回切入点的SignatureSignature getSignatu原创 2020-11-21 21:51:00 · 1294 阅读 · 1 评论