
SpringBoot
文章平均质量分 82
SpringBoot
ximeneschen
这个作者很懒,什么都没留下…
展开
-
@Conditional使用,Spring的Condition接口及@ConditionOnXXX源码分析
一、@Contidional 介绍 Conditional 是由 SpringFramework 提供的一个注解,位于 org.springframework.context.annotation 包内,定义如下。@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})public @interface Conditional { Class<? extends Conditio原创 2022-02-19 19:49:47 · 1640 阅读 · 1 评论 -
spring-boot-starter-parent 与 spring-boot-dependencies区别
我们平常时开发springboot项目时,pom文件中引入的依赖,总是少不了spring-boot-starter-parent 或 spring-boot-dependencies(仅其一),若未引入,会导致我们的项目缺包,今天我们来探讨一些两者的区别。当我们使用 spring 或 spring-boot 开发项目时,需要引入很多依赖,包括 spring 本身的组件、各种 spring-boot-starter、以及其它第三方依赖(如:slf4j、redis)。转载 2024-01-31 02:09:20 · 654 阅读 · 0 评论 -
Spring Boot启动源码分析
一,前言。原创 2023-09-20 23:27:38 · 754 阅读 · 0 评论 -
IDEA Docker插件远程连接Docker,并打包部署启动SpringBoot项目
上图中最下面的那个"Run Maven Goal"点击后,会弹出一个小窗口 ,用来输入要执行的maven命令,这里输入。Docker Image的方式主要是方便IDEA操作远程服务器上docker镜像,监控容器信息。创建成功之后可以看到新创建的容器,也可以在服务器(虚拟机)上用docker命令查看。有时候会出现拉取的时间超时的情况,可以配置一下国内的镜像获取阿里云的加速器。设置完成后,点击下图红框中的绿色三角按钮,执行此配置。这里要注意,在写docker镜像地址的时候,如果docker控制台有乱码,原创 2022-09-06 16:26:55 · 2017 阅读 · 2 评论 -
Spring 依赖注入方式及@Autowired 和 @Resource
任何人都可以提交 JSR给 Java 官方,但只有最终确定的 JSR,才会以 JSR-XXX 的格式发布,如 JSR-250,而被发布的 JSR 就可以看作是 Java 语言的规范或标准。构造方法和属性注入不同,构造方法注入可适用于任何环境,无论是 IoC 框架还是非 IoC 框架,构造方法注入的代码都是通用的,所以它的通用性更好。因为依赖对象是在构造方法中执行的,而构造方法是在对象创建之初执行的,因此被注入的对象在使用之前,会被完全初始化,这也是构造方法注入的优点之一。...转载 2022-08-31 11:25:27 · 1879 阅读 · 0 评论 -
Spring Boot 应用在 kubernetes 的 sidecar 设计与实战
执行dockerpush命令,将镜像推送到镜像仓库中,我这里是推送到了hub.docker.com,您可以根据实际情况来执行,例如私有仓库、阿里云等都可以,当然了,如果当前机器就是K8S的机器就不用推送了,毕竟此镜像就是在K8S环境用的;看到这里,可能会有朋友问"为什么不用scratch?提供java进程的镜像是固定的,在K8S环境下,一个Node上实际运行着多种pod,如果他们的java进程都由一个镜像提供,其好处是不言而喻的;...转载 2022-07-22 11:41:33 · 237 阅读 · 0 评论 -
SpringBoot统一后端返回格式,统一异常处理
**/**/**/**/***}/***}/***}/***}/***}/***}}原创 2022-07-22 00:08:50 · 724 阅读 · 0 评论 -
@Transactional注解失效的场景
Transactional用于在项目中开启事务,然后如果使用不当,也可能会导致事务失效,看看以下场景这3种情况都可以从spring的源码中找到原因此方法会检查目标方法的修饰符是否为 public,。而。注意:private,protected、private 修饰的方法上使用 @Transactional 注解,虽然事务无效,但不会有任何报错,这是我们很容犯错的一点。默认情况下,spring只会回滚RuntimeException和Error,对于普通的Excetion(非运行时异常),他不会回滚。因为原创 2022-07-02 17:51:15 · 598 阅读 · 0 评论 -
WebMvcConfigurer接口配置讲解及@EnableWebMvc的坑
一、@EnableWebMvc使用坑点解析通过注解的方式来进行Spring4 MVC开发时,我们都会在配置文件中加入<mvc:annotation-driven/>标签,这个配置会自动注册了一个 RequestMappingHandlerMapping、一个RequestMappingHandlerAdapter、以及一个ExceptionHandlerExceptionResolver 以支持使用注解Controller的注解方法(如@RequestMapping、@ExceptionHan原创 2022-06-01 19:30:37 · 3531 阅读 · 0 评论 -
Spring 5个标准事件及自定义事件
一、spring5个标准事件如下作用如下:上下文更新事件(ContextRefreshedEvent):该事件会在ApplicationContext被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。上下文停止事件(Conte原创 2022-05-31 01:17:27 · 2951 阅读 · 0 评论 -
@CrossOrigin及其实现跨域原理
一、关于什么是跨域及解决方法看这篇文章文章二、关于@CrossOrigin简单请求和非简单请求对于简单请求(GET,HEAD,POST),浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为预检请求 (preflight)@Cro原创 2022-05-18 14:22:45 · 9640 阅读 · 1 评论 -
SpringBoot升级到2.3.x后返回message为空
一、背景SpringBoot项目版本升级:2.1.6.RELEASE -> 2.3.9.RELEASE版本升级后,原有一些自定义异常的的错误message无法返回了。// 预期结果{ "timestamp": "2021-03-02T06:36:09.458+00:00", "status": 500, "error": "Internal Server Error", "message": "用户名已存在", "path": "/user"}//转载 2022-04-05 02:31:54 · 821 阅读 · 0 评论 -
springMVC九大组件及一次请求流程
一、九大组件HandlerMapping(处理器映射器)HandlerMapping 是⽤来查找Handler的,也就是处理器,具体的表现形式可以是类,也可以是⽅法。⽐如,标注了@RequestMapping的每个⽅法都可以看成是⼀个Handler。Handler负责具 体实际的请求处理,在请求到达后,HandlerMapping 的作⽤便是找到请求相应的处理器Handler 和 Interceptor.HandlerAdapter(处理器适配器)HandlerAdapter 是⼀个适配器。原创 2022-03-14 16:59:13 · 1054 阅读 · 0 评论 -
SpringBoot Test及注解详解(含Mockito)
一、版本差异Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,在 Spring Boot 2.2.0 版本之前,spring-boot-starter-test 包含了 JUnit 4 的依赖,Spring Boot 2.2.0 版本之后替换成了 Junit Jupiter。pom.xml <dependency> <groupId>org.springframework.boot</groupId&g原创 2022-03-12 17:59:54 · 63481 阅读 · 1 评论 -
SpringMVC拦截器HandlerInterceptor原理及使用
在使用SpringMVC拦截器的时候,我们接触的最多的便是HandlerInterceptor接口,因为我们所有的自定义拦截器都必须要实现HandlerInterceptor接口,那么就先从HandlerInterceptor接口开始一步步分析。一、HandlerInterceptor接口包含三个方法:default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) t原创 2022-03-01 20:51:20 · 3780 阅读 · 0 评论 -
HTTP,request,response
一、HTTP协议Hypertext Transfer Protocol,超文本传输协议,HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。HTTP 优点灵活可扩展。一个是语法上只规定了基本格式,空格分隔单词,换行分隔字段等。另外一个就是传输形式上不仅可以传输文本,还可以传输图片,视频等任意数据。请求-应答模式,通常而言,就是一方发送消息,另外一方要接受消息,或者是做出相应等。可靠传输,HTTP是基于TCP/IP,因此把这一特性继承了下来。无状原创 2022-02-26 05:10:20 · 504 阅读 · 0 评论 -
@ModelAttribute和@SessionAttributes和@SessionAttribute和@RequestAttribute
一、@ModelAttribute用法绑定请求参数到命令对象(入参对象):放在控制器方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;当参数类型是一个bean的时候,它可以按照bean的属性一一注入。@ModelAttribute("LoginUser") User user暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法,也就是没有@RequestMapping标注的方法)上时,是为表单准备要展示的表单引用数原创 2022-02-25 01:42:47 · 1393 阅读 · 0 评论 -
什么是跨域?怎么解决跨域问题?
一、什么是跨域跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域) http://www.123.com/inde…什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安原创 2021-07-22 09:46:58 · 1180 阅读 · 0 评论 -
HttpClient、OKhttp、RestTemplate对比
一、三者的对比HttpClient:代码复杂,还得操心资源回收等。代码很复杂,冗余代码多,不建议直接使用。RestTemplate: 是 Spring 提供的用于访问Rest服务的客户端, RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。okhttp:OkHttp是一个高效的HTTP客户端,允许所有同一个主机地址的请求共享同一个socket连接;连接池减少请求延时;透明的GZIP压缩减少响应数据的大小;缓存响应内容,避免一些完全重复的请求二、Ht原创 2021-10-25 16:28:18 · 14934 阅读 · 0 评论 -
Feign,Apache Http Client,OkHttp的区别
一、在Java中可以使用的HTTP客户端组件主要有3个,如下:(1)HttpURLConnection,JDK自带(2)Apache HttpComponents,独立的HTTP客户端实现,使用广泛,目前已发展到5.x版本,详见:https://hc.apache.org/index.html(3)OkHttp,一个新出现的HTTP客户端,详见:https://square.github.io/okhttp/为什么已经存在了如Apache HTTPClient和OkHttp这样优秀HTTP客转载 2021-10-24 22:43:02 · 3956 阅读 · 0 评论 -
Springboot中的缓存Cache和CacheManager原理介绍
一、背景理解什么是缓存,为什么要用缓存?程序运行中,在内存保持一定时间不变的数据就是缓存。简单到写一个Map,里面放着一些key,value数据,就已经是个缓存了。所以缓存并不是什么高大上的技术,只是个概念,把要多次使用的东西存在一个变量里,时不时取出来使用,就达到了缓存的目的,缓存就是存放数据的容器。那为什么要用缓存呢,是因为要多次使用。一个程序总有一些数据是可预见被多次使用(预见的准不准就是常说的命中率)比如一个复杂的计算结果,一次数据库访问取得的数据等耗时耗资源的数据就能放入缓存,目的就是为了转载 2021-10-11 15:46:53 · 13847 阅读 · 1 评论 -
java Junit 为什么@Test注解里的方法必须是public void修饰的
通过查阅了Junit的源码,里面有段代码是这样的 1 protected void validateInstanceMethods(List < Throwable > errors) { 2 validatePublicVoidNoArgMethods(After. class , false , errors); 3 validatePublicVoidNoArgMethods(Before. class , false , errors); 4原创 2021-10-11 14:21:07 · 1092 阅读 · 0 评论 -
@RequestParam和@RequestBody的区别 (结合 Get/Post )
一、get方法请求:例如http://127.0.01:1025/download?url=https://www.baidu.com&token=opera-dev获取请求参数:直接获取request 如: public String getHtml(HttpServletRequest request) {}什么也不加,直接在方法中获取参数值 如:public String getHtml(String url, String token) {}利用@R原创 2021-09-02 08:35:36 · 1369 阅读 · 0 评论 -
自定义 Spring Boot Starter
一、引言什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧。Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and related technologies that you need without having to hunt throug原创 2021-08-17 17:22:48 · 242 阅读 · 0 评论 -
SpringBoot解耦的扩展机制 Spring Factories介绍及使用
一、什么是 SPI机制Spring Boot中有一种非常解耦的扩展机制:Spring Factories。这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的。SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java SPI机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案转载 2021-08-17 11:17:51 · 698 阅读 · 0 评论 -
过滤器、拦截器、监听器的区别与使用
一、拦截器与过滤器的区别过滤器 (Filter)过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法。init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。destroy():原创 2021-08-17 00:45:07 · 4700 阅读 · 0 评论 -
springboot 自定义类配置
一、编写配置类@ConfigurationProperties(prefix = "mall.thread")@Component@Datapublic class ThreadPoolConfigProperties { private Integer coreSize; private Integer maxSize; private Integer keepAliveTime;}二、properties文件中可以联想到#配置线程池mall.thread.cor原创 2021-07-21 16:26:41 · 528 阅读 · 0 评论 -
常用日志门面和日志实现
一、日志门面SLF4J简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等。 当然slf4j自己也提供了功能较为简单的实现,但是一般很少用到。对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、logback等),中间使用桥接器完成桥接。官方网站: https://www转载 2021-04-26 13:43:37 · 1406 阅读 · 1 评论 -
什么是JavaBean、bean? 什么是POJO、PO、DTO、VO、BO ? 什么是EJB、EntityBean?
前言:在Java开发中经常遇到这些概念问题,有的可能理解混淆,有的可能理解不到位,特此花了很多时间理顺了这些概念。不过有些概念实际开发中并没有使用到,可能理解还不够准确,只能靠后续不断纠正了。1、什么是POJO ?POJO(Plain Old Java Object)这种叫法是Martin Fowler、Rebecca Parsons和Josh MacKenzie在2000年的一次演讲的时候提出来的。按照Martin Fowler的解释是“Plain Old Java Object”,从字面上翻译为原创 2021-03-26 23:45:55 · 324 阅读 · 0 评论 -
SSO模型及单点登录SSO技术选型
一、多系统的复杂性web系统早已从久远的单系统发展成为如今由多系统组成的应用群,面对如此众多的系统,用户难道要一个一个登录、然后一个一个注销吗?就像下图描述的这样 web系统由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担,而不是用户。无论web系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问web系统的整个应用群与访问单个系统一样,登录/注销只要一次就够了虽然单系统的登录解决方案很完美,但对于多系统应用群已经不再适用了,为什么呢?单系统登录解决方案的核心是cook原创 2021-03-26 15:48:28 · 1566 阅读 · 0 评论 -
Java后端返回通用接口设计
我印象中,通用返回接口设计是有两种方式,第一种是自定义返回数据的通用类,另一种是springboot中实现ResponseBodyAdvice接口,实现返回数据格式的统一,如我说的有错,请大佬指出。本篇文章主要讲解通过springboot实现的方式。一、自定义返回数据的通用类的方式这里我推荐这篇文章二、springboot实现ResponseBodyAdvice接口的方式Entity/** * @author Cristianoxm */@Data@AllArgsConstructor原创 2021-03-25 23:25:11 · 1565 阅读 · 0 评论 -
前后端接口设计规范
一、前后端接口设计规范建议采用RESTful 方式来实施。说明1:采用RestFul方式实施接口通用性强,异构性强。说明2:对于使用如Dubbo这样的框架,限于java一种语言范围内,在Provider与Consumer两侧共享一个client.jar包的情形,需要另外包装成RESTFul接口以向外发布。但对于使用Spring Cloud这样框架的新开应用,天然具有采用RestFul方式来实施的便利性。协议API与用户的通信协议,总是使用HTTPs协议,确保交互数据的传输安全。原创 2021-03-25 10:19:53 · 4851 阅读 · 0 评论 -
SSO单点登录和OAuth2.0的区别和理解
一、概述SSO是Single Sign On的缩写,OAuth是Open Authority的缩写,这两者都是使用令牌的方式来代替用户密码访问应用。流程上来说他们非常相似,但概念上又十分不同。SSO大家应该比较熟悉,它将登录认证和业务系统分离,使用独立的登录中心,实现了在登录中心登录后,所有相关的业务系统都能免登录访问资源。OAuth2.0原理可能比较陌生,但平时用的却很多,比如访问某网站想留言又不想注册时使用了微信授权。以上两者,你在业务系统中都没有账号和密码,账号密码是存放在登录中心或微信服务器中的,原创 2021-03-24 17:58:46 · 10221 阅读 · 3 评论 -
JWT 详细分析
首先我们从 Token 入手,再联系到 JWT,然后分析 JWT 的优缺点和使用场景,最后再联系到 Oauth2.0。一、Tokentoken 是一串字符串,通常因为作为鉴权凭据,最常用的使用场景是 API 鉴权。API 鉴权那么 API 鉴权一般有几种方式呢?我大概整理了如下:cookie + session和平常 web 登陆一样的鉴权方式,很常见,不再赘述。HTTP Basic将账号和密码拼接然后 base64 编码加到 header 头中。很显然,因为账号和密码几乎是『明转载 2021-03-24 15:56:27 · 636 阅读 · 0 评论 -
Spring事务传播机制和隔离级别
Spring有5种隔离级别,7种传播行为。这是面试常问的内容,也是代码中经常碰到的知识点。这些知识枯燥而且乏味,其中有些非常的绕。如果栽在这上面,就实在是太可惜了。在一些事务的基础上,再探讨几个容易淡忘的概念,从源码层面找原因,加深我们的理解,问题大概包括:1.Spring的事务和数据库的事务隔离是一个概念么?2.Spring是如何实现事务的?3.事务隔离机制都有哪些?4.事务传播机制都有哪些?5.查询语句需要开事务么?6.private方法加事务注解有用么?1、Spring的事务和数转载 2020-06-09 16:27:12 · 402 阅读 · 0 评论 -
jdk动态代理与cglib动态代理--InvocationHandler--MethodInterceptor
动态代理是为了实现Aop编程(不修改类源码,类方法执行前后,自定义增强处理, 日志 拦截等等),代理的是类对象一、jdk动态代理被代理的类需要实现接口,针对接口的代理,通过生成一个实现了接口的动态类实现代理ServiceImpl是被代理类,实现接口ServiceInterfaceJDKProxy是代理处理方法类,实现接口InvocationHandler通过JDKProxy.bind()得到jdk【动态生成】代理类ServiceProxy (ServiceInterface),当你调用Serv原创 2021-01-25 14:42:29 · 860 阅读 · 0 评论 -
SpringBoot 定制化原理
一、定制化的常见方式修改配置文件xxxxxCustomizer编写自定义的配置类 xxxConfiguration;+ @Bean替换、增加容器中默认组件;视图解析器Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件@Configurationpublic class AdminWebConfig implements WebMvcConfigurer@EnableWebMvc + WebMvcConfigu原创 2021-01-22 00:07:00 · 470 阅读 · 0 评论 -
SpringBoot 嵌入式Servlet容器
一、嵌入式Servlet容器切换嵌入式Servlet容器默认支持的webServer :Tomcat, Jetty, or UndertowServletWebServerApplicationContext 容器启动寻找ServletWebServerFactory并引导创建服务器切换服务器<dependency> <groupId>org.springframework.boot</groupId> <artifactId&原创 2021-01-21 23:56:37 · 324 阅读 · 0 评论 -
SpringBoot Web原生组件注入(Servlet、Filter、Listener)
一、使用原生Servlet API(推荐)@Slf4j@WebFilter(urlPatterns={"/css/*","/images/*"}) //mypublic class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("MyFilter初始化完成"); }原创 2021-01-21 21:14:21 · 334 阅读 · 0 评论 -
Spring Boot Spring MVC异常处理原理分析
一、Spring MVC为处理异常的前期准备DispatcherServlet入口类,是一个Servlet,是所有请求的分发点初始化DispatcherServlet在初始化时会触发onRefresh()方法,此方法会调用initStrategies方法(初始化九大组件),完成整个DispatcherServlet的初始化工作,其中initHandlerExceptionResolvers()会初始化HandlerExceptionResolvers对象protected void ini原创 2021-01-21 18:16:38 · 339 阅读 · 0 评论