自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

风萧水寒的博客

Stay hungry stay foolish

  • 博客(63)
  • 收藏
  • 关注

原创 SpringBoot中引入WebSocket

SpringBoot中引入WebSocket1、引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot

2021-09-01 09:20:39 3202

原创 JDBC Driver是如何自动注册的

总结下来就是:获取系统变量jdbc.drivers的值,该系统变量的值为java.sql.Driver实现类的权限定名称(多个实用:分隔),加载实现类(加载的时候自动将其注册到驱动管理器中);通过SPI机制,扫描jar包下的META-INF/services/java.sql.Driver配置文件,配置文件中为java.sql.Driver实现类的权限的名,加载该实现类(加载的时候自动将其注册到驱动管理器中)遍历注册的驱动,使用给定的url尝试建立数据库连接并返回。驱动管理器中被注册的驱动:

2021-08-09 23:42:44 569

原创 Java8——java.util.stream.Stream类方法总结

java.util.stream.StreamfilterStream<T> filter(Predicate<? super T> predicate)按给定Predicate过滤并返回一个steam,这是一个中间操作map<R> Stream<R> map(Function<? super T,? extends R> mapper)对每个元素都调用mapper.apply()方法,这是一个中间操作mapToIntIntStre

2020-08-30 17:20:07 1310

原创 Laravel—数据库操作与Eloquent模型使用总结

数据库操作执行原生SQL//查询$emp = DB::select('select * from employees where emp_no = 1');$emp = DB::select('select * from employees where emp_no = ? and gender = ?',[1,'M']);$emp = DB::select('select * from employees where emp_no = :empNo and gender = :gender',[

2020-08-30 17:14:03 1274

原创 PHP的简单介绍

简介全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器"、文件后缀为:.php,文件由HTML+CSS+PHP代码构成;<?php //PHP 代码 echo "Hello World!";?>变量规则变量以 $ 符号开始,后面跟着变量的名称变量名必须以字母或者下划线字符开始变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )变量名不能包含空格变量名是区分大小写的($y 和 $Y 是两个不同的变量)作用

2020-08-30 17:11:45 267

原创 Shiro 自定义验证和授权逻辑

依赖<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.5.2</version></dependency>自定义用户验证创建MyDBRealm类,继承org.apache.shiro.realm.AuthorizingRealm

2020-08-30 17:07:18 411

原创 Shiro的简单使用

快速开始可以从官网下载一个QuickStart项目,开始使用Shiro。shiro.inishiro.ini文件中定义了用户,角色,以及权限信息[users]# user 'root' with password 'secret' and the 'admin' roleroot = secret, admin# user 'guest' with the password 'guest' and the 'guest' roleguest = guest, guest# user 'pr

2020-08-30 17:05:59 157

原创 从源码分析ThreadLocal的原理

本文参考并摘抄自java基础教程由浅入深全面解析threadlocal总结:1. 线程并发:在多线程并发的场景下2. 传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量3. 线程隔离:每一个线程的变量都是独立的,不会相互影响基本使用package com.fxsh.ThreadLocal;import lombok.extern.slf4j.Slf4j;/* * 需求:线程隔离 * 在多线程并发的场景下,每个线程中的变.

2020-07-15 12:15:57 192

原创 使用两阶段终止模型优雅的中断线程

public class StopGenteelly { public static void main(String[] args) throws InterruptedException { TwoPhaseTermination tpt = new TwoPhaseTermination(); tpt.start(); Thread.sleep(100); tpt.stop(); }}class TwoPhaseTe

2020-07-04 08:09:33 158

原创 Java并发中偏向锁、轻量级锁和重量级锁的原理

重量级锁Java的对象头中的MarkWord32位操作系统:64位操作系统:Monitor当使用synchronized获得锁时:synchronized(obj){//重量级锁 //临界区代码}obj对象的MarkWord中的指针(ptr_to_heavyweight_monitor)指向一个 OS提供的 Monitor对象Monitor中的Owner记录谁是这个锁的主人。当另一个对象也要获取obj锁时:发现obj所指向的Monitor的所有者为Thread

2020-07-04 07:58:02 537 1

原创 JVM类加载机制简单介绍

本文为《深入理解Java虚拟机JVM高级特效与最佳实践(第三版)》一书的摘要总结类加载时机Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称做虚拟机的类加载机制。在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略为Java应用提供了极高的扩展性和灵活性,Java天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态连接这个特点实现的。类的生命周期:其中加载.

2020-06-29 07:34:47 4172

原创 JVM 类文件结构分析

本文为《深入理解Java虚拟机JVM高级特效与最佳实践(第三版)》一书的摘要总结概念介绍Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:“无符号数”和“表”:无符号数:属于基本数据类型,以u1,u2,u4,u8来代表1,2,4,8个字节的无符号数表:由多个无符号数或其他表作为数据项构成的复合数据类型,为了便于区分,所有表名都习惯性地以"_info"结尾。整体结构:版本号次版本号:JDK1.2到JDK11都没有用,全部固定为0。到了JDK.

2020-06-28 11:59:23 226

原创 JVM经典垃圾收集器的简单介绍

本文为《深入理解Java虚拟机JVM高级特效与最佳实践(第三版)》一书的摘要总结HotSpot虚拟机的垃圾收集器:从JDK9开始,Serial+CMS与ParNew + CMS的组合就不再被支持Serial 收集器Serial收集器属于新生代收集器,他是一个单线程工作的收集器,在它进行垃圾收集时,必须暂停所有其他的工作线程,直到它收集完成。Serial+Serial Old收集器的运行过程:Serial收集器是HotSpot虚拟机运行在客户端模式下的默认新生代收集器,他是所有收集器里额外.

2020-06-28 11:57:29 183

原创 MySQL优化查询性能的常用方法

本文为《高性能MySQL(第三版)》一书的摘要总结优化数据访问如果要优化查询,实际上是要优化其子任务,要么要出其中一些子任务,要么减少子任务的执行次数,要么让子任务运行的更快。查询性能低下最基本的原因是访问的数据太多。对于低效的查询,下面两个步骤的分析总是很有效:确认应用程序是否在检索大量超过需要的数据。这意味着访问了太多行后者列。确认MySQL服务器层是否在分析大量超过需要的数据行。是否向数据库请求了不需要的数据查询不需要的记录如果我们不需要展示全部记录,最好在查询后加上LIM.

2020-06-28 11:49:13 758

原创 MySQL怎样创建高性能的索引

本文为《高性能MySQL(第三版)》一书的摘要总结索引基础索引优化是对查询性能优化最有效的手段。索引可以包含多个列的值,如果索引包含多个列,列的顺序非常重要,因为MySQL只能高效使用索引的 最左前缀列。索引类型B-Tree索引使用B-Tree(实际上是B+Tree)数据结构来存储数据。可以使用B-Tree索引的查询类型:全值匹配和索引中的所有列进行匹配。匹配最左列匹配列前缀只匹配某一列的值的前缀部分,后续查询条件将不会使用索引。匹配范围值匹配某一列的.

2020-06-28 11:47:58 145

原创 MySQL查询性能剖析

本文为《高性能MySQL(第三版)》一书的摘要总结性能剖析一般分为两步:测量任务所花费时间对结果进行统计和排序,将重要的任务排在前面性能剖析工具的工作方式:在任务开始时启动计时器在任务结束时停止解释器结束时间减开始时间得到 响应时间任务剖析报告:每行记录一个任务,包括任务名称,任务的执行时间、任务的消耗时间、任务的平均执行时间以及该任务执行时间占全部时间的百分比。剖析MySQL查询慢查询慢查询日志可以帮助我们剖析并找出代价高的查询。查看是否开启慢查询日志mysql&gt.

2020-06-28 11:46:21 456 1

原创 Spring Cloud Config 的简单使用

本文为《Spring Cloud微服务实战》一书的摘要总结快速入门构建配置中心创建基础的Spring Boot工程,加入依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId></dependency>在主类上添加@EnableCon.

2020-06-28 11:43:29 254

原创 Spring Cloud Zuul 的简单使用

本文为《Spring Cloud微服务实战》一书的摘要总结快速开始创建网关创建一个Spring Boot应用,引入spring-cloud-starter-netflix-zuul依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId>.

2020-06-28 11:42:31 413

原创 Spring Cloud Feign 的简单使用

本文为《Spring Cloud微服务实战》一书的摘要总结开始使用Feign整合了Ribbon和Hystrix,同时还提供了一种声明式的Web服务客户端定义方式。创建一个SpringBoot应用,加入依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client&lt.

2020-06-28 11:39:56 124

原创 Spring Cloud Hystrix 使用与原理分析

本文为《Spring Cloud微服务实战》一书的摘要总结服务容错保护:Spring Cloud Hystrix在分布式架构中,断路器模式 的作用是:当某个服务单元发生故障之后,通过断路器的故障监控,向调用方法返回一个错误响应,而不是长时间的等待。Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。使用添加依赖<dependency> <groupId>org.springframework.cloud</groupId&.

2020-06-28 11:38:29 274

原创 Spring Cloud Ribbon 简单源码分析

本文为《Spring Cloud微服务实战》一书的摘要总结默认配置类package org.springframework.cloud.client.loadbalancer;// classpath下有RestTemplate.class// Bean容器中有LoadBalancerClient@ConditionalOnClass({RestTemplate.class})@ConditionalOnBean({LoadBalancerClient.class})@EnableConf.

2020-06-28 11:33:52 210

原创 Spring AOP(面向切面编程)

基于接口的AOP代理接口的所有方法配置:<bean id="msgServerImpl" class="com.canwin.aop.MsgServerImpl"/><bean id="beforeAdvice" class="com.canwin.aop.BeforeAdvice"/><!--简单aop,需要使用代理bean--><bean id="proxyMsgServer" class="org.springframework.aop.frame

2020-06-07 15:14:53 153

原创 Java虚拟机——垃圾回收流程与算法

如何判断对象是否不再被引用引用计数法(Referentce Counting)在对象中添加一个引用计数器,每当有一个地方引用,计数器值就加1,当一个引用失效时,计数器值就减1。该方法需要额外的存储空间,虽然算法简单,实现简单,但是会引起一些问题,主流的Java虚拟机都没有采用这种方式。可达性分析法(Reachability Analysis)通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索构成所走过的路径称为“引用链(Reference Chain

2020-05-09 10:41:59 271 1

原创 Java虚拟机——运行时数据区与对象内存布局

运行时数据区程序计数器记录线程当前正在执行的虚拟机字节码指令的地址;如果正在执行的是本地方法,则计数器值为空(Undefined)。它是程序控制流的指示器,分支,循环,跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。Java虚拟机栈它描述了Java方法执行的线程内存模型:每个方法 被调用时,Java虚拟机都会同步创建一个 栈帧,该栈帧用于存放该方法的局部变量表、操作数栈、动态连接、方法出口等信息。方法的调用与完成对应着栈帧的入栈和出栈。在局部变量表中,存放的是:java虚拟机基本

2020-05-09 00:00:50 180

原创 Spring MVC 是如何处理请求的

SpringMVC 处理请求的过程请求离开浏览器,到达DispathcerServlet,SpringMVC的每个请求都要通过这个前端控制器(front controller) Servlet。 在这里一个单实例的Servlet将请求委托给应用程序的其他组件来执行实际的操作。DispathcerServlet的任务是将请求发送给Spring MVC控制器(Controller),一般应...

2020-05-07 23:36:54 296

原创 浅尝设计模式——如何使用单件模式

本文为阅读《Head First 设计模式》一书的摘要总结单件模式定义单件模式 确保一个类只有一个实例,并提供一个全局访问点。示例public class Singleton{ private static Singleton uniqueInstance; private Singletion(){ uniqueInstance = new Singleton(); ...

2020-05-04 10:41:00 191

原创 《Spring in Action》第8章-异步消息发送

异步消息发送JMSJMS是一个标准,它定义了同消息中间件工作的通用API。Spring提供了JmsTemplate,我们可以使用这个模板来使用JMS。JMS设置在使用JMS之前,我们需要在项目中添加JMS客户端。对于Spring Boot来说,我们只需要添加starter依赖就可以了。如果我们使用ActiveMQ:<dependency> <groupId&g...

2020-05-03 17:22:33 536

原创 浅尝设计模式——如何使用工厂模式

本文为阅读《Head First 设计模式》一书的摘要总结工厂模式简单工厂定义简单工厂并不是一个设计模式,反而比较像一种编程习惯。该习惯将代码中,实例化对象的部分封装起来,独立于客户。使得客户代码满足 关闭-开放原则。示例Pizza orderPizza(String type){ Pizza pizza; if (type.equals("cheese")){ pizza...

2020-05-03 12:07:18 135

原创 浅尝设计模式——如何使用装饰者模式

本文为阅读《Head First 设计模式》一书的摘要总结装饰者模式定义装饰者模式 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。类图:装饰者和被装饰者都是组件,都有相同的超类型。每个装饰者都有一个组件(对Component对象的引用),该组件属于被包装对象。包装者中可以添加新的行为,这些行为可以通过在旧行为之前或之后做一些计算来添加的。装饰者...

2020-05-02 10:46:26 126

原创 浅尝设计模式——如何使用观察者模式

本文为阅读《Head First 设计模式》一书的摘要总结观察者模式概念定义观察者 模式定义了对象之间的 一对多 依赖,这样一来,当一个对象改变状态时,它的所有依赖都会受到通知并自动更新。类图松耦合观察者模式提供了一种对象设计,让主题和观察者之间松耦合。主题唯一依赖的东西是一个实现Observer接口的 对象列表。当有新类型的观察者出现是,不需要改变主题代码,我们只需要新类型...

2020-04-30 16:26:03 231

原创 浅尝设计模式——如何使用策略模式

本文为阅读《Head First 设计模式》一书的摘要总结策略模式概念策略模式定义了 算法族(一组行为),分别封装起来,让他们之间可以相互替换,此模式让算法的变化 独立于 使用算法的客户。Demo现在我们要加入一个橡皮鸭RubberDuck,若是直接继承Duck类,那么RubberDuck将具有同其他两个类相同的fly和quack的行为,但事实上RubberDuck不应该有这两个行...

2020-04-29 12:06:35 150

原创 核心技术(卷二)07、第11章-RMI远程方法调用

RMI远程方法调用客户与服务器角色所有的分布式编程思想都很简单:客户计算机产生一个请求,然后将这个请求通过网络发送到服务器。服务器处理这个请求并返回一个针对该客户端的相应,供客户端进行分析。我们想要的机制:客户端程序员以常规的方式进行方法调用,无需关心将数据发送到网络上或者解析响应之类的问题。解决办法是在客户端为远程对象安装一个代理。同样实现服务端的程序员也不需要考虑与客户端之间的通信。...

2020-04-28 10:49:17 212

原创 《Spring in Action》第7章-使用REST服务

使用REST服务RestTemplate同JDBCTemplate一样,为了消除大量繁琐的样板代码,RestTemplate提供了很多方法,使得我们能够很方便的调用REST服务。这些方法大致可分为以下12组重载方法:Method groupDescriptiongetForObjectRetrieves a representation via GET.ge...

2020-04-27 17:18:44 226

原创 《Spring in Action》第6章-REST services

REST services编写RESTful风格的controllerSpringMVC 提供了@RequestMapping注解用于映射请求与对应的Controller方法。同时,还提供了以下几个更加详细的注解:AnnotationHTTP methodTypical use@GetMappingHTTP GET requestsReading resource ...

2020-04-26 17:54:56 407

原创 核心技术(卷二)06、第10章-脚本、编译和注解处理

脚本、编译和注解处理Java平台的脚本添加脚本引擎Java SE默认支持对JavaScript的解释。ScriptEngineManager manager = new ScriptEngineManager();//获取所有发现的引擎工长列表List<ScriptEngineFactory> factoryList = manager.getEngineFactories...

2020-04-26 09:11:27 159

原创 《Spring in Action》第5章-Configuration Properties

Configuration Properties调整自动配置Environment abstraction对于任何可配置属性来说,Spring的Enviroment abstraction就是一个一站式的仓库。它抽象出各种属性源以供bean使用。Spring从以下几个属性源中抽取属性:JVM system propterties操作系统环境变量命令行擦桉树应用的属性配置文件Spr...

2020-04-22 17:26:19 227

原创 《Spring in Action》第4章-Spring Security

Spring Security开始使用Spring Security加入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></depen...

2020-04-21 17:55:03 333

原创 核心技术(卷二)05、第4章-数据库编程

数据库编程JDBCJDBC并非Java Database Connectivity的缩写,而是一个注册了商标的术语,它的命名体现了对ODBC(为C语言访问数据库提供了一套编程接口)的致敬。JDBC与ODBC有基于同一个思想:根据API编写的程序都可以与驱动管理器 进行通信,而驱动管理器则通过驱动程序与实际的数据库进行通信。JDBC的典型用法数据库URLJDBC URL的一般语法为:J...

2020-04-21 10:52:14 353

原创 核心技术(卷二)04、第3章-网络

网络连接到服务器//创建一个链接到本地8080端口的套接字。Socket socket = new Socket("localhost",8080);//获取输入流InputStream inputStream = socket.getInputStream();Scanner in = new Scanner(inputStream);whiel(in.hasNext()){ ....

2020-04-16 09:59:47 230 1

原创 URI与URL的区别和联系

URI与URLURI统一资源标识符(Uniform Resource Identifier),在电脑术语中是一个用于标识某一互联网资源名称的字符串。通用URI的格式如下:[协议名]://[用户名]:[密码]@[主机名]:[端口]/[路径]?[查询参数]#[片段ID]URN统一资源名称(Uniform Resource Name),是统一资源标识(URI)的历史名字,它使用"urn"作为...

2020-04-16 09:02:00 315

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除