![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
SpringBoot
HCH996
一边失去,一边在寻找~
展开
-
spring boot
AOP: BeanPostProcessor Spring Boot:BeanFactoryPostProcessorspring boot依托于spring做一些准备工作,在启动sping boot程序的时候最终也是需要调用spring中的方法容器的创建和bean的创建有哪些准备工作?自动装配:在invokeBeanFactoryPostProcessor(beanFatory方法中完成的) 内嵌Tomcat 核心点(监听器 listener) - 执行到不同的点的时候要做什么事 A原创 2020-12-16 10:28:27 · 72 阅读 · 0 评论 -
Spring Boot面试题
以前开发web都需要写servert,写web.xml配置文件,从spring3.0以后就可以直接使用注解的方式进行开发。SpringBoot核心的功能就是BeanFactoryPostProcessorspring中有个非常重要的方法: AbstractApplicationContext类中的refresh方法springboot源码跟踪refreshContext()方法 ---》 refresh()方法面试题spring boot的启动流程自动...原创 2020-12-12 10:57:30 · 944 阅读 · 1 评论 -
Spring与SpringBoot
目录Spring的功能1. 控制反转2. 面向切面Spring的模块1. 核心容器2. AOP3. Web应用模块4. 数据访问集成5. Message6. TestSpring Boot特性Spring Boot与Spring MVC的区别Spring的功能1. 控制反转也叫依赖注入。但依赖注入只是控制反转的一种方式,通过依赖注入使得Java Bean的创建、引用、销毁的控制反转交给框架处理,使用方只需要声明需要依赖某个Java Bea.原创 2020-11-22 15:06:43 · 445 阅读 · 0 评论 -
点赞功能模块-获取用户详情与点赞过的历史文章
内容一:选择的数据结构同样也是哈希!!内容二:用户的维度~存储点赞过的历史文章(其中为了减少二次加工,对Field做了小技巧的处理..)~存储的逻辑要适用于"点赞"与“取消点赞"的场景原创 2020-10-21 21:19:41 · 713 阅读 · 0 评论 -
点赞功能模块-获取点赞排行榜
内容一:要获取点赞排行榜,得设计好数据结构并存储相应得数据;SortedSet闪亮登场内容二:为了减少二次加工和取值的方便,我们直接将"文章的标题"也一并塞进去...(备注,在Value中采用某个分隔符进行拼接)PraiseService.java //缓存点赞排行榜(数据结构zset;sortedSet)~score=点赞总数;value=文章id-文章标题 //需要同时适用于点赞和取消点赞的场景 private void cacheArticlePraiseRa.原创 2020-10-21 20:27:56 · 986 阅读 · 0 评论 -
点赞功能模块-获取文章详情与点赞用户列表
内容一:文章详情直接从db拿,而点赞用户列表其实就是从哈希数据结构Hash获取即可。内容二:获取当前用户是否已经点赞过当前的文章 - 其实就是contains方法的调用而已。原创 2020-10-21 20:02:03 · 771 阅读 · 0 评论 -
点赞功能模块-缓存取消点赞
PraiseController.java //取消点赞文章 @RequestMapping(value = "cancel",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) public BaseResponse praiseCancel(@RequestBody @Validated PraiseDto dto, BindingResult result){原创 2020-10-21 15:26:58 · 328 阅读 · 0 评论 -
点赞功能模块-缓存点赞的相关信息(文章维度)
内容一:选择的数据结构为哈希Hash!!内容二:文章的维度~存储文章被点赞多的用户Constant中增加一个keypublic static String RedisArticlePraiseHashKey = "SpringBootRedis:Hash:Article:Praise:V2";PraiseService.java:往db中插入数据后就要再调用cachePraiseOn函数//点赞文章 @Transactional(rollbackFor = Exc...原创 2020-10-21 11:02:04 · 394 阅读 · 0 评论 -
点赞功能模块-文章点赞功能实现
PraiseController.java//点赞文章 @RequestMapping(value = "on",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) public BaseResponse praiseOn(@RequestBody @Validated PraiseDto dto, BindingResult result){ Str...原创 2020-10-21 10:34:40 · 4162 阅读 · 3 评论 -
点赞功能模块-获取文章列表
内容:直接查找数据库返回文章的列表即可。PraiseController.java //获取文章列表 @GetMapping("list") public BaseResponse articleList(){ BaseResponse response=new BaseResponse(StatusCode.Success); try { response.setData(praiseService.getAll())原创 2020-10-21 08:45:27 · 223 阅读 · 0 评论 -
点赞系统设计与实战-整体业务流程介绍-数据库表设计
功能模块:其实主要包含对文章的“点赞”、“取消点赞”,获取点赞排行榜、获取用户点赞过的文章、获取点赞过的文章的用户一、整体业务流程介绍点赞功能取消点赞功能获取文章详情-文章的维度获取用户点赞过的文章列表(用户的维度)上述操作尽量在缓存中进行。二、数据库表的设计1. 两大数据库表:文章记录表article、文章的点赞记录表 article_praisearticle表CREATE TABLE `article` ( `id` int(11)...原创 2020-10-20 17:55:50 · 2087 阅读 · 0 评论 -
基于Key过期失效与定时任务实现订单超时未支付自动失效
一、将订单缓存至Redis1. 创建数据表user_ordercreate table user_order( id int(11) not null auto_increment, order_no varchar(100) not null comment "订单编号", user_id int(11) not null comment "用户id", is_active smallint(4) default 1 comment "状态(1=有效;0=无效)",..原创 2020-10-20 17:12:32 · 520 阅读 · 1 评论 -
基于Key过期失效实现 ‘N分钟内请勿重复提交“ 功能
场景一:比如“抢口罩”活动,提交成功后,N天无需重复提交...场景二:比如发表评论操作,一般是提交成功后,30min后才能再次评论...功能实现保证两点1=不能重复提交(用setIfAbsent塞入缓存,如果有指定的key,设值失败,只有没有指定的key时,设值才会成功,而且是原子性的操作,适合高并发的情景,N个并发过来的请求只会有一个进入方法体内) 2=成功塞入缓存后,设定TTL,保证只能在TTL时间后才能过期失效(也就意味着TTL之后才能再次提交)Controller之中的方法原创 2020-10-20 15:58:16 · 165 阅读 · 0 评论 -
缓存数据Key设置过期自动失效
内容:其实就是Expire命令的使用setex userOrderInfo 10 :设置10s的时间ttluserOrderInfoAPI的使用KeyExpireController.java@RestController@RequestMapping("key/expire")public class KeyExpireController extends AbstractController{ @Autowired private RedisTemplate r.原创 2020-10-20 15:21:07 · 321 阅读 · 0 评论 -
哈希Hash实战之系统数据字典实时触发与层级存储
内容:典型的数据字典:"支付状态",其数据选项的取值包括:(1=未支付;2=支付成功;3=支付失败...),对应的前端筛选组件就是"下拉框"创建字典配置表s_configcreate table s_config( id int(11) not null auto_increment, type varchar(100) character set utf8mb4 not null comment "字典类型", name varchar(100) character set原创 2020-10-18 21:09:21 · 241 阅读 · 2 评论 -
哈希Hash实战之简介与常用命令介绍
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象Redis中每个hash可以存储2^32-1键值对(40多亿)内容:正如JavaSE集合体系中的Map一样,只不过它是Map中嵌套了Map!hset hsetnx hget hgetall hmset hmget hdel hlen hkeys一个大Key,一个小key命令行hmset myhash 10010 xiaoming 10011 xiaohong 10012 xi.原创 2020-10-18 19:57:35 · 757 阅读 · 0 评论 -
有序集合SortedSet实战之充值排行榜
内容:给手机充值创建数据库表phone_fareCREATE TABLE `phone_fare` ( `id` int(11) NOT NULL AUTO_INCREMENT, `phone` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '手机号码', `fare` decimal(10,2) DEFAULT NULL COMMENT '充值金额', `is_active` tinyint(4) DEFAULT '原创 2020-10-18 17:56:39 · 342 阅读 · 0 评论 -
有序集合SortedSet实战之简介与常用命令
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序 有序集合的成员是唯一的,但分数(score)却可以是重复的 集合是通过哈希表实现的,所以添加、删除、查找的时间复杂度为O(1)。集合中最大的成员数为2^32 -1,每个集合可存储40多亿个成员。常见命令zadd sortset 1 azadd sortset 2 bzadd sortset 3c.原创 2020-10-18 16:36:06 · 506 阅读 · 0 评论 -
集合Set实战之在线考试系统获取随机 乱序的试题
内容:用户成功登录在线考试系统后,获取一套拥有N道试题的试卷!前提:我们的数据库中已经存储好了即将用于考试的试题.....要求:保证每个考生获取到的试题数量相同、试题相同,但是顺序不相同,即所谓的A、B卷传统实现:每个用户登录成功后,请求达到我们的后端接口,之后便是前往DB查询出大量的试题,然后再在代码的层次(内存)做一个随机的排序,最终返回给用户。缺陷:在高并发请求的环境下(比如同时有1000个考生登录考试),DB和内存负载压力将很大实现:基于缓存中间件Redis具有"随机","乱序"原创 2020-10-18 12:33:37 · 649 阅读 · 2 评论 -
集合Set实战之简介与常用命令介绍
正如JavaSE集合体系中的Set一样,元素唯一存储,但是是无序的Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据 Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1) 集合中最大的成员数为2^32-1,每个集合可存储40多亿个成员命令sadd setOne redis 插入元素sadd setOne mysqlsmembers setOne: 获取所有元素scard setOne: 获取集合中的元素个数原创 2020-10-18 11:15:46 · 516 阅读 · 1 评论 -
列表List实战之借助队列特性实现多线程发送邮件
可以充当 消息队列-消息通知的角色!内容二:自我实现邮件发送的功能,而且还是多线程批量发送!发送邮件服务MailDto.java//邮箱Dto@Datapublic class MailDto implements Serializable { private String subject;//主题 private String content;//内容 private String[] tos;//接收人,可以有多个接受人}Thread..原创 2020-10-18 10:42:30 · 360 阅读 · 1 评论 -
列表List实战之商家商品信息有序存储
内容一:电商系统后端管理平台一般有两个角色,一个是管理员,一个是商家,商家可以上传自己的商品...1. 创建Product表CREATE TABLE `product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '商品名称', `user_id` int(11) NOT NULL COMMENT '所属用户id', `scan_原创 2020-10-17 20:44:22 · 574 阅读 · 0 评论 -
列表List实战之简介与常用命令介绍
正如JavaSE集合体系中的List一样,元素有序存储排着序!get SpringBoot:Redis:String:Key:V2LPUSH myList a b c d e fLRANGE myList 0 6:取出指定范围的元素LINDEX myList 0LINDEX myList 1BRPOP myList 1LLEN myListLPOP myList:从左边弹出元素LREM myList:从左边移除元素 @Test public void..原创 2020-10-17 19:36:09 · 693 阅读 · 0 评论 -
字符串String实战之商品对象信息缓存管理之修改与删除
stringService.java //修改 @Transactional(rollbackFor = Exception.class) public Integer update(Item item) throws Exception{ int res = itemMapper.updateByPrimaryKeySelective(item); //数据库修改成功,也同时往cache写一份。保证双写一致性 if(res >原创 2020-10-17 18:18:07 · 103 阅读 · 0 评论 -
字符串String实战之商品对象缓存管理之新增与获取详情
1. 新创建item表CREATE TABLE `item` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(255) DEFAULT NULL COMMENT '商品编号', `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '商品名称', `create_time` datetime DEFAULT NULL, `content` text,原创 2020-10-17 17:55:11 · 85 阅读 · 0 评论 -
字符串String实战之简介与常用命令介绍
目录get set tt1 strlen incr decr incrby decrby mget命令的使用在JUnit中进行测试get set tt1 strlen incr decr incrby decrby mget命令的使用在JUnit中进行测试@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = MainApplication.class)public class RedisTest .原创 2020-10-15 17:57:20 · 142 阅读 · 0 评论 -
整合Redis自定义注入模板操作Bean实例
本质:是对Redis的操作组件RedisTemplate和StringRedisTemplate做自定义注入配置@Configurationpublic class RedisConfig { @Autowired private RedisConnectionFactory connectionFactory; @Bean public RedisTemplate redisTemplate(){ RedisTemplate<String,原创 2020-10-15 17:31:08 · 557 阅读 · 0 评论 -
redis简介、安装与简单使用
启动方式启动方式一:Windows下只需要双击redis-server.exe即可在本地启动redis服务 启动方式二:进入Redis的解压目录,redis-server.exe redis.windows.conf启动(推荐使用) 第一种方式启动时只会读取配置文件的一些默认配置,如果动态调整了一些配置,是不会加载的。而第二种方式则可以解决这种问题。使用使用:直接双击redis-cli.exe即可进入 命令行模式下的使用状态!如何连远程服务器redis-cli.exe -h 192.16原创 2020-10-15 17:01:36 · 62 阅读 · 0 评论 -
springboot启动之后输入url显示404
目录结构不符合要求,Controller包必须和AppApplication.java同级,因为@SpringBootApplication默认会去扫描同级目录或者子集目录下的所有类。原创 2020-10-15 15:16:52 · 612 阅读 · 0 评论 -
配置文件xml
mysql8.0以上版本数据库配置application.properties# DataSourcePropertiesspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/sb_redis?characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong原创 2020-10-14 19:22:36 · 97 阅读 · 0 评论 -
SpingBoot工作应用类
目录静态资源如何访问实现JSON处理器怎么替换?自定义异常处理SpringBoot如何处理跨域问题?如何快速构建RESTful应用怎么实现热部署整合常见的页面模板如何整合MyBatisSpringBoot如何管理接口文档?静态资源如何访问实现(1)5个默认位置:会先拦截/**这个路径还有一个/目录 (webapp下的资源):在访问静态资源的时候一定不能加/static,不然就会从/static/static中去查找文件(2) 自定义位置的两...原创 2020-10-14 16:49:53 · 129 阅读 · 0 评论 -
SpringBoot基础常见类
目录什么是SpringBootspring-boot-starter-parent的作用spring-boot-starter-dependeciesSpring Boot配置文件有几种格式什么是类型安全的属性注入(Type-safe Configuraion Properties)开发测试生产环境如何快速切换?如何整合web基础组件系统启动任务的两种实现方式如何兼容旧的Spring项目什么是SpringBoot...原创 2020-10-14 15:59:19 · 1461 阅读 · 0 评论 -
性能优化实战之异步发送邮件解耦核心业务
内容:“发送邮件"逻辑相对于主业务逻辑而言是"次要”的,故而应当从主业务逻辑中解耦出来,降低接口的整体响应时间。、service中修改成 //用户注册 @Transactional(rollbackFor = Exception.class) public void register(UsrDto usrDto) throws Exception{ //TODO:检查该邮箱账户是否已经存在 if(usrMapper.countByEmail(原创 2020-10-13 16:56:55 · 264 阅读 · 1 评论 -
功能模块实战之验证注册信息的合法性
步骤一:验证加密信息是否存在步骤二:判断失效性 并对其进行解密步骤三:解密信息,得到注册实体信息,前往数据库DB判断是否有此账号如果浏览器请求的参数中带有很多特殊符号,则会被转义。所以直接从浏览器中拿到参数再去匹配数据库,是无法匹配到的。改进: String encryptInfo = env.getProperty("user.register.email.validate.url"); //TODO:浏览器转义urlEncoder = 请求过来的时候 自动进原创 2020-10-13 16:35:39 · 245 阅读 · 0 评论 -
功能模块实战之发送验证注册信息的邮件
内容一:直接使用前面篇章抽象出来的MailService!~即类.方法 调用即可内容二:邮件中用于验证注册合法性的链接中涉及的相关信息应当属于私密信息,故而应当对其加密传输。AES和DES辅助类EncryptUtil.javaimport com.fasterxml.jackson.databind.ObjectMapper;import com.google.common.collect.Maps;import org.apache.commons.codec.binary.Base6原创 2020-10-13 15:19:08 · 342 阅读 · 1 评论 -
实际应用场景实战之保存用户注册信息
将前面章节所学的核心技术栈进行一个大融汇,并将其应用到实际的应用场景~"用户注册",从实践中来,从实践中去; 掌握业务流程的梳理,需求的分析和数据库设计的能力,并按照业务流程图以实际的代码进行实战实现,提高代码实操能力;共有两大核心模块核心业务模块一:用户提交注册信息 -用户表核心业务模块二:发送用户验证合法性的邮件+邮件内容加密串-加密串 ~历史邮件发送表根据业务流程图进行简单的需求分析准备两张表:usr 和mail_encry...原创 2020-10-13 11:24:44 · 481 阅读 · 0 评论 -
基于MyBatis解锁多数据源
多数据源~其实就是实现在一个项目里面操作多个数据源,从而共同实现某项任务或者某个功能模块!案例:我们将再创建一个数据库sb_technology作为从数据源,并在项目的请求方法中发起对主数据源、客数据源相关数据表的访问!实现:将基于注解+Java Config显示注入的方式实现!新建数据库sb_technology和数据表create database sb_technology;use sb_technology;create table sys_config( id int(11原创 2020-10-12 21:49:15 · 91 阅读 · 0 评论 -
通用的下载文件服务
目录方式一:基于传统的IO方式二:基于NIO实现文件的下载 - Channle组件及其API来实现!内容:本质上仍然是基于Java的IO(特别是File IO)流实现文件的读与写(只不过这个时候的写是往浏览器”写")方式一:基于传统的IOController层-得到附件对象,拼接完整文件的路径,将文件转化为输入流写入response对象之中 //下载文件 @RequestMapping(value = "file/download/{id}", method=Requ原创 2020-10-12 17:09:10 · 190 阅读 · 0 评论 -
通用的上传文件
目录方式一:基于传统IO的方式方式二:基于NIO改进通用的上传文件服务内容:其实就是将前端上传过来的文件保存到我们指定的服务器目录下案例:添加信息时,我们一般还需要上传商品的图片或者其他文件!先创建两张数据库表item和appendixcreate table item( id int(11) not null auto_increment, name varchar(255) default null comment "商品名", code varchar(原创 2020-10-12 10:53:13 · 543 阅读 · 0 评论 -
发送邮件
案例:员工入职-发送短信和邮件告知相关信息;企业发放Offer; 用户注册发送用于激活账号的链接;OA系统不同人员协同工作途径....核心步骤:申请用于发送邮件的"主题邮箱"(一般企业都会 有一个主体邮箱) 在qq邮箱的账户里开启SMTP服务,然后再生成授权码即可。加入起步依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&...原创 2020-10-11 10:20:14 · 677 阅读 · 2 评论