H-ui

如何优雅的在java中统计代码块耗时

放肆的年华 提交于 2020-03-03 21:07:05
如何优雅的在java中统计代码块耗时 在我们的实际开发中,多多少少会遇到统计一段代码片段的耗时的情况,我们一般的写法如下 long start = System.currentTimeMillis(); try { // .... 具体的代码段 } finally { System.out.println("cost: " + (System.currentTimeMillis() - start)); } 上面的写法没有什么毛病,但是看起来就不太美观了,那么有没有什么更优雅的写法呢? <!-- more --> 1. 代理方式 了解 Spring AOP 的同学可能立马会想到一个解决方法,如果想要统计某个方法耗时,使用切面可以无侵入的实现,如 // 定义切点,拦截所有满足条件的方法 @Pointcut("execution(public * com.git.hui.boot.aop.demo.*.*(*))") public void point() { } @Around("point()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); try{ return joinPoint.proceed(

es6 Set和map数据结构

核能气质少年 提交于 2020-03-01 21:16:25
set set构造函数创造类似数组的数据,set数据结构的数据没有重复的值 let ary = [1,2,3,4,4,4,4]; let setData = new Set(); ary.forEach((p) => { setData.add(p) }) console.log(setData) // [1,2,3,4] set函数接受一个数组(或者是具有iterable接口的数据类型)作为参数,用来初始化 let setData = new Set([1,2,3,4,4,4,4]); // [1,2,3,4] let setDiv = new Set(document.getElementsByTagName('div')) Set 加入值的时候,不会发生类型转换,例如5和‘5’是不同的值,NaN和NaN相等的,见代码 let ary = [NaN,NaN,NaN,5,'5',{},{}] let setData = new Set(ary);// [NaN,5,'5',{},{}] set实例的属性和方法 属性 Set.prototype.constructor:构造函数,默认就是Set函数。 Set.prototype.size:返回Set实例的成员总数。 方法 add(),向该set数据中加目标值,返回该set has(),判断该set是否包含目标值,返回布尔值

SpringBoot 整合 SpringSecurity 之基于内存认证(一)

时间秒杀一切 提交于 2020-02-27 13:53:30
SpringBoot 整合 SpringSecurity 之基于内存认证(一) 在第一篇的教程中,我们简单的了解了一下 SpringSecurity 的使用姿势,添加依赖,在 application.yml 文件中加几行配置,就可以实现一个基本的登录认证; 默认的配置只能设置一个账号,那么如果需要多个账号可以怎么支持呢? 本文将介绍一下基于内存的认证方式 <!-- more --> I. 内存认证 基于内存保存认证信息的方式,本篇博文中,会介绍两种常见的使用姿势 0. 项目配置 环境配置和前面一致,相关内容可以参考博文: 191223-SpringBoot 整合 SpringSecurity 之起源篇(零) 1. WebSecurityConfigurerAdapter 这里主要是借助 SpringSecurity 的配置适配器来处理,下面是一个简单的 case @Configuration public class SecurityAdapterConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure

使用Java Socket手撸一个http服务器

南笙酒味 提交于 2019-12-06 22:05:20
原文连接: 使用Java Socket手撸一个http服务器 作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomcat的底层是怎么支持http服务的呢?大名鼎鼎的Servlet又是什么东西呢,该怎么使用呢? 在初学java时,socket编程是逃不掉的一章;虽然在实际业务项目中,使用这个的可能性基本为0,本篇博文将主要介绍如何使用socket来实现一个简单的http服务器功能,提供常见的get/post请求支持,并再此过程中了解下http协议 <!-- more --> I. Http服务器从0到1 既然我们的目标是借助socket来搭建http服务器,那么我们首先需要确认两点,一是如何使用socket;另一个则是http协议如何,怎么解析数据;下面分别进行说明 1. socket编程基础 我们这里主要是利用ServerSocket来绑定端口,提供tcp服务,基本使用姿势也比较简单,一般套路如下 创建ServerSocket对象,绑定监听端口 通过accept()方法监听客户端请求 连接建立后,通过输入流读取客户端发送的请求信息 通过输出流向客户端发送乡音信息 关闭相关资源 对应的伪代码如下: ServerSocket serverSocket = new ServerSocket(port,

SpringBoot基础篇AOP之基本使用姿势小结

末鹿安然 提交于 2019-12-01 19:54:35
原文: 190301-SpringBoot基础篇AOP之基本使用姿势小结 一般来讲,谈到Spring的特性,绕不过去的就是DI(依赖注入)和AOP(切面),在将bean的系列中,说了DI的多种使用姿势;接下来看一下AOP的玩法 <!-- more --> I. 背景知识 在实际使用之前有必要了解一下什么是AOP,以及AOP的几个基本概念 1. advice before: 在方法执行之前被调用 after: 在方法执行之后调用 after returning: 方法执行成功之后 after throwing: 方法抛出异常之后 around: 环绕,自己在内部决定方法的执行时机,因此可以在之前之后做一些业务逻辑 2. join point 连接点,比如方法调用,方法执行,字段设置/获取、异常处理执行、类初始化、甚至是 for 循环中的某个点 但 Spring AOP 目前仅支持方法执行 (method execution) 简单来说,Spring AOP中,PointCut就是那个被拦截的方法 3. pointcut 切点,用来描述满足什么规则的方法会被拦截 正则表达式 : @Before("execution(public * com.git.hui.demo.base.bean.*.*(..))") 注解拦截方式 : @Around("@annotation

SpringBoot高级篇JdbcTemplate之数据查询下篇

回眸只為那壹抹淺笑 提交于 2019-11-29 07:17:30
SpringBoot高级篇JdbcTemplate之数据查询上篇 讲了如何使用JdbcTemplate进行简单的查询操作,主要介绍了三种方法的调用姿势 queryForMap , queryForList , queryForObject 本篇则继续介绍剩下的两种方法使用说明 queryForRowSet query <!-- more --> I. 环境准备 环境依然借助前面一篇的配置,链接如: 190407-SpringBoot高级篇JdbcTemplate之数据插入使用姿势详解 或者直接查看项目源码: https://github.com/liuyueyi/spring-boot-demo/blob/master/spring-boot/101-jdbctemplate 我们查询所用数据,正是前面一篇插入的结果,如下图 II. 查询使用说明 1. queryForRowSet 查询上篇中介绍的三种方法,返回的记录对应的结构要么是map,要么是通过 RowMapper 进行结果封装;而 queryForRowSet 方法的调用,返回的则是 SqlRowSet 对象,这是一个集合,也就是说,可以查询多条记录 使用姿势也比较简单,如下 public void queryForRowSet() { String sql = "select * from money where id

SpringBoot基础篇日志管理之默认配置

为君一笑 提交于 2019-11-28 15:45:23
更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 对于一个后端来说,日志是不可缺少的,这个东西,形象点就像剑客手中的剑,没有剑你就刷不了帅,砍不了人。所以就有必要好好的说道说道,这个日志文件的管理了。本篇博文将关注以下几点内容 日志级别选择 日志输出到文件 格式化输出 日志文件管理(自动删除,压缩归档等) 常用的logback-spring.xml配置 <!-- more --> I. 默认日志参数 1. 基础项目搭建 创建一个SpringBoot项目,根据官方文档的说明,默认选择的是Logback来记录日志;logback也是相对来说用的比较多的框架了,下文全都默认以logback作为日志输出框架 By default, if you use the “Starters”, Logback is used for logging. Appropriate Logback routing is also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J, or SLF4J all work correctly. 完整的pom依赖如下,即不需要引入什么特别的依赖,基本上就是SpringBoot项目最根本的项目结构 <parent>

SpringBoot基础篇之重名Bean的解决与多实例选择

末鹿安然 提交于 2019-11-27 13:41:47
更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 当通过接口的方式注入Bean时,如果有多个子类的bean存在时,具体哪个bean会被注入呢?系统中能否存在两个重名的bean呢?如果可以,那么怎么选择引入呢?如果不行的话又该怎么避免上面的问题呢? <!-- more --> I. 多实例Bean的选择 这个场景可以说是比较常见的,现在提倡面向接口编程嘛,当一个接口有多个实例时,怎么注入和引用就需要我们额外关注下了 1. 基本使用姿势 首先定义一个接口和两个简单的实现类,并演示一下我们通常的用法 一个输出的接口定义如下 public interface IPrint { void print(String msg); } 对应给两个实现 @Component public class ConsolePrint implements IPrint { @Override public void print(String msg) { System.out.println("console print: " + msg); } } @Slf4j @Component public class LogPrint implements IPrint { @Override public void print(String msg) { log.info("log print:

SpringBoot系列教程JPA之基础环境搭建

送分小仙女□ 提交于 2019-11-27 07:26:52
JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring Data JPA是在 Hibernate 基础上封装的一款框架。JPA作为标准,实际上并没有说局限于某个固定的数据源,事实上mysql,mongo, solr都是ok的。接下来我们将介绍下springboot结合jpa 来实现mysql的curd以及更加复杂一点的sql支持 <!-- more --> jpa系列教程将包含以下几块 环境搭建 基础的插入、修改、删除数据的使用姿势 基础的单表查询,如(>, <, = , in, like, between),分页,排序等 多表关联查询 事物使用 本篇为开始第一篇,先搭建一个可以愉快玩耍的jpa项目 I. 环境搭建 我们选择的数据库为mysql,所以有必要先安装一下,这里跳过mysql的安装教程,直接进入springboot项目的搭建 1. pom依赖 我们这里选择的是 2.0.4.RELEASE 版本进行演示 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE<