![](https://img-blog.csdnimg.cn/bcc8b2b8f55e4ecd9e76ebe1e7213916.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
SpringBoot
文章平均质量分 91
重新系统学一下SpringBoot,包括基础篇、运维、开发、以及底层源码的实现
-代号9527
逢山开路,遇水搭桥!纸上得来终觉浅,绝知此事要躬行。
展开
-
【原理篇】四、自定义starter
做一个记录系统访客独立IP访问次数的功能,并把它自定义成一个starter,实现:在现有项目中引入这个starter后,则这个项目就有了访客IP统计功能,且通过配置可以去改这个功能。原创 2023-11-08 19:21:01 · 409 阅读 · 0 评论 -
【原理篇】三、SpringBoot自动配置原理
对比上面的Redis自动配置类和开篇的demo,前面的CartoonCatAndMouse类就是RedisAutoConfiguration,CartoonProperties就是RedisProperties,那就模仿官方写法,把CartoonCatAndMouse改成一个真正的自动配置类。新建org@Data//重复代码,略....此时,项目启动,有MyCore.class类被加载时,触发自动装配,完成相关Bean的加载。原创 2023-11-08 11:16:49 · 108 阅读 · 0 评论 -
【原理篇】二、Bean加载控制
Bean的加载控制指根据特定情况对bean进行选择性加载以达到适用于项目的目标且上篇中已演示了部分对Bean加载的控制,这里演示编程式和注解式两种。原创 2023-11-07 16:58:49 · 126 阅读 · 0 评论 -
【原理篇】一、声明Bean的八种方式
创建一个纯Maven工程来演示Bean的多种声明和定义的方式,这里只引入spring-context的依赖:原创 2023-10-10 08:56:27 · 524 阅读 · 0 评论 -
【开发篇】二十三、SpringBoot Admin端点指标控制以及自定义端点
Component//调用业务操作,获取支付相关信息结果,最终return出去//业务逻辑自定义重启服务,定义成功:调用一下:定义端点的类上加@Endpoint(id=“pay”)注解,id即端点名称,enableByDefault即是否默认开启,默认为true。方法上加注解,即读取我定义的这个端点时,就调用注解修饰的这个方法。原创 2023-10-09 09:32:33 · 312 阅读 · 0 评论 -
【开发篇】二十二、SpringBoot Admin实现服务监控
看下客户端的依赖,里面有个actuator,Actuator提供了SpringBoot生产就绪功能,通过端点的配置与访问,获取端点信息。但从安全方面来想,你做一个监控服务,然后想监控谁就监控谁,不管别人是否同意,这也是不合理的,因此,需要被监控方配置了对应的监控地址,才能监控。这个服务如果只能等待被监控的服务上报数据,那就会有延迟(比如人5分钟一上报),因此需要既支持上报,也支持。待监控的客户端服务加配置,这些配置就是上面说的"受不受监控,哪些数据可以被监控"。访问IP:PORT即可进入服务端监控页面。原创 2023-10-09 09:31:46 · 339 阅读 · 0 评论 -
【开发篇】二十一、SpringBoot整合Kafka
Kafka主体不是用来做消息中间件的,但也有这个功能,接下来整合Kafka。原创 2023-10-08 09:08:09 · 113 阅读 · 0 评论 -
【开发篇】二十、SpringBoot整合RocketMQ
convertAndSend方法依旧重载,可以直接传一个Object,也可以先传一个destination参数,即发到哪儿,再传要发的message。asyncSend异步发消息,有个参数是callback回调方法,类型是一个接口,创建这个对象的时候重写。方法,即消息发送成功以后的逻辑和消息发送失败以后的逻辑(异步的体现,不用等,来个回调)。注解,两个属性为主题名称和消费者组。,重写onMessage方法,加。原创 2023-10-08 09:06:54 · 298 阅读 · 0 评论 -
【开发篇】十九、SpringBoot整合RabbitMQ(SpringAMQP)
可以看到,消费者2处理消息慢(代码里用处理一次休眠的旧来模拟),但它从队列里拿的消息却和消费者1一样,因此导致消费总时间过长。prefetch默认无限,这里改为1,即 每次只能获取一条消息,处理完成才能获取下一个消息。重启,这次同样生产50条消息,消费总时间变短了,可以看到消费者2处理的慢,取的也慢。和基本模型不一样,WorkQueue模型,即工作队列,有多个消费者。可以提高消息处理速度,避免队列消息堆积。启动消费服务,可以看到队列创建并且绑定到了交换机,以后交换机有消息,和交换机绑定的队列都能收到一份!原创 2023-05-30 23:54:34 · 1421 阅读 · 4 评论 -
【开发篇】十八、SpringBoot整合ActiveMQ
取消息消费则相反,先receive接收,再convert转换,调用receiveAndConvert,形参为要转的目标类型。convertAndsend方法,发送消息到消息队列,convert,即转换,转换成能接受的数据类型然后发送,因此这个方法的形参类型可为Object,调用方便。业务逻辑代码就实现上篇的MessageService接口就行,上篇在拿一个队列模拟MQ,来进行消息的生产与消费,这里有了真正的队列来存储消息了。这种流水线的关系,体现的是一种顺序和依赖的业务。原创 2023-10-07 10:34:39 · 513 阅读 · 0 评论 -
【开发篇】十七、消息:模拟订单短信通知
JMS的实现技术有(类比实现JDBC的各个数据库驱动):ActiveMQ、Redis、HornetMQ、RabbitMQ、RocketMQ(没有完全遵守JMS规范)同步通信就行打视频,等着对方接电话才能继续往下,而异步通信就像发消息,发完我就干其他事儿了,啥时候回随你。这里模拟下单后给用户异步发送通知短信,先不用MQ,用一个集合模拟MQ来实现这个业务:首先写消息处理的Service层,模拟消费队列中的信息,发送短信给用户。写订单业务的Service层,模拟下单后,把订单编号等信息放到队列中。原创 2023-10-07 09:05:06 · 259 阅读 · 0 评论 -
【开发篇】十六、SpringBoot整合JavaMail实现发邮件
我在公司内网写的,网络不通,不是25端口被禁的原因,在外网是可以ping通smtp.qq.com这个host的。注意password,不是邮箱的登录密码,是一个授权码,获取方式,在QQ邮箱中是【设置】-【邮箱账号】-【开启】然后在上个页面点保存更改,(记得点保存更改)复制这个授权码就是password的值,即可配置邮件客户端成功。整合完成,下面按简单邮件和复杂邮件来写。简单即普通文本,复杂即超链接、附件等。注入JavaMailSender对象,定义发送邮件的接口。正文为html,比如超链接或者图片。原创 2023-10-06 13:01:37 · 1244 阅读 · 10 评论 -
【开发篇】十五、Spring Task实现定时任务
上一篇用Quartz来实现了定时任务,但相对来说,这个框架还是比较繁琐。Spring Boot默认在无任何第三方依赖的情况下使用Spring-context模块下提供的定时任务工具。原创 2023-10-06 00:54:59 · 2219 阅读 · 0 评论 -
【开发篇】十四、SpringBoot整合Quartz实现定时任务
配置中有一个scheduler-name字段,看上面Quartz的库里的表,所有的表中都含有一个SCHED_NAME字段,对应配置的这个scheduler-name,相同 Scheduler-name的节点,形成一个 Quartz 集群。以上为原生Java的实现,在此基础上,市面上出现了更加完善和规范的落地技术Quartz,于是,Spring整合了Quartz,后来,Spring又推出了自己的Spring Task。QuartzJobBean类的源码:它实现了Job,并且定义了公用的execute方法。原创 2023-10-04 17:33:00 · 462 阅读 · 0 评论 -
【开发篇】十三、J2cache缓存框架
J2cache是一个缓存整合框架,可以提供缓存的整合方案,使各种缓存搭配使用,自身不提供缓存功能。J2cache是一个两次缓存的框架第一级缓存L1使用内存,同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine,默认一级为Caffeine第二级缓存L2使用 Redis(推荐)/Memcached,默认二级为Redis由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此L1 的目标是降低对 L2 的读取次数。原创 2023-10-02 18:39:45 · 579 阅读 · 0 评论 -
【开发篇】十二、缓存框架JetCache
JetCache对SpringCache进行了封装,在原有功能基础上实现了多级缓存、缓存统计、自动刷新、异步调用、数据报表等功能CaffeineRedisTair。原创 2023-09-29 09:17:24 · 536 阅读 · 0 评论 -
【开发篇】十一、SpringBoot缓存底层实现技术的切换为Ehcache、Redis、Memcached
有点low,虽然Spring容器不管控我,自然也不会读我写application.yaml中的配置,但我可以自己写,然后自己读取yaml,然后给代码中用,这样配置统一管理,优雅且合理(当然你也可以定义个变量,然后@Value从yaml中取,看配置的数量多不多吧)。重启服务,测试下上篇的验证码的生成与校验接口都正常,这就完成了底层缓存技术的切换,从默认的Simple切换为Ehcache。如上图,9s内,age这个key的数据最近一次使用是第5s的时候,其他数据则在第7、8、9秒时访问过,按LRU就淘汰它。原创 2023-09-28 09:08:09 · 450 阅读 · 0 评论 -
【开发篇】十、Spring缓存:手机验证码的生成与校验
传统的一个查询接口,每次都查需要去和数据库交互,数据库压力大且容易产生性能瓶颈:在Service层引入一个Map类型的非局部变量,来模拟缓存:(这种使用一个Map来充当临时缓冲池的思想需要学习@Override此时调用之前的接口,除了第一次需要查数据库,后面直到服务重启,变量被回收,都不用再去查数据库。原创 2023-09-27 17:43:07 · 732 阅读 · 0 评论 -
【开发篇】九、SpringBoot整合ES(ElasticSearch)
不用加配置,上面的starter搭配的那个配置也可以注释掉了,使用es-high-level-client,ES的信息写在代码中,不写在配置文件中,因为没和SpringBoot整合还。,与以往不同的是,SpringBoot平台并没有跟随ES的更新速度进行同步更新,ES提供了。SetUp和TearDown分别代表每个测试用例@Test执行前和执行后进行的操作。整合思路都一样,先起步依赖或普通依赖,再配置,再封装的操作对象。不确定,没查文档,实际开发时自己看吧,注入不成功就@Bean自己创建一个。原创 2023-09-27 14:17:47 · 1202 阅读 · 0 评论 -
【开发篇】八、SpringBoot整合MongoBD
导入MongoBD的起步依赖:(这个starter背后是MongoDB的驱动和其他依赖,在这儿也可以看出命名的规律,redis的就是spring-boot-starter-data-redis)此时,就可(在UT中)进行简单的试运行,若出错,分析报错信息,从中找解决思路即可。这里简单整理下MongoDB的基本知识,后续专门学习MongoDB了再写笔记。NoSQL数据库产品中的一种,是最像关系型数据库的。进入解压缩后的目录新建一个数据目录,如:/data/db。MongoDB是一个开源、高性能、原创 2023-09-26 14:03:26 · 183 阅读 · 0 评论 -
【开发篇】七、RedisTemplate与StringRedisTemplate + Jedis与Lettcus
而V的类型可以是任意类型,取决于你存储的实际数据。当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null,此时就可以使用 StringRedisTemplate 试试,同理,使用RedisTemplate来set进去的数据,用StringRedisTemplate也无法获取。存取数据时,序列化的方式不同,互相查不到对方写进来的数据,导致了二者只能各自管各自的数据,给人一种它们数据不互通的感觉,但其实是同一个redis库。原创 2023-09-26 10:37:10 · 497 阅读 · 0 评论 -
【开发篇】六、SpringBoot整合Redis哨兵模式
监控:不断检查master和slave是否正常运行通知:当被监控的主从服务器发生问题时,向其他哨兵和客户端发送通知自动故障转移:断开master和slave的连接,选取一个slave做为master,将其他slave连接到新的maser,并导致客户端新的maser地址关于Redis哨兵模式的搭建和详解,看这篇【CSDN-Redis哨兵模式】原创 2023-06-30 23:13:05 · 6999 阅读 · 0 评论 -
【开发篇】五、SpringBoot整合Redis
使用注解开发时,不用手动调set方法将返回值存入Redis,直接加@Cacheable注解。以上是基本的使用,接下来引入数据源MySQL,稍微加点逻辑。原创 2023-06-29 22:34:19 · 243 阅读 · 0 评论 -
【开发篇】四、数据源、JdbcTemplate、内嵌H2
普通的连接数据库是建立一个连接,执行完sql之后,就会关闭,即销毁connection对象,再次连接还需要重复上述步骤。在数据源对象中存储了所有建立数据库连接的信息,如驱动类型,host、port、username、password,来构建数据库连接和连接池(注意不是所有的数据源都提供连接池),这个连接池,我理解的是上面的Connection对象的一个集合。H2是一个采用java语言编写的嵌入式关系型数据库,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制。原创 2023-09-25 15:04:31 · 174 阅读 · 0 评论 -
【开发篇】三、web下单元测试与mock数据
写懵了,刚开始竟然直接输出了一个new的Book对象,对象于Bean,前者不受Spring管控,也就是说Spring拿到随机数据也不能赋值给它,这个对象必须是Bean,所以改为了自动注入。平时写的测试Mapper和Service层方法的UT,就是一个普通的Java程序,没有web环境,想在web环境下启动,可以使用@SpringBootTest注解的。正常写UT时,这三个连一起就行,比如,先获取执行状态匹配器,再定义预期,然后做匹配。再响应头、响应结果…以上这个写法:比多环境开发中的测试环境影响范围更小,原创 2023-09-22 19:11:00 · 631 阅读 · 0 评论 -
【开发篇】二、属性绑定与校验
前面读取yaml文件配置时,用过这个注解,先复习下它的用法。# spring默认在用server,我加个s刻意回避下,别影响到服务启动servers:port: 9527OData@Component //首先它得是受Spring管控的对象,即Bean,不然我哪怕拿到值,我怎么联系你给你接下来看下效果,懒得写UT,再获取IoC容器对象了,直接借用启动类run方法返回的IoC对象来获取上面这个Bean成功:@ConfigurationProperties中写你。原创 2023-09-22 14:35:14 · 132 阅读 · 0 评论 -
【开发篇】一、热部署
上面这个热部署仅在本地开发阶段有意义,等线上了,不可能出现服务正运行呢,代码变了的情况。(那时候可能会发生配置更新,又追求更新配置不用重启服务就生效,即热更新,后话了)对于html页面等这类文件,改完后刷新浏览器就生效,不用参与热部署,即要控制热部署的范围才更合理。日常开发与调试,改几行代码想看效果就得手动点重启,很繁琐,接下来考虑启动热部署。上面每次点构建,和点重启其实差不多,无非是比重启启动的快(不再加载依赖的jar的原因)。改完代码,依赖的jar包通常不变,这个是没必要每次重复加载的。原创 2023-09-21 20:51:36 · 109 阅读 · 0 评论 -
【运维篇】四、服务日志控制
当达到每个日志文件的最大值max-file-size,则分文件,文件名以日期命名后加%i,即xx.1.log、xx.2.log等。常用的4种:即debug、info、warn、error。简化开发,减少日志对象的声明操作。原创 2023-09-20 09:34:56 · 123 阅读 · 0 评论 -
【运维篇】三、SLF4J与Logback
因为SLF4J就是门面设计模式的应用,因此先整理下这种设计模式。参考原文:https://blog.csdn.net/jason0539/article/details/22775311部分截图:核心就是外部(客户端)与一个子系统通信时,通过一个统一的外观对象进行,从而隐藏子系统的具体逻辑,使得子系统更易于使用。客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。门面对象有以下几个特点:注意是接口,不是具体实现,就像JDBC一样只是统一的接口,想要使用原创 2023-09-20 18:01:31 · 344 阅读 · 0 评论 -
【运维篇】二、配置文件与多环境控制
除了以上配置,也可以自定义配置文件,properties与yml文件格式均支持,如:然后通过启动参数加载配置文件(无需书写配置文件扩展名):也可通过配置文件位置–spring.config.location来生效:有多个配置文件时,逗号隔开就好。原创 2023-09-19 14:15:57 · 191 阅读 · 0 评论 -
【运维篇】一、SpringBoot应用的打包和运行
阿里云网址下创建的SpringBoot工程,skip为true时,只会生产本项目代码相关的包,而不会加入引入和启动类加载器等包,该jar包自然也不能运行,需要改为false才能打出可运行的jar包。SpringBoot为了让这个jar能独立运行,它要将工程中所使用的所有jar包都打到这一个工程包下,因此也叫。这样,以后打包就很灵活,两种jar包都能打,而不用刻意注释掉打包插件。,这和打的包有关 => SpringBoot的打包插件。以下指令的端口号、PID可以不用加双引号。,运行项目(执行启动指令)原创 2023-09-19 09:40:38 · 403 阅读 · 0 评论 -
【基础篇】六、基于SpringBoot来整合SSM的案例(下)
接下来加入前端页面,使用axios发送异步请求调用上篇的接口。调前端代码时,发现还挺有趣,刷新、隐藏、调用、以及一些交互逻辑的代码翻译,等框架学完看看前端的东西。原创 2023-09-18 15:46:43 · 158 阅读 · 0 评论 -
【基础篇】五、基于SpringBoot来整合SSM的案例(上)
接下来在SpringBoot下,把Spring、SpringMVC、MyBatis整合在一起,来实现一个简单的增删改查。原创 2023-09-17 18:10:24 · 172 阅读 · 2 评论 -
【基础篇】四、SpringBoot整合第三方技术
关于导入测试的starter,这一步在创建springboot工程时,这个依赖是默认自动加好的,但如果是自己手动创建的Maven工程,就得自己引入一下。使用官网版地址创建模块,技术集勾选时找不到MyBatisPlus,可使用阿里云版地址。到此,整合完成,整合第三方框架都是统一的:导入相关依赖、添加相关配置。原创 2023-09-17 15:23:35 · 194 阅读 · 0 评论 -
【基础篇】三、SpringBoot基础配置
查看启动日志,发现tomcat的context path变了,这个数据怎么进去的?就是用封装对象的方式+@ConfigurationProperties注解去拿的。当然这个时候你访问地址也就得变了:/访问不通了。原创 2023-09-15 21:24:59 · 291 阅读 · 0 评论 -
【基础篇】二、parent继承、starter、引导类、内嵌tomcat
SpringBoot,Boot,鞋子,其设计目的是用来简化Spring框架应用的初始搭建以及开发过程依赖设置繁琐(各个依赖之间版本的适配、依赖排除等活儿得自己调)配置繁琐起步依赖(简化依赖配置)自动配置(简化常用工程相关配置)辅助功能(内置服务器,……)关于这三点,接下来分开说明。原创 2023-09-15 17:31:47 · 928 阅读 · 0 评论 -
【基础篇】一、SpringBoot入门项目与模块创建
SpringBoot是用来简化Spring应用的初始搭建以及开发过程的一套脚手架。原创 2023-03-16 20:57:05 · 989 阅读 · 0 评论