教你快速上手springboot
环境准备
idea软件,java8环境,maven环境
前言:什么是maven?大家学校里学习的时候,老师会把用到的依赖以jar包的方式给你教你导入项目。比如数据库驱动,学习jdbc导入过吧?但是随着项目越来越大,会有无数个jar包需要导入,很繁琐难以管理。于是maven诞生了,你只需要在pom.xml中指定依赖,就可以从网络下载jar包到本地进行管理。当你不需要用这个依赖的时候就从pom.xml中将他删除。pom.xml是项目中maven的配置文件,下面会说到具体用法。
项目准备1 创建springboot项目
或者这样:
点击next
点击finish
为了清晰我们把没用的这些选中的文件删掉
项目结构和介绍如下
注意看项目的第二个文件,就是笔者在前言提到的maven,我们打开看一下。
下面我们写一个页面,然后用springboot启动项目访问他。
helloworld在resources/templates新建前端页面hello.html
12345678910<!DOCTYPE html><html lang="en"><h ...
validate与国际化配合效果更加~
前言:当我们用@valid或者@validate验证controller层接收前端发来的对象数据时,在对象的实体类上的validation相关的验证注解有起效了,很多时候我们会写message=“xxx”自定义验证不通过的内容。例如:@NotNull(message = "id不能为空")很不优雅。点开源码可以看见默认的message,String message() default "{javax.validation.constraints.NotNull.message}";,这就相当优雅了,设想我们有很多的业务有很多的业务提示,直接写死的话不够优雅,后期也不方便待修改,于是就有了这篇博客,使用国际化优雅的返回提示信息。本文从对validator和国际化的用法开始介绍。
validator数据验证
数据验证给了我们很多方便,避免了不少在接收完参数之后逐一验证参数的合法性所写的大量验证代码。
相关注解
@NotNull不为空
@NotBlank不为空白
NotEmpty至少有一个
@Range指定范围
@Length指定长度范围
@Mi ...
ElasticSearch+filebeat+logstash+kibana(版本7.14.0)
环境与前言
centos7.x docker 20.x elk+filebeat 统一是7.14.0 本人大三,在一家小公司实习,最近公司里发版测试环境使用docker,觉得是时候学习一下docker了 于是学习了一下docker 不得不说上手之后很香。推荐到菜鸟教程学习,连接:Docker教程。学习完了部署了一下elk,也是在实习的时候接触到的,elk可以收集过滤分析日志,学习了一下。附上官网连接:ElasticSearch: 权威指南 Logstash 文档 Kibana 文档 Filebeat 文档 目前来说我只是单纯的使用,没有太过认真的去攻读这些文档,我只读了我用到的和一些配置的章节。以后有时间在慢慢学习下去吧,对这一块还算有点兴趣。
架构简介简介与他们之间的联系
Elasticsearch : 是一个分布式、RESTful 风格的搜索和数据分析引擎。
Logstash : 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。
Kibana : 是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据 ...
服务调用之openFeign
OpenFeign简介Feign 是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需要创建一个接口并在接口上添加注解即可。
使用步骤application.yml
1234567server: port: 80eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
主启动类添加注解@EnableFeignClients
service层
123456789@Component@FeignClient(value = "CLOUD-PAYMENT-SERVICE")// *注明要调用的微服务名称public interface PaymentFeignService { @PostMapping("/payment/create") // *要调用的地址 public CommonResult& ...
建造者模式
定义建造者模式也叫生成器模式。将一个复杂的对象构建与它的表示分离,使得同样的构建过程可以构建不同的表示。
优点
封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
建造者独立,容易扩展。
便于控制细节风险。由于具体的建造者是独立的,因此可以对建造者过程逐步细化,而不对其他模块产生任何影响。
建造者模式实例实例已上传至github,附上地址:https://github.com/Tab-Tan/design/tree/master/builder
抽象工厂模式
定义为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。即工厂内造工厂。
优点&&缺点优点
产品族内的约束为非公开状态,在不同的工厂中各种产品之间可能具有不同的相互依赖关系,这些依赖关系由工厂封装在其内部,对于工厂的使用者来说这些依赖是不可见的。
生产线的扩展非常容易。如果要针对同一产品族建立新的生产线,只需实现产品族中的所有产品接口并建立新的工厂类即可。
缺点
产品族本身的扩展非常困难。如果产品族中增加一个新产品类型,则需要修改多个接口,并且会影响已有的工厂类。
抽象工厂实例实例已上传至github,附上地址:https://github.com/Tab-Tan/design/tree/master/factory/abstractFac
方法区
方法区的基本理解
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。
方法区在JVM启动的时候被创建,并且它的实际的物理内存空间和Java堆区一样都可以是不连续的。
方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。
方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfMemoryError:PermGen / Metaspace space
举例:加载大量的第三方jar包;Tomcat部署的过程过多(30-50个);大量动态的生成反射类
关闭JVM就会释放这个区域的内存。
Hotspot中方法区的演进
jdk7及以前习惯把方法区称为永久代。jdk8使用元空间取代了永久代。
本质上,方法区和永久代并不等价。永久代仅是对hotspot而言。java虚拟机规范对如何实现方法区不作统一要求。
现在看来,当年使用永久代导致Java程序更容易OOM(超过-XX:MaxPermSize上限)
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与 ...
堆区
堆的细分内存结构
现代垃圾收集器大部分都基于分代收集理论设计,堆空间细分为:
Java 7及以前内存逻辑上分为三个部分:新生区+养老区+永久区
Young Generation Space 新生区 Young/New
又被划分为Eden区和Survivor区
Tenure generation Space 养老区 Old/Tenure
Permanent Space 永久区 Perm
Java 8及之后堆内存逻辑上分为三部分:新生区+养老区+元空间
Young Generation Space 新生区 Young/New
又被划分为Eden区和Survivor区
Tenure generation Space 养老区 Old/Tenure
Meta Space 元空间 Meta
约定:新生区=新生代=年轻代 | 养老区=老年区=老年代 | 永久区=永久代
堆空间大小的设置
Java堆区用于存储Java对象实例,那么堆的大小在 ...
方法引用
引入:在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关。
以下介绍关于方法引用的概念
方法的静态链接与动态链接
静态链接一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期间可知,且运行期间保持不变时。这种情况下将调用方法的符号引用转换为直接引用的过程叫做静态链接。
动态链接如果被调用的方法在编译期间无法确定,只能在程序运行期将调用方法的符号引用转换为直接引用,由于这种引用转换过程具备动态性,因此也就被称为动态链接。
早期绑定与晚期绑定
早期绑定被调用的目标方法如果在编译期可知,且运行期保持不变时,即可将这个方法与所属类型进行绑定,这样一来,由于明确了被调用的目标方法究竟是哪一个,因此也就可以使用静态链接的方式将符号引用转换为直接引用。
晚期绑定如果被调用的方法在编译期无法被确定下来,只能够在程序运行期根据实际的类型绑定相关的方法,这种绑定方式也就被称之为晚期绑定。
非虚方法与虚方法
编译期就确定了具体的调用版本,这个版本在运行时是不可变的。
静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法。
其他的都是虚方法。
虚拟机中提 ...
虚拟机栈
调整虚拟机栈的大小的参数 -Xss
栈的结构栈有一个个栈帧组成|–栈|—-|–栈帧|—-|—-|–局部变量表|—-|—-|–操作数栈|—-|—-|–方法返回地址|—-|—-|–动态链接|—-|—-|–一些附加信息
如图:
局部变量表
也被称为局表变量数组或本地变量表,是一个数字数组。
记录基本数据类型和对象的引用和返回值类型。
局部变量表的大小在编译器就被确定不会改变。
基本存储单元:slot(变量槽)
32位以内的类型只占用一个槽,64位(long、double)占用两个槽
实例方法中局部变量表的首位存放this
注意solt重复利用的问题
局部变量表中的变量也是重要的垃圾回收根节点,只要被局部
变量表中直接或间接引用的对象都不会被回收。
操作数栈
主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间
方法刚执行的时候,一个新的栈帧会被创建,这个方法的操作数栈是空的
如果调用的方法带有返回值,返回值会被压入当前栈帧的操作数栈
操作数栈有明确的长度,为方法的code属性中的max_stack的值
操作数栈并非采用索引的方式来进行数据访问
JVM的解释 ...