一.使用lombok插件

在平时的代码编写中,我们要编写很多javabean,pojo等等的对象类,而且还要对各种属性生成各种的setxxx,getxxx,tostring,hashcode,equal等方法,这些都是一些规定死的模板方法,或者你可能会说我用idea自动帮我生成的,但是这样也会使类中的代码增多,而使用lombok就可以一句这样的代码也不用编写就可以达到自己想要的效果。

使用:

1.首先在maven的pom.xml中加入lombok的坐标依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

2.依赖进来之后还要增加一个插件

下载下来重启idea就可。

3.在自己创建的javabean中使用set方法的话就使用@setter注解,get方法亦然,如果set和get方法都要的话就是用@data注解,

对应的也有@ToString方法,@EqualAndHashCode注解,见名知意。

 

二.动态更新数据库中的updateTime字段

通常我们创建一张数据库表的时候,都会加上createTime和updateTime两个字段,尽管你觉得这两个字段暂时用不上,但是这是一个好的习惯,而在创建的sql语句中,这两个字段的sql如下:

`create_time` timestamp not null default current_timestamp comment '创建时间',`update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改时间'

这两个字段都是时间类型,并且createTime设置了current_timestamp,即每一条数据加入来时这个字段都是以当前时间为数据记录到数据库,并且该字段的值不会因为更新修改而改变,而updateTime与createTime不同的就是设置了current_timestamp on update current_timestamp,这个设置以后的每一次更新修改都会影响这个字段的值,即为当前修改的时间。

所以在我们使用springboot的jpa时,当我们对数据进行更新操作的时候

@Testpublic void update() {ProductCategory productCategory = productCategoryDao.findOne(2);productCategory.setCategoryType(10);productCategoryDao.save(productCategory);}

例如我们先查出这条数据对应的对象,然后再对这个对象进行setxxx,然后save你会发现数据库中的type是改变了,但是updateTime并没有改变,还是原来的值,所以说我们在数据库中设置了updateTime字段的自动修改的属性并没有用,因为我们把对象查出来了,我们只是修改了对象的type属性,并没有修改updateTime的值呀,好像也不对,不是在数据库中设置了current_timestamp on update current_timestamp这个设置了吗?其实在这里我们只需要在javabean对象上加上注解@DynamicUpdate就可以了,加上这个注解然后再在数据库中设置current_timestamp on update current_timestamp就能实现updateTime自动随我们修改这一条数据的任何一个字段而修改为当前时间了。

三 事务的运用@transactional

事务的运用可以帮我们轻松实现一些数据统一的问题,在springboot中,可以使用注解@transactional去实现事务。

例如我这里的创建订单的业务,先插入订单详情的商品数据 ,然后再计算订单总价格,最后生成总订单,扣库存,而对于这里的每一个步骤来讲,应该要封装成一个事务来防止其中的数据库操作出错,例如一旦在扣库存这里发现库存不足,就会发生回滚,之前插入更新删除的数据都会恢复原来的样子。

在@transactional注解中还有个propagation 属性,来描述事务的行为。默认是Propagation.REQUIRED。就是说当前不存在事务的话就创建一个新的事务,否则就加入这个事务。

https://blog.csdn.net/nextyu/article/details/78669997  这是在springboot中使用@transactional的用法

四.WebSocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。首先为什么要WebSocket?Http协议是无状态,无连接,单向的应用层协议,一旦连接断开之后,之后的连接都和前面的连接毫无关联了,这样就有一个弊端,就是服务端无法主动推送信息给客户端,如果要实时获取服务器的信息的话,可以使用轮询的方法,隔几秒就请求一次服务器,但是这样的话太过于浪费资源,对于手机移动端来说就更是浪费流量了,还有一种就是与服务器建立长连接,实现服务器的主动推送信息给客户端,而WebSocket就是为此而生的。

在springboot中去开发WebSocket通信,首先加入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

然后加入配置类,启用WebSocket的支持

@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

创建WebSocket的监听类

@Component
@ServerEndpoint("/webSocket")
@Slf4j
public class WebSocket {private Session session;public static CopyOnWriteArraySet<WebSocket> webSocketCopyOnWriteArraySet = new CopyOnWriteArraySet<>();@OnOpenpublic void onOpen(Session session) {this.session = session;webSocketCopyOnWriteArraySet.add(this);log.error("【一个新的连接已建立】,连接总数为{}", webSocketCopyOnWriteArraySet.size());}@OnClosepublic void onClose() {webSocketCopyOnWriteArraySet.remove(this);log.error("【一个连接已断开】,连接总数为{}", webSocketCopyOnWriteArraySet.size());}@OnMessagepublic void onMessage(String message) {log.error("收到客户端发来的信息,信息内容为{}", message);}public void sendMessage(String message) {for (WebSocket webSocket : webSocketCopyOnWriteArraySet) {try {log.error("发送新的信息{},", message);webSocket.session.getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();}}}}

在这个监听类中能监听到建立连接,断开连接,收发信息这些操作,在这里面有一个静态的集合用来保存每一个客户端与服务端建立连接的WebSocket的实例,连接成功之后会有一个session对象,该对象就是用来推送信息给连接的客户端的。

客户端中的js代码

每个方法的名字都对应着其意的操作。客户端收到信息会触发onmessage事件,在这里我们可以操作弹窗,打开铃声提醒等等。

五.面向切面AOP

AOP在平时写代码的时候用得比较少,spring的两个核心IOC和AOP,在项目中,比如权限的检验就可以用到AOP了,面向切面是把一些重复性的代码在横向地切入到我们运行中的代码中,而权限的检验基本上每个URL都需要,所以AOP能比较优雅地实现我们的需求。

下面先说下AOP里面的几个常用术语:

连接点(Joinpoint)

连接点是指增强程序执行的某个特定位置(要在哪个地方做增强操作),Spring仅支持方法的连接点,既仅能在方法调用前,方法调用后,方法抛出异常时等这些程序执行点进行织入增强。

切点(Pointcut)

切点是一组连接点的集合。即指点了一个范围来确定哪些连接点。

增强(Advice)

增强是织入到目标类连接点上的一段程序代码。表示要在连接点上做的操作。

切面(Aspect)

切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括了横切逻辑的定义,也包括了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。

理解好AOP这几个术语的概念会对以后面向切面编程有较大的帮助.

下面来说一下在SpringBoot中使用AOP如何使用。

1.定义一个切面

@Aspect//定义一个切面
@Component
@Slf4j
public class SellerAuthorizeAspect {
}

2.定义切面

//定义切点,即后面的增强加在指定的切点中,切点是一组连接点的集合,即指定一个范围,//这些范围内的连接点就是需要增强的地方@Pointcut("execution(public * com.zyh.sell.controller.Seller*.*(..))"+ "&& !execution(public * com.zyh.sell.controller.SellerUserController.*(..))")public void verify() {}

3.定义Advice

//增强的方法,即Advice@Before("verify()")public void doVerify() {//查询cookie中的token//得到request对象ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();Cookie cookie = CookieUtil.get(request, Constant.CookieConstant.TOKEN);if (cookie == null) {log.error("【cookie校验失败】");throw new SellerAuthorizeException();}//查询redisString openid = stringRedisTemplate.opsForValue().get(String.format(Constant.RedisConstant.TOKEN_PREFIX, cookie.getValue()));if (StringUtils.isEmpty(openid)){log.error("【redis校验失败】");throw new SellerAuthorizeException();}}

完整的一个切面代码:

@Aspect//定义一个切面
@Component
@Slf4j
public class SellerAuthorizeAspect {@Autowiredprivate StringRedisTemplate stringRedisTemplate;//定义切点,即后面的增强加在指定的切点中,切点是一组连接点的集合,即指定一个范围,//这些范围内的连接点就是需要增强的地方@Pointcut("execution(public * com.zyh.sell.controller.Seller*.*(..))"+ "&& !execution(public * com.zyh.sell.controller.SellerUserController.*(..))")public void verify() {}//增强的方法,即Advice@Before("verify()")public void doVerify() {//查询cookie中的token//得到request对象ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();Cookie cookie = CookieUtil.get(request, Constant.CookieConstant.TOKEN);if (cookie == null) {log.error("【cookie校验失败】");throw new SellerAuthorizeException();}//查询redisString openid = stringRedisTemplate.opsForValue().get(String.format(Constant.RedisConstant.TOKEN_PREFIX, cookie.getValue()));if (StringUtils.isEmpty(openid)){log.error("【redis校验失败】");throw new SellerAuthorizeException();}}}

六.控制器增强器@ControllerAdvice

在spring3.2中加入了@ContollerAdvice这个注解,意为控制器增强器,@ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上

上代码:

//控制器增强器
@ControllerAdvice
public class SellerExceptionHandler {//当控制器发生指定的异常时就会触发指定的方法来增强控制器@ExceptionHandler(value = SellerAuthorizeException.class)public ModelAndView handleSellerAuthorizeException() {return new ModelAndView("redirect:");}}

当controller抛出了SellerAuthorizeException时就会触发handleSellerAuthorizeException方法。

idea开发springboot的一些小干货相关推荐

  1. 基于SpringBoot点餐小程序的开发【前后端】

    有个小伙伴临时找到小孟,要开发一个点餐的系统,时间比较着急,给了2天的时间. 马马虎虎的搞出来了,头发掉了一撮! 今年找工作真特么难!985 学生涌入现成当公务员,双非的学生搞得压力很大.硕士找不到工 ...

  2. SpringBoot对接微信小程序支付功能开发(一,下单功能)

    1,接入前准备: 接入模式选择直连模式: 申请小程序,得到APPID,并开通微信支付: 申请微信商户号,得到mchid,并绑定APPID: 配置商户API key,下载并配置商户证书,根据微信官方文档 ...

  3. SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能) 在上一篇下单功能中我们有传支付结果回调地址. 下面是回调接口实现 package com.office.miniapp.c ...

  4. 基于springboot+uniapp+vue3技术栈开发的开源跨平台小程序

    塔可商城, 一个基于springboot+uniapp+vue3技术栈开发的开源跨平台小程序.管理后台,后端服务的项目,它内置提供了会员分销, 区域代理, 商品零售等功能的新零售电商系统.强大弹性的架 ...

  5. 基于云开发模式的评分小程序总结!二维码、导出excel表格等实用干货!

    基于云开发的打分小程序开发总结 1.TAKE打分小程序 1.1.项目简介 1.1.1.开发背景 1.1.2.项目介绍 1.2.项目效果图 1.2.1.主页 1.2.2.评分流程页 1.2.3.项目详情 ...

  6. 教学妹开发springboot+vue的博客论坛系统,so esay

    今天给大家介绍一个简单的系统. 基于springboot+vue的博客论坛系统,如果你想学习更多的项目源码,可以在文章的末尾领取源码资料. 当然前面已经开源了很多的项目源码,都是免费学习的: 1,挑战 ...

  7. 上传声音 微信小程序_SpringBoot开发案例之微信小程序录音上传

    前言 书接上回的<SpringBoot开发案例之微信小程序文件上传>,正常的业务流程是,口语测评需要学生通过前端微信小程序录入一段音频,通过调用第三方音频处理服务商进行评分,然后服务端对原 ...

  8. 基于springboot 改造 open-shop小程序商城

    介绍: 基于springboot 改造 open-shop小程序商城,包括:分销(支持三级).团购(拼多多模式).秒杀.优惠券.等功能,前后端全部开源.做全网最开源.最稳定.功能做强大的开源小程序商城 ...

  9. 一个基于 SpringBoot 开源的小说和漫画在线阅读网站,简洁大方、强烈推荐

    来源:GitHub精选 今天给大家推荐的这个开源项目是一个基于 SpringBoot 实现的小说和漫画在线阅读网站. 这个开源项目叫:fiction_house. 这个开源项目是一个多平台(web.安 ...

  10. springboot基于微信小程序的在线办公系统+java+uinapp+Mysql

    目 录 1绪论 1 1.1概述 1 1.2课题意义 2 1.3主要内容 2 2 相关技术简介 3 2.1 微信技术介绍 4 2.2 JAVA简介 5 2.3 MYSQL数据库 6 2.4 ssm框架 ...

最新文章

  1. ACM 竞赛高校联盟 练习赛 第二场 BC
  2. HTTP协议和web工作原理
  3. 【ABAP】如何根据PR号删除PM单的组件
  4. java基础——equals及==的区别
  5. mysql数据库连接不稳定_连接 MySQL 数据库失败频繁的原因探秘
  6. Oracle 11g RAC搭建(VMware环境)UDEV(二)
  7. PIC16F877A的50HZ正弦波
  8. 中控考勤机忘记密码处理
  9. 计算机专业论文提纲,计算机硕士毕业论文提纲(范文精选)
  10. J2ME 发送彩信问题,请个位高手帮忙,长时间在线等待
  11. Cocos Creator 超简洁代码实现有限状态机 FSM,打造丝滑角色动作
  12. VScode写Go代码引用的包报错飘红
  13. Python学习手册(致敬谢公子)
  14. USNEWS美国大学计算机工程,想从事编程?2019年USNews美国大学计算机工程专业排名值得一看...
  15. 遗传算法的交叉变异操作杂记
  16. You need Perl 5.
  17. [交互][FWT] UOJ #328. 【UTR #3】量子破碎
  18. osg 瞄准镜 车窗镜 透视镜片 做法
  19. 2019最新《小象学院Python机器学习和算法高级版项目实战》
  20. 在校大学生如果连「校招」都不知道,那大学就白读了

热门文章

  1. 互联网硅谷投资教父 保罗·格雷厄姆 Paul Graham
  2. 如何设计实现一个证书加密签名工具包-极客大学架构师训练营(架构师 黄燧)
  3. 梯度下降法与正规方程的比较
  4. 强化学习各概念整理(value/policy-based、on/off-policy、model-based/free、offline)
  5. 逆向:Windows消息钩取
  6. windows批量重命名
  7. Git来回切换版本的时候,pom文件变黄,每次都需要重新添加到maven以及修改后文件不生效的解决方法
  8. matlab里日期函数,matlab中如何获取当前日期时间函数的具体应用如下
  9. mysql.5.7 declare_MySQL-5.7 游标及DECLARE
  10. Pandas处理缺失数据