around

Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

倖福魔咒の 提交于 2020-04-28 05:42:42
本文在个人技术博客【鸟不拉屎】同步发布,详情 可猛戳 亦可扫描文章末尾二维码关注个人公众号【鸟不拉屎】 一、前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转。本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理。 二、何为aop ​ aop全称 Aspect Oriented Programming ,面向切面,AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。其与设计模式完成的任务差不多,是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足。   通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式,在业务运行中将定义好的切面通过切入点绑定到业务中,以实现将一些特殊的逻辑绑定到此业务中。   举个栗子,项目中有记录操作日志的需求、或者流程变更是记录变更履历,无非就是插表操作,很简单的一个save操作,都是一些记录日志或者其他辅助性的代码。一遍又一遍的重写和调用。不仅浪费了时间,又将项目变得更加的冗余,实在得不偿失。   所以就需要面向切面aop就出场了。 三、aop相关名词 ​ 要理解SpringBoot整合aop的实现,就必须先对面向切面实现的一些aop的名称有所了解,不然也是云里雾里。 切面(Aspect)

趋势:flex和grid使布局更简单

a 夏天 提交于 2020-04-26 14:48:26
前言:记不久前面试的时候,面试官问我平时用什么布局方式,我非常耿直的说 div+css,利用position,float等布局,这就是非常传统的布局方式,通常都要写比较多的css代码;前几天在知乎上看到篇文章 前端未来页面布局发展方向是 Flexbox 还是 Grid? flex布局的话,我知道,是css3中引入的,即弹性盒子布局,它的浏览器兼容性如下图。对于grid布局,我才听闻,所以赶紧学习了一下。 查看属性的兼容性可以在这个网站: can I use 一 ,flexbox: 任何一个容器都可以指定为Flex布局,设置 display:flex;设置这个属性之后,子元素的float,clear和vertical-align属性将会失效。 flex容器默认有两根轴:水平的主轴(main axis)垂直的交叉轴(cross axis) 用表格的方式来一目了然的显示它的属性值: 属性名称 属性含义 属性可能的值 定义在容器的属性 flex-direction 决定主轴的方向 row( 默认 ) 水平,起点在左端 row-reverse 水平,起点在右端 column: 垂直,起点在上沿 column-reverse: 垂直,起点在下沿 flex-wrap 决定一条轴线放不下,如何换行 Nowrap( 默认 ) 不换行 Wrap: 换行,第一行在上面 Wrap-reverse: 换行

「网易官方」极客战记(codecombat)攻略-网页开发1-头条新闻-headliner

主宰稳场 提交于 2020-04-26 11:39:41
(点击图片进入关卡) 使用标题标签标记内容,为了每个人都知道接下来发生什么。 简介 <h1> , <h2> 和 <h3> 标签用于定义标题。 它们适用于标注内容。 默认代码 <!-- 标头标签用于标注内容。--> <!-- <h1>标签用于页面标题。 --> <!-- <h2>到<h4>标记是子标题。--> <h1>[What?]</h1> <!-- ∆ 将此行更改为任何内容--> <h2>Ogreball</h2> <!-- 添加另一个带有运动名称的<h2>! --> 概览 #标头标签 标题是标记内容的一种方式。 使用 <h1> , <h2> 和 <h3> 标签添加标题。 这些是开放和关闭的标签,因此包括像</h1> 这样的结束标签。 <h1> tBest Game </h1> <p> CodeCombat has ogres! Ogres are blue and stomp around angrily. I beat up ogres and get experience for winning. </p> 头条新闻 解法 <!-- 标头标签用于标注内容--> <!-- <h1>标签用于页面标题。--> <!-- <h2>到<h4>标记是子标题。--> <h1>[What?]</h1> <!-- ∆ 将此行更改为任何内容。--> <h2>Ogreball</h2> <!-

从一个CFS调度案例谈Linux系统卡顿的根源

最后都变了- 提交于 2020-04-24 09:49:44
Linux系统是一个让人感觉卡顿的系统,先别怼,让我说完: 卡顿的原因在于Linux内核的调度器从来不关注业务场景! Linux内核只能看到机器而不愿意看到应用。它倾向于自下而上从CPU角度提高吞吐,而不是自上而下从业务角度提高用户体验。 拟人来看,Linux是一个好程序员,但不是一个好经理。 万事必有因缘,Linux就是一个程序员发起一帮程序员折腾起来的,几乎没有穿西装的经理之类的人参与。 程序员天天挂在嘴边的就是性能,时间复杂度,cache利用率,CPU,内存,反之,经理每天吆喝的就是客户,客户,客户,体验,体验,体验! 前天晚上下班回到住处已经很晚,姓刘的副经理请教了我一个问题,说是他在调试一个消息队列组件,涉及到生产者,消费者等多个相互配合的线程,非常复杂,部署上线后,发现一个奇怪的问题: 整个系统资源似乎被该组件的线程独占,该消息队列组件的效率非常高,但其系统非常卡顿! 我问他有没有部署cgroup,cpuset之类的配置,他说没有。 我又问他该消息队列组件一共有多少线程,他说不多,不超过20个。 我又问…他说… … 我感到很奇怪,我告诉刘副经理说让我登录机器调试下试试看,他并没有同意,只是能尽可能多的告诉我细节,我来远程协助。 … 我并不懂消息队列,我也不懂任何的中间件,调试任何一个此类系统对我而言是无能为力的,我也感到遗憾

Spring Boot + Redis实战-利用自定义注解+分布式锁实现接口幂等性

空扰寡人 提交于 2020-04-23 07:52:27
场景 不管是传统行业还是互联网行业,我们都需要保证大部分操作是幂等性的,简单点说,就是无论用户点击多少次,操作多少遍,产生的结果都是一样的,是唯一的。而今次公司的项目里,又被我遇到了这么一个幂等性的问题,就是用户的余额充值、创建订单和订单支付,不管用户点击多少次,只会有一条充值记录,一条新订单记录,一条订单支付记录。 技术方案 现在使用比较广泛的方案都是基于Redis。 方案:Redis+token 处理流程:数据提交前,前端要向服务端的申请token,token(带有过期时间)放到redis;当数据提交时带上token,如果删除token成功则表明token未过期,然后进行业务逻辑,否则就是token已过期,提示前端请勿重复提交数据。 而我将使用不同的方案。因为此时前后端对接已走一半,不想让前端再增加请求token的接口(毕竟后端能搞定的,还是别麻烦前端同学了)。 方案:自定义注解+分布式锁 处理流程:将需要幂等性的接口加上自定义注解。然后编写一个切面,在around方法里逻辑:尝试获取分布式锁(带过期时间),成功表明没重复提交,否则就是重复提交了。 讲解开始 1、添加Redis依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data

pringboot 2.x 如何解决重复提交 (本地锁的实践)

心不动则不痛 提交于 2020-04-22 16:18:24
有没有遇到过这种情况:网页响应很慢,提交一次表单后发现没反应,然后你就疯狂点击提交按钮(12306就经常被这样怒怼),如果做过防重复提交还好,否则那是什么级别的灾难就不好说了。。。 本文主要是应用 自定义注解、 spring AOP、· Guava Cache 生成一种本地锁,来达到的防重复提交效果,由于是基于内存的缓存, 所以这种实现方式并不适用于分布式服务 Guava是什么? guava包是google嫌弃JAVA自带的类库不好用,自行研发的一套工具包,对JDK工具做了很好的拓展。例如:并发[Concurrency]、缓存[Caches]、 函数式风格[Functional idioms]、 字符串处理[Strings]等等。 一、引入Guava包依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>21.0</version> </dependency> 二、自定义LocalLock注解 自定义一个LocalLock注解用于需要防止重复提交的方法上 /** * 锁的注解 * */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented

谈谈flex布局实现水平垂直居中

大憨熊 提交于 2020-04-22 02:15:33
我们在这要谈的是用flex布局来实现水平和垂直居中。随着移动互联网的发展,对于网页布局来说要求越来越高,而传统的布局方案对于实现特殊布局非常不方便,比如垂直居中。所以09年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。 我们想用flex布局居中的话就得先了解什么是flex布局,flex布局也叫弹性布局。就是能够实现一些特殊的布局方式。言归正传,flex布局首先就得对它的属性就行了解。flex布局包含了多种属性,其中flex布局需要在父元素中加上 display: flex;,在此我们就先开始了解水平居中和垂直居中两种属性。其两种属性分别为: justify-content 、 align-items 而两种属性的取值也有多种。其中justify-content的取值分别为: flex-start(默认值,表示为起始位置对齐)、flex-end(表示为结束位置对齐)、 center (表示为水平居中对齐)、space-between(两端对齐)、space-around(环绕)、space-evenly(匀称)。举个实例: 首先我们进行写一个没有加flex布局的页面,呈现的结果为: 加入flex布局之后如图: 用 display: flex;justify-content: center ;就能实现水平居中。

曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析【上】)

丶灬走出姿态 提交于 2020-04-18 10:22:30
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean definition的? 曹工说Spring Boot源码(5)-- 怎么从properties文件读取bean 曹工说Spring Boot源码(6)-- Spring怎么从xml文件里解析bean的 曹工说Spring Boot源码(7)-- Spring解析xml文件,到底从中得到了什么(上) 曹工说Spring Boot源码(8)-- Spring解析xml文件,到底从中得到了什么(util命名空间) 曹工说Spring Boot源码(9)-- Spring解析xml文件,到底从中得到了什么(context命名空间上) 曹工说Spring Boot源码(10)-- Spring解析xml文件,到底从中得到了什么(context:annotation-config 解析)

POJ2488 A Knight&apos;s Journey【DFS】

心已入冬 提交于 2020-04-16 13:37:44
【推荐阅读】微服务还能火多久?>>> A Knight’s Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 58714 Accepted: 19998 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make

POJ1945 Power Hungry Cows【BFS】

三世轮回 提交于 2020-04-16 13:35:37
【推荐阅读】微服务还能火多久?>>> Power Hungry Cows Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6441 Accepted: 1593 Description FJ’s cows would like to be able to compute integer powers P (1 <= P <= 20,000) of numbers very quickly, but need your help. Because they’re going to be computing powers of very large numbers, they can only keep around two work variables for intermediate results. The first of those work variables is initialized to the number (denoted x) for which they are calculating the power; the other is initialized to 1. The cows can both multiply and divide any pair of the work