08 2022 档案
摘要:简介 所谓双分派是指不管类怎么变化,我们都能找到期望的方法运行。双分派意味着得到执行的操作取决于请求的种类和两个接收者的类型 实现方案 假设我们要添加一个Wait的状态类,考察Man类和Woman类的反应,由于使用了双分派,只需增加一个Action子类即可在客户端调用即可,不需要改动任何其他类的代码
阅读全文
摘要:解决方案 将人分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价 有不同的种类,比如 成功、失败 等),请使用访问者模式来说实现 代码实现 package com.atguigu.visitor; public abstract class Person { //
阅读全文
摘要:将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价 有不同的种类,比如 成功、失败 等) 传统解决方案 传统方案利弊 1) 如果系统比较小,还是ok的,但是考虑系统增加越来越多新的功能时,对代码改动较大,违反了ocp原则, 不利于维护 2) 扩展性不好,比如
阅读全文
摘要:Spring框架的JdbcTemplate就使用到了命令模式 public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { public <T> List<T> query(String sql, RowMapp
阅读全文
摘要:实现方式 代码实现 package com.atguigu.command; //创建命令接口 public interface Command { //执行动作(操作) public void execute(); //撤销动作(操作) public void undo(); } package
阅读全文
摘要:问题描述 1) 我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作。 2) 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App,分别控制,我们希望只要一个app就可以控制全部智能家电。 3) 要实现一个app控制所有智能家电的需要,
阅读全文
摘要:Spring IOC容器初始化时运用到的模板方法模式 public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable { //声明了一个模板方法 void refresh
阅读全文
摘要:案例需求 制作豆浆的流程 选材 >添加配料 >浸泡 >放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。。) 代码实现 package com.atguigu.template; //抽象类,表示豆浆
阅读全文
摘要:编写制作豆浆的程序 1) 制作豆浆的流程 选材 >添加配料 >浸泡 >放到豆浆机打碎 2) 通过添加不同的配料,可以制作出不同口味的豆浆 3) 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 4) 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单,很容易就想到这个
阅读全文
摘要:简介 1) 静态代理和JDK代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理 2) Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将Cglib
阅读全文
摘要:简介 1) 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理 2) 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象 3) 动态代理也叫做:JDK代理、接口代理 JDK中生成代理对象的API 1) 代理类所在包:java.lang.reflect.Proxy 2)
阅读全文
摘要:简介 1) 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2) 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象 3) 代理模式有不同的形式, 主要有三种
阅读全文
摘要:Integer中的享元模式 public class FlyWeight { public static void main(String[] args) { Integer x = Integer.valueOf(127); Integer y = new Integer(127); Intege
阅读全文
摘要:代码实现 package com.atguigu.flyweight; public abstract class WebSite { public abstract void use(User user);//抽象方法 } package com.atguigu.flyweight; //具体网站
阅读全文
摘要:小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同: 1) 有客户要求以新闻的形式发布 2) 有客户人要求以博客的形式发布 3) 有客户希望以微信公众号的形式发布 传统方案解决网站展现问题 1) 直接复制粘贴一份,然后根据客户不同要求
阅读全文
摘要:MyBatis 中的Configuration 去创建MetaObject 对象使用到外观模式 public class Configuration { protected ReflectorFactory reflectorFactory = new DefaultReflectorFactory
阅读全文
摘要:1) 外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口才能达到目的。 比如:在pc上安装软件的时候经常有一键安装选项(省去选择安装目录、安装的组件等等),还有就是手机的重启功能(把关机和启动合为一个操作) 2) 外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作
阅读全文
摘要:组建一个家庭影院: DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为: • 直接用遥控器:统筹各设备开关 • 开爆米花机 • 放下屏幕 • 开投影仪 • 开音响 • 开DVD,选dvd • 去拿爆米花 • 调暗灯光 • 播放 • 观影结束后,关闭各种设备 传
阅读全文
摘要:Java的集合类-HashMap就使用了组合模式 # 编写测试代码 public class HashMapComp { public static void main(String[] args) { // TODO Auto-generated method stub Map<Integer,S
阅读全文
摘要:问题 编写程序展示一个学校院系结构:要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系 OrganizationComponent可以是接口、抽象类、具体的类 OrganizationComponent聚合到University OrganizationComponent聚合到
阅读全文
摘要:1个学校中有多个学院,1个学院中有多个系 传统方案解决学校院系展示问题 1) 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的 2) 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的管理的操作,
阅读全文
摘要:Java的IO结构,FilterInputStream就是一个装饰者 1. InputStream 是抽象类, 类似我们前面讲的 Drink 2. FileInputStream 是InputStream子类,类似我们前面的 DeCaf, LongBlack 3. FilterInputStream
阅读全文
摘要:简介 1) 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp) 2) 这里提到的动态的将新功能附加到对象和ocp原则 原理 1) 装饰者模式就像打包一个快递 主体:比如:陶瓷、衣服 (Component) // 被装饰者 包装:比如:报
阅读全文
摘要:星巴克咖啡订单项目 1) 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 2) 调料:Milk、Soy(豆浆)、Chocolate 3) 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便 4) 使用OO
阅读全文
摘要:Jdbc的 Driver 接口,如果从桥接模式来看,Driver 就是一个接口,下面可以有 MySQL 的 Driver,Oracle 的Driver,这些就可以当做实现接口类 桥接模式的注意事项和细节 1) 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这
阅读全文
摘要:手机操作问题 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等) 如果用代码实现,需要写很多重复的类 1) 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。 2) 违反了单一职责
阅读全文
摘要:查看DispatcherServlet public class DispatcherServlet extends FrameworkServlet { // 通过HandlerMapping来映射Controller mappedHandler = getHandler(processedReq
阅读全文
摘要:简介 1) 一些书籍称为:适配器模式(Default Adapter Pattern)或缺省适配器模式。 2) 当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求 3) 适用于一个接口
阅读全文
摘要:简介 1) 基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。 即:持有 src类,实现 dst 类接口,完成src->dst的适配 2) 根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。 3) 对象适配器模式是适
阅读全文
摘要:简介 Adapter类,通过继承 src类,实现 dst 类接口,完成src->dst的适配 案例分析 充电器本身相当于Adapter,220V交流电相当于src (即被适配者),我们的目dst(即 目标)是5V直流电 代码实现 package com.atguigu.adapter.classad
阅读全文
摘要:简介 继承了⽗元素的某些属性 优点:继承可以简化代码,便于维护 默认设置继承的属性 ⽂字属性,⽂本缩进、对⻬、⾏⾼ 代码案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" co
阅读全文
摘要:CSS全称:层叠样式表(Cascading Style Sheets) 层叠是⼀个基本特征 ⼀个css属性被多次声明的时候,会根据优先级或者声明顺序来计算采⽤哪个样式 优先级是怎么计算 通配符选择器 1: * 标签选择器 2:div/span/p/li 类选择器 3:class id选择器 6:id
阅读全文
摘要:盒⼦的位置和⼤⼩ 尺⼨ 宽度 width: ⻓度|百分⽐|auto ⾼度 height 边界 margin padding 上右下左|上下左右 布局 浮动:float 定位:position 弹性布局:flex 盒⼦内容超出部分:overflow:hidden | scroll | auto 外观,
阅读全文
摘要:盒⼦的内边距(padding) padding-left:10px //左边距10px padding-top:10px //上边距10px padding-right:10px //右边距10px padding-bottom:10px //下边距10%,相对于⽗级元素的width padding
阅读全文
摘要:伪类选择器:不改变任何DOM内容。只是插⼊了⼀些修饰类的元素 :first-child {} //第⼀项 :last-child {} //最后⼀项 :nth-child(n) {} //第n项 :nth-child(2n+1){} //奇数项 :nth-child(2n) {} //偶数项 :no
阅读全文
摘要:元素(标签)选择器 组合选择器: h1,p{color:red} 结合标签选择器 h1.xiaodi {color:red;} 多类选择器 class="xiaodi background" 链接多个类选择器 .xiaodi.background{color:red; background-colo
阅读全文
摘要:写法 内部样式表 写在元素的style标签⾥⾯的 内联样式表 写在styles属性⾥⾯的 外部样式表 link标签将css资源引⼊ 外部样式表优点 解决⻚⾯当中样式重复的问题 代码分离,利于代码维护和阅读 浏览器会缓存起来,提⾼⻚⾯响应速度 代码案例 <!DOCTYPE html> <html la
阅读全文
摘要:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document<
阅读全文
摘要:简介 1) 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper) 2) 适配器模式属于结构型模式 3) 主要分为三类:类适配器模式、对象适配器模式、接口适配器
阅读全文
摘要:编写测试类 package com.atguigu.jdk; public class Builder { public static void main(String[] args) { // TODO Auto-generated method stub StringBuilder string
阅读全文
摘要:代码实现 package com.atguigu.builder.improve; //产品->Product public class House { private String baise; private String wall; private String roofed; public
阅读全文
摘要:简介 1) 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 2) 建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以
阅读全文
摘要:盖房项目需求 1) 需要建房子:这一过程为打桩、砌墙、封顶 2) 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不相同 代码实现 package com.atguigu.builder; public abstract class AbstractHouse { //打地
阅读全文
摘要:浅拷贝介绍 1) 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。 2) 对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。 因为实
阅读全文
摘要:创建1个spring项目 package com.atguigu.spring.bean; public class Monster { private Integer id = 10 ; private String nickname = "牛魔王"; private String skill =
阅读全文
摘要:使用原型模式改进传统方式,让程序具有更高的效率和扩展性 代码实现 package com.atguigu.prototype.improve; public class Sheep implements Cloneable { private String name; private int age
阅读全文
摘要:简介 1) 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 2) 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节 3) 工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象
阅读全文
摘要:现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom羊 属性完全相同的10只羊 代码实现 package com.atguigu.prototype; public class Sheep { private String name; private int ag
阅读全文
摘要:编写案例代码 package com.atguigu.jdk; import java.util.Calendar; public class Factory { public static void main(String[] args) { // getInstance 是 Calendar 静
阅读全文
摘要:简介 1) 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类 2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。 3) 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。 4) 将工厂抽象成两层,AbsFactory(
阅读全文
摘要:需求 披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪pizza、北京的胡椒pizza 或者是伦敦的奶酪pizza、伦敦的胡椒pizza 思路1 使用简单工厂模式,创建不同的简单工厂类,比如BJPizzaSimpleFactory、LDPizzaSimpleFactory 等
阅读全文
摘要:简介 1) 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式 2) 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码) 3) 在软件开发中,当我们会用到大量的创建某种、某类
阅读全文
摘要:需求 披萨项目:要便于披萨种类的扩展,要便于维护 1) 披萨的种类很多(比如 GreekPizz、CheesePizz 等) 2) 披萨的制作有 prepare,bake, cut, box 3) 完成披萨店订购功能。 代码实现 package com.atguigu.factory.simplef
阅读全文
摘要:ctrl + n,搜索Runtime public class Runtime { private static final Runtime currentRuntime = new Runtime(); private static Version version; /** * Returns t
阅读全文
摘要:双重检查 package com.atguigu.singleton.type6; public class SingletonTest06 { public static void main(String[] args) { System.out.println("双重检查"); Singleto
阅读全文
摘要:懒汉式(线程不安全) package com.atguigu.singleton.type3; public class SingletonTest03 { public static void main(String[] args) { System.out.println("懒汉式1 , 线程不
阅读全文
摘要:饿汉式(静态常量) 1) 构造器私有化 (防止 new ) 2) 类的内部创建对象 3) 向外暴露一个静态的公共方法。getInstance 代码实现 package com.atguigu.singleton.type1; public class SingletonTest01 { public
阅读全文
摘要:div元素 div 元素是块级元素,它可⽤于组合其他 HTML 元素的容器。 div 元素没有特定的含义。除此之外,由于它属于块级元素,浏览器会在其前后显示折⾏ 如果与 CSS ⼀同使⽤,div 元素可⽤于对⼤的内容块设置样式属性。 div 元素的另⼀个常⻅的⽤途是⽂档布局 span元素 span
阅读全文
摘要:代码案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Docu
阅读全文
摘要:使⽤场景需要提交⼀些信息到服务端的时候(前后端联调过程中) 核⼼元素input (核⼼元素) label (提⾼交互体验的) select(下拉框) textarea(⽂本域) button(按钮) form(表单元素,提交每个表单项内容) 代码案例 <!DOCTYPE html> <html la
阅读全文
摘要:表格的基本结构 由⼀⾏或者多⾏的单元格数据组成 在HTML中表示方式 table:HTML 表格 tr:元素定义表格⾏ th:数据中的表头单元格 td:表示单元格 table元素⾥常⽤的属性 border(边框) cellspacing(规定单元格之间的空⽩) cellpadding(规定单元边沿与
阅读全文
摘要:常用属性 src 图⽚路径 alt 图⽚加载失败或加载时显示的⽂字 title 悬浮在图⽚上⾯显示的⽂字 图⽚的来源 本地图⽚:稳定 线上图⽚:图⽚容易丢失 Base64图⽚ 优点:⼩图⽚占⽤内存⼩,不请求服务器,降低服务器资源与访问 缺点:⼤图⽚增⼤了数据库服务器的压⼒ 点击图⽚跳转 通过嵌套a标
阅读全文
摘要:a标签⽤法 跳转:<a href="xxx">链接⽂本</a> 锚点:<a href="#xxx"></a> target属性 brank:打开新的浏览器标签 路径 根据资源的类型判断,⼀般站外资源⽤绝对路径,站内资源⽤相对路径 绝对路径 https://xdclass.net 相对路径 ./ 代表
阅读全文
摘要:1) 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 2) 设计模式的本质提高 软件的维护性,通用性和扩
阅读全文
摘要:依赖关系(Dependence) 只要是在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编绎都通过不了 1) 类中用到了对方 2) 如果是类的成员属性 3) 如果是方法的返回类型 4) 是方法接收的参数类型 5) 方法中使用到 代码案例 public class PersonDao{}
阅读全文
摘要:简介 1) UML——Unified modeling language UML (统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果 2) UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关
阅读全文
摘要:简介 原则是尽量使用合成/聚合的方式,而不是使用继承 将A类的对象实例传给B类的方法 使用set方法将A类的实例传给B类 在B类中new一个A类的实例 设计原则核心思想 1) 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 2) 针对接口编程,而不是针对实现编程。
阅读全文
摘要:简介 1) 一个对象应该对其他对象保持最少的了解 2) 类与类关系越密切,耦合度越大 3) 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对
阅读全文
摘要:简介 1) 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则 2) 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。 3) 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有
阅读全文
摘要:OO中的继承性 1) 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。 2) 继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程
阅读全文
摘要:简介 1) 高层模块不应该依赖低层模块,二者都应该依赖其抽象 2) 抽象不应该依赖细节,细节应该依赖抽象 3) 依赖倒转(倒置)的中心思想是面向接口编程 4) 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java
阅读全文
摘要:简介 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上 案例1 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类D,如果接口Interface1对于类A和类C来说不是最小接口,那么类B和类D必须去实现他们不需要的方法。 代码案例 pack
阅读全文
摘要:简介 对类来说的,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。 当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2 注意事项和细节 1) 降低类的复杂度,一个类只负责一项职责。 2) 提高类的可读性,可维护性 3) 降低变更引起的风险 4
阅读全文
摘要:2-1 # 案例1 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <h1>静夜思</h1> <h2>李白</h2> <p>床前明月光</p> <p>疑是地上霜</p> <p>举头望明月</p> <p>低头思故乡
阅读全文
摘要:简介 软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人 在1990年代从建筑设计领域引入到计算机科学的 设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护
阅读全文
摘要:发送post请求,并使用Authorization Basic + application/json @GetMapping("/test4") @ResponseBody public String test4() throws IOException { String url ="http://
阅读全文
摘要:案例1 public class TestLambda1 { //原来的匿名内部类 @Test public void test1(){ Comparator<Integer> com = new Comparator<Integer>(){ @Override public int compare
阅读全文
摘要:错误1 # 错误信息 C:\Users\ychen>ssh -p 22 root@xxx.xxx.xxx.xxx @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICA
阅读全文
摘要:参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
阅读全文
摘要:旧的写法:没有break,则匹配的case后⾯会⼀直输出, value类型 可以是 byte、short、int 、char、String 类型 # 案例1 public void testOldSwitch1(){ int i = 1; switch(i){ case 0: System.out.
阅读全文
摘要:旧的写法:在java代码⾥⾯编写多⾏源码带有特殊字符则需要转义,如HTML,sql等 # 案例1 public class Main{ public static void main(String [] ags){ String html = "<html>\n" + " <body>\n" + "
阅读全文
摘要:OpenJDK和OracleJDK版本区别 OpenJDK是JDK的开放源码版本,以GPL协议的形式发布(General Public License) Oracle JDK采⽤了商业实现 LTS Long Term Support ⻓期⽀持的版本,如JDK8、JDK11都是属于LTS JDK9 和
阅读全文
摘要:编写Main.java public class Main{ public static void main(String [] ags){ String text = "xdclass.net "; //String 类新增的repeat(int num) 方法,用于字符串循环输出 System.
阅读全文
摘要:HTTP2协议的强制要求https,如果⽬标URI是HTTP的,则⽆法使⽤HTTP 2协议 测试 -> https://http2.akamai.com/demo 判断⽹站是否是http2协议 浏览器 -> network⾯板 -> 右键名称 -> 选择protocol 浏览器 -> network
阅读全文
摘要:发送post请求,json格式 public class Main { public static void main(String[] args) throws Exception { testPost(); } private static final String targetUrl1 = "
阅读全文
摘要:JDK11新增HttpClient,⽀持 HTT/1.1, HTTP/2 常⽤类和接⼝讲解 HttpClient.Builder HttpClient 构建⼯具类 HttpRequest.Builder HttpRequest 构建⼯具类 HttpRequest.BodyPublisher 将jav
阅读全文
摘要:Java是⼀种强类型, 许多流⾏的编程语⾔都已经⽀持局部变量类型推断,如js,Python,C++等 JDK10 可以使⽤var作为局部变量类型推断标识符 Local-Variable Type Inference(局部变量类型推断),顾名思义只能⽤做为局部变量 仅适⽤于局部变量,如 增强for循环
阅读全文
摘要:下载链接 直接解压,配置环境变量 JAVA_HOME = C:\Program Files\jdk-11.0.16 CLASSPATH = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; Path = %JAVA_HOME%\bin Path
阅读全文
摘要:takeWhile 有序的集合中使用 从 Stream 中获取⼀部分数据, 返回从头开始的尽可能多的元素, 直到遇到第⼀个false结果, 如果第⼀个值不满⾜断⾔条件,将返回⼀个空的 Stream dropWhile 有序集合中使用 从 Stream 中获取⼀部分数据, 遇到第⼀个false结果,则
阅读全文
摘要:jdk9之前创建只读集合 public class Main { public static void main(String[] args)throws Exception { List<String> list = new ArrayList<>(); list.add("SpringBoot课
阅读全文
摘要:增强try-with-resource 在JDK9中,改进了try-with-resources语句,在try外进⾏初始化,在括号内引⽤,即可实现资源⾃动关闭,多个变量则⽤分号进⾏分割 不需要声明资源 out 就可以使⽤它,并得到相同的结果 代码案例 public class Main { publ
阅读全文
摘要:代码案例 public interface OrderPay { void pay(); default void defaultPay(){ privateMethod(); } //接口的私有方法可以在Jdk9中使用 private void privateMethod(){ System.ou
阅读全文
摘要:从java9开始,jdk引⼊了交互式 REPL(Read-Eval-Print-Loop,读取-求值-输出-循环) 官⽅⽂档 进入jshell # 打开cmd jshell 帮助命令 jshell> /help | 键入 Java 语言表达式, 语句或声明。 | 或者键入以下命令之一: | /lis
阅读全文
摘要:jdk7之前的操作 public static void main(String[] args) throws IOException { String path = "/Users/jack/Desktop/t.txt"; test(path); } private static void tes
阅读全文
摘要:JVM 种类有很多,⽐如 Oralce-Sun Hotspot, Oralce JRockit, IBM J9, Taobao JVM,Hotspot有MetaSpace,JRockit以及J9是没有这个区域 JVM内存知识 在JDK8之前的HotSpot JVM,有个区域叫做“永久代(perman
阅读全文
摘要:需求描述:电商订单数据处理,根据下⾯的list1和list2 共11个订单 统计出同时被两个⼈购买的商品列表(交集) 统计出两个⼈购买商品的差集 统计出全部被购买商品的去重并集 统计两个⼈的分别购买订单的平均价格 统计两个⼈的分别购买订单的总价格 代码案例 public class VideoOrd
阅读全文
摘要:作⽤:可以⼀个⽅法把统计相关的基本上都完成 分类 summarizingInt summarizingLong summarizingDouble 案例 # 统计学⽣的各个年龄信息 public class Main { public static void main(String[] args)
阅读全文
摘要:partitioningBy分组 案例 # 根据list⾥⾯进⾏分组,字符串⻓度⼤于4的为⼀组,其他为另外⼀组 public class Main { public static void main(String[] args) throws Exception { List<String> lis
阅读全文
摘要:collect()⽅法的作⽤ ⼀个终端操作, ⽤于对流中的数据进⾏归集操作,collect⽅法接受的参数是⼀个Collector 有两个重载⽅法,在Stream接⼝⾥⾯ //重载⽅法⼀ <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super
阅读全文
摘要:并⾏流parallelStream 集合做重复的操作,如果使⽤串⾏执⾏会相当耗时,因此⼀般会采⽤多线程来加快, Java8的paralleStream⽤fork/join框架提供了并发执⾏能⼒ 底层原理 线程池(ForkJoinPool)维护⼀个线程队列 可以分割任务,将⽗任务拆分成⼦任务,完全贴合
阅读全文
摘要:简介 Stream 中⽂称为 “流”,通过将集合转换为这么⼀种叫做 “流”的元素队列,通过声明性⽅式,能够对集合中的每个元素进⾏⼀系列并⾏或串⾏的流⽔线操作 元素是特定类型的对象,所以元素集合看作⼀种流, 流在管道中传输, 且可以在管道的节点上进⾏处理, ⽐如 排序,聚合,过滤等操作 数据元素便是原
阅读全文
摘要:简介 ⽅法引⽤是⼀种更简洁易懂的lambda表达式,操作符是双冒号::,⽤来直接访问类或者实例 已经存在的⽅法或构造⽅法 通过⽅法引⽤,可以将⽅法的引⽤赋值给⼀个变量 语法:左边是容器(可以是类名,实例名),中间是" :: ",右边是相应的⽅法名 静态⽅法,则是ClassName::methodNa
阅读全文
摘要:Function接⼝ Lambda表达式必须先定义接⼝,创建相关⽅法之后才可使⽤,这样做⼗分不便,其实java8已经内置了许多接⼝, 例如下⾯四个功能型接⼝,所以⼀般很少会由⽤户去定义新的函数式接⼝ Java8的最⼤特性就是函数式接⼝,所有标注了@FunctionalInterface注解的接⼝都是
阅读全文
摘要:定义⼀个函数式接⼝ 需要标注此接⼝ @FunctionalInterface,否则万⼀团队成员在接⼝上加了其他⽅法则容易出故障 编写⼀个⽅法,输⼊需要操做的数据和接⼝ 在调⽤⽅法时传⼊数据 和 lambda 表达式,⽤来操作数据 案例:定义⼀个可以使⽤加减乘除的接⼝ # 自定义接口 @Functio
阅读全文
摘要:jdk8之前创建线程 public class Main { public static void main(String[] args) throws Exception { new Thread(new Runnable() { @Override public void run() { Sys
阅读全文
摘要:作用 主要解决的问题是空指针异常(NullPointerException) 本质是⼀个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空 of() # null 值作为参数传递进去,则会抛异常 import java.util.Optional; public class
阅读全文
摘要:JDK8之前:SimpleDateFormat来进⾏格式化,但SimpleDateFormat并不是线程安全的 JDK8之后:引⼊线程安全的⽇期与时间DateTimeFormatter 案例 import java.time.Duration; import java.time.LocalDateT
阅读全文
摘要:核心类 LocalDate:不包含具体时间的⽇期。 LocalTime:不含⽇期的时间。 LocalDateTime:包含了⽇期及时间。 LocalDate 常⽤API //getYear() int 获取当前⽇期的年份 //getMonth() Month 获取当前⽇期的⽉份对象 //getMon
阅读全文
摘要:jdk8之前 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class Main { public static void main(String[] args) throws Exception { BAS
阅读全文
摘要:IDE历史版本下载 安装参考 双击安装 插件 jetbrains-agent One Dark Theme 设置字体 控制台字体
阅读全文
摘要:IDE历史版本下载 插件 active-agent GitToolBox One Dark Theme 设置主题:下载 -> settings -> Plugins -> 点击齿轮图标 -> Install Plugin from Disk -> 选择下载的压缩包 设置侧边栏字体:settings
阅读全文
摘要:默认方法:接⼝⾥⾯定义⼀个默认⽅法,这个接⼝的实现类实现了这个接⼝之后,不⽤管这个default修饰的⽅法就可以直接调⽤,即接⼝⽅法的默认实现 静态方法:静态⽅法: 接⼝名.静态⽅法来访问接⼝中的静态⽅法 编写接口 public interface Animal { void run(); void
阅读全文
摘要:docker安装mqtt docker pull emqx/emqx:v4.0.5 docker run -tid --name emqx -p 1883:1883 -p 8083:8083 -p 8081:8081 -p 8883:8883 -p 8084:8084 -p 18083:18083
阅读全文
摘要:前端访问后端时,关闭后端接口,通过nginx转发 编写后端 # 控制层 @RestController @RequestMapping("/user") public class TestController { @GetMapping("/test") public String test(){
阅读全文
摘要:负载均衡 新建1个项目 第1次打包 # 控制层 @RestController public class TestController { @GetMapping("test1") public String test1(){ return "demo03 >9001"; } } # yml ser
阅读全文
摘要:反向代理 在服务器中部署后端项目,测试,可以获取到数据 配置nginx 这时访问80端口,就能访问到8080端口的数据 请求转发 不使用转发访问后端接口 配置nginx 使用转发
阅读全文
摘要:public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; // 动态认证 @Override protect
阅读全文
摘要:传入数组 @PostMapping("/delUsers") public JSONResult delUsers(@RequestParam List<String> userIds) { int i = userMapper.deleteBatchIds(userIds); return new
阅读全文
摘要:浏览器搜索并登录Apipost,点击左上角新建项目,填写项目名称,编写项目简介,设置可见性级别 本地Apipost同步后,点击左上角切换到新建的项目 使用fastmock模拟接口 点击查看详情 新建1个项目 新增接口 浏览器测试 点击右上角新建环境或修改默认环境 新建1个文件夹作为项目的子模块,指定
阅读全文
摘要:jdk 参考1 参考2 参考3 下载解压,双击安装 配置环境变量 Path = %JAVA_HOME%\bin 每次切换版本后,删除如下目录中的java.exe, javaw.exe, javaws.exe C:\Program Files (x86)\Common Files\Oracle\Jav
阅读全文
摘要:参考 将安装包上传到/usr/local目录 解压 tar -zxvf nexus-3.15.2-01-unix.tar.gz 设置环境变量 vim /etc/profile export MAVEN_HOME=/usr/local/nexus-3.15.2-01 export PATH=$PATH
阅读全文
摘要:- 安装 点击查看详情 ``` # 解压后,配置环境变量 MAVEN_HOME= C:\Program Files\apache-maven-3.6.3 Path= %MAVEN_HOME%\bin # 配置setting.xml # 指定本地仓库 C:\Users\ychen\.m2\reposi
阅读全文
摘要:安装 点击查看详情 # 下载到本地直接解压 # 配置环境变量 GRADLE_HOME = C:\Program Files\gradle-7.6 GRADLE_USER_HOME = C:\Users\ychen\.gradle PATH = %GRADLE_HOME%\bin # 打开cmd:gr
阅读全文
摘要:下载解压nexus 启动 nexus.exe /run nexus 浏览器访问 http://localhost:8081/ 构建1个gardle项目 gradle init build.gradle中配置如下 plugins { id 'java' id 'maven-publish' // 用于
阅读全文
摘要:简介 上传资源时,需要知道上传的指定仓库和用户名密码,且上传地址必须配置到项目里 下载资源时,需要知道资源的仓库地址和用户名密码,且下载地址可以配置到本地仓库,因为idea从本地仓库中拿资源 当前在nexus中新建了2个仓库:heima-release、heima-snapshots 打开maven
阅读全文
摘要:nexus下载 解压后cmd进入如下目录 # 启动 nexus.exe /run nexus # 浏览器访问 http://localhost:8081/ 私服简介 私服中需要有1个仓库来代理中央仓库 仓库组中有多个仓库,分别用来存放不同版本的依赖资源 仓库分类 登录,点击右上角 用户名为admin
阅读全文
摘要:多环境开发配置 多环境兼容 # 例如在父工程的pom中配置如下 <profiles> <!--定义具体的环境:生产环境--> <profile> <!--定义环境对应的唯一名称--> <id>pro_env</id> <!--定义环境中换用的属性值--> <properties> <jdbc.url
阅读全文
摘要:版本管理 工程版本 工程版本号约定 资源配置 在pom文件中统一管理配置 # 父工程 <properties> <spring.version>5.1.9.RELEASE</spring.version> <junit.version>4.12</junit.version> <jdbc.url>j
阅读全文
摘要:自定义属性 # 父工程 <properties> <spring.version>5.1.9.RELEASE</spring.version> <junit.version>4.12</junit.version> </properties> <dependencyManagement> <depe
阅读全文
摘要:子模块中引入相同的依赖,如果版本不同,可能会版本冲突 解决方案:父工程中统一管理依赖 # 父工程 <dependencyManagement> <!--具体的依赖--> <dependencies> <!--添加自己的工程模块依赖--> <dependency> <groupId>com.ithei
阅读全文
摘要:将1个项目拆分为多个模块 将实体类等拆分为1个模块,编译通过 将持久层拆分为1个模块,并导入pojo模块的资源;如果最后编译失败,则需要先将pojo模块install安装到本地仓库 将业务层拆分为1个模块,并导入dao模块的资源;如果最后编译失败,则需要先将dao模块install安装到本地仓库 将
阅读全文
摘要:项目构建生命周期 clean生命周期 default构建生命周期 site构建生命周期 插件简介 案例 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-pl
阅读全文
摘要:导入依赖 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> 将项目3作为依
阅读全文
摘要:参考1 参考2 参考3 导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.7.0</vers
阅读全文
摘要:简介 作用 安装 # 解压后,配置环境变量 MAVEN_HOME= C:\Program Files\apache-maven-3.6.3 Path= %MAVEN_HOME%\bin # 配置setting.xml # 指定本地仓库 <localRepository>D:\maven\reposi
阅读全文
摘要:简介 1) 使用自定义协议 + 编解码器 来解决 2) 关键就是要解决 服务器端每次读取数据长度的问题, 这个问题解决,就不会出现服务器多读或少读数据的问题,从而避免的TCP 粘包、拆包 实现效果 1) 要求客户端发送5个Message对象, 客户端每次发送一个Message对象 2) 服务器端每次
阅读全文
摘要:简介 1) TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据, 合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,
阅读全文
摘要:添加依赖 # maven项目 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.
阅读全文
摘要:解码器 ReplayingDecoder 1) public abstract class ReplayingDecoder<S> extends ByteToMessageDecoder 2) ReplayingDecoder扩展了ByteToMessageDecoder类,使用这个类,我们不必调
阅读全文
摘要:使用自定义的编码器和解码器来说明Netty的handler 调用机制,客户端发送long 到服务器 MyServer public class MyServer { public static void main(String[] args) throws Exception{ EventLoopG
阅读全文
摘要:1) netty的组件设计:Netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等 2) ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器。例如,实现ChannelInboundHandle
阅读全文
摘要:简介 1) 客户端可以随机发送Student PoJo/ Worker PoJo 对象到服务器 (通过 Protobuf 编码) 2) 服务端能接收Student PoJo/ Worker PoJo 对象(需要判断是哪种类型),并显示信息(通过 Protobuf 解码) 编写Student.prot
阅读全文
摘要:简介 1) 客户端可以发送一个Student PoJo 对象到服务器 (通过 Protobuf 编码) 2) 服务端能接收Student PoJo 对象,并显示信息(通过 Protobuf 解码) 导入依赖 # maven <dependency> <groupId>com.google.proto
阅读全文
摘要:简介 1) 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码 2) codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码
阅读全文
摘要:简介 1) Http协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接. 2) 实现基于webSocket的长连接的全双工的交互 3) 改变Http协议多次请求的约束,实现长连接了, 服务器可以发送消息给浏览器 4) 客户端浏览器和服务器端会相互感知,比如服务器关闭了,浏览器会感
阅读全文
摘要:1) 编写一个 Netty心跳检测机制案例, 当服务器超过3秒没有读时,就提示读空闲 2) 当服务器超过5秒没有写操作时,就提示写空闲 3) 实现当服务器超过7秒没有读或者写操作时,就提示读写空闲 编写服务端 public class MyServer { public static void ma
阅读全文
摘要:编写服务端 public class GroupChatServer { private int port; //监听端口 public GroupChatServer(int port) { this.port = port; } //编写run方法,处理客户端的请求 public void ru
阅读全文
摘要:Netty 提供一个专门用来操作缓冲区(即Netty的数据容器)的工具类 常用方法 //通过给定的数据和字符编码返回一个 ByteBuf 对象(类似于 NIO 中的 ByteBuffer 但有区别) public static ByteBuf copiedBuffer(CharSequence st
阅读全文
摘要:ChannelHandlerContext 1) 保存 Channel 相关的所有上下文信息,同时关联一个 ChannelHandler 对象 2) 即ChannelHandlerContext 中 包 含 一 个 具 体 的 事 件 处 理 器 ChannelHandler,同 时ChannelH
阅读全文
摘要:ChannelPipeline 1) ChannelPipeline 是一个 Handler 的集合,它负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于一个贯穿 Netty 的链。 (也可以这样理解:ChannelPipeline 是 保存 ChannelHandler
阅读全文
摘要:Bootstrap、ServerBootstrap 1) Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件, Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap
阅读全文
摘要:之前的案例如下 现在将ChannelInitializer提取出来 编写服务端 public class TestServer { public static void main(String[] args) throws Exception { EventLoopGroup bossGroup =
阅读全文
摘要:简介 1) 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者。 2) Netty 中的 I/O 操作是异步的,包括 Bind、Write、Connect 等操作会简单的返回一个ChannelFuture。 3)
阅读全文
摘要:任务队列中的 Task 有 3 种典型使用场景 1) 用户程序自定义的普通任务 [举例说明] 2) 用户自定义定时任务 3) 非当前 Reactor 线程调用 Channel 的各种方法 例如在推送系统的业务线程里面,根据用户的标识,找到对应的 Channel 引用,然后调用 Write 类方法向该
阅读全文
摘要:导入依赖 // https://mvnrepository.com/artifact/io.netty/netty-all implementation group: 'io.netty', name: 'netty-all', version: '4.1.51.Final' 服务端 public
阅读全文
摘要:简介 Netty 主要基于主从 Reactors 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor 1) BossGroup 线程维护Selector , 只关注Accecpt2) 当接收到Accept事件,获取到对应的 SocketChannel, 封装成 NI
阅读全文
摘要:根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现 1) 单 Reactor 单线程 2) 单 Reactor 多线程 3) 主从 Reactor 多线程 单 Reactor 单线程 1) Select 是前面 I/O 复用模型介绍的标准网络编程 API,可以实现应用程序通
阅读全文
摘要:原生NIO存在的问题 1) NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 2) 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor模
阅读全文
摘要:在 Java 程序中,常用的零拷贝有 mmap(内存映射射) 和 sendFile 传统io mmap优化 mmap 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据。 这样,在进行网络传输时,就可以减少内核空间到用户控件的拷贝次数 sendFile优化 Linux 2.1
阅读全文
摘要:简介 1) 编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2) 实现多人群聊 3) 服务器端:可以监测用户上线,离线,并实现消息转发功能 4) 客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到) 编写服务端
阅读全文
摘要:SelectionKey 1) SelectionKey,表示 Selector 和网络通道的注册关系, 共四种: int OP_ACCEPT:有新的网络连接可以 accept,值为 16 int OP_CONNECT:代表连接已经建立,值为 8 int OP_READ:代表读操作,值为 1 int
阅读全文
摘要:编写服务端 public class NIOServer { public static void main(String[] args) throws Exception{ //创建ServerSocketChannel -> ServerSocket ServerSocketChannel se
阅读全文
摘要:简介 1) Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个的客户端连接,就会使用到Selector(选择器) 2) Selector 能够检测多个注册的通道上是否有事件发生(注意:多个Channel以事件的方式可以注册到同一个Selector),如果有事件发生,便获取事件然
阅读全文
摘要:ByteBuffer 支持类型化的put 和 get, put 放入的是什么数据类型,get就应该使用相应的数据类型来取出,否则可能有 BufferUnderflowException 异常。 代码案例 public class NIOByteBufferPutGet { public static
阅读全文
摘要:简介 1) NIO的通道类似于流,但有些区别如下: • 通道可以同时进行读写,而流只能读或者只能写 • 通道可以实现异步读写数据 • 通道可以从缓冲读数据,也可以写数据到缓冲 2) BIO 中的 stream 是单向的,例如 FileInputStream 对象只能进行读取数据的操作,而 NIO 中
阅读全文
摘要:简介 缓冲区(Buffer):缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块, 缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Bu
阅读全文
摘要:简介 1) Java NIO 全称 java non-blocking IO,是指 JDK 提供的新API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞的 2) NIO 相关类都被放在 java.nio 包及子包下,并且对
阅读全文
摘要:简介 1) Java BIO 就是传统的java io 编程,其相关的类和接口在 java.io 2) BIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理, 如果这个连接不做任何事情会造成不必要的线程开销,可以通
阅读全文
摘要:简介 1) Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github上的独立项目。 2) Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。 3) Netty主要针对在TCP协议下,面向Clients端的高并发应用,或者Pe
阅读全文
摘要:项目结构 microservice-parent: 统一管理所有模块的 jar 包版本信息 microservice-bean: 统一管理所有模块的用到的 pojo 类 microservice-common:统一管理所有模块的用到的工具类、枚举类、异常处理、日志文件、统一返回结果信息 micros
阅读全文
摘要:参考 必须配合插件使用 配置环境 build.gradle中导入插件 plugins { id 'org.springframework.boot' version '2.3.7.RELEASE' //维护springboot版本号,不单独使用,和下面两个插件一起用 id 'io.spring.de
阅读全文
摘要:生命周期中的这些钩子函数都是由 gradle 自动回调完成的,利用这些钩子函数可以帮助我们实现一些我们想要的功能 # Gradle 初始化阶段: 1.在 settings.gradle 执行完后,会回调 Gradle 对象的 settingsEvaluated 方法 2.在构建所有工程 build.
阅读全文
摘要:将项目发布到服务器上给其他人使用 导入插件 plugins { id 'java' id 'maven-publish' // 用于发布 } 发布所需配置 publishing { publications { myLibrary(MavenPublication) { groupId = 'org
阅读全文
摘要:1. build.gradle 是一个 gradle 的构建脚本文件,支持 java、groovy 等语言。 2. 每个 project 都会有一个 build.gradle 文件,该文件是项目构建的入口,可配置版本、插件、依赖库等信息。 3. 每个 build 文件都有一个对应的 Project
阅读全文
摘要:插件的引用 apply plugin: '插件名' apply plugin: '插件id' 主要任务 可通过 gradle tasks 查看 工程目录结构 一些插件对工程目结构有约定,所以我们一般遵循它的约定结构来创建工程,这也是 Gradle 的“约定优于配置”原则。 例如 java 插件规定的
阅读全文
摘要:将buildSrc 目录复制一份,修改文件夹名,然后在 settings.gradle 文件中,使其作为1个子模块 在插件子模块的build.gradle中配置如下 # 添加插件 apply plugin: 'maven-publish' publishing { publications { my
阅读全文
摘要:自定义插件 -> 参考 interface GreetingPluginExtension { Property<String> getMessage() Property<String> getGreeter() } class GreetingPlugin implements Plugin<P
阅读全文
摘要:插件的作用 1、可以添加任务【task】到项目中,从而帮助完成测试、编译、打包等。 2、可以添加依赖配置到项目中。 3、可以向项目中拓展新的扩展属性、方法等。 4、可以对项目进行一些约定,如应用 Java 插件后,约定 src/main/java 目录是我们的源代码存在位置,编译时编译这个目录下的
阅读全文
摘要:方式1:gradle自己解决 dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5
阅读全文
摘要:编译时:如果 libC 的内容发生变化,由于使用的是 api 依赖,依赖会传递,所以 libC、libA、projectX 都要发生变化, 都需要重新编译,速度慢,运行时:libC、libA、projectX 中的 class 都要被加载。 编译时:如果 libD 的内容发生变化,由于使用的是 im
阅读全文
摘要:导入依赖案例 dependencies { //①.依赖当前项目下的某个模块[子工程] implementation project(':subject01') //②.直接依赖本地的某个jar文件 implementation files('libs/foo.jar', 'libs/bar.jar
阅读全文
摘要:本地文件 使用 Project.file(java.lang.Object)方法,通过指定文件的相对路径或绝对路径来对文件的操作,其中相对路径为相对当前project[根 project 或者子 project]的目录。 其实使用 Project.file(java.lang.Object)方法创建
阅读全文
摘要:任务执行顺序 1、dependsOn 强依赖方式 2、通过 Task 输入输出 3、通过 API 指定执行顺序 动态执行任务 在循环中注册同一类型的多个任务 # 注册4个同一类型的任务 4.times { counter -> tasks.register("task$counter") { doL
阅读全文
摘要:任务定义方式 通过 Project 中的 task()方法 task('A',{//任务名称,闭包都作为参数 println "taskA..." }) task('B'){//闭包作为最后一个参数可以直接从括号中拿出来 println "taskB..." } task C{//groovy语法支
阅读全文
摘要:任务执行语法:gradle [taskName...] [--option-name...] 常见任务 gradle build: 构建项目:编译、测试、打包等操作 gradle run :运行一个服务,需要 application 插件支持,并且指定了主启动类才能运行 gradle clean:
阅读全文
摘要:任务名可以使用单引号、双引号、不使用引号 参数方式依赖 task A { doLast { println "TaskA.." } } task 'B'{ doLast { println "TaskB.." } } //参数方式依赖: dependsOn后面用冒号 task 'C'(depends
阅读全文
摘要:# 执行任务 gradle -i 任务名 也可以定义到任务的外面 action使用 def map=new HashMap<String,Object>(); //action属性可以设置为闭包,设置task自身的行为 map.put("action",{println "taskD.."}) ta
阅读全文
摘要:Gradle 项目的生命周期分为三大阶段: Initialization -> Configuration -> Execution. 每个阶段都有自己的职责 Initialization 阶段主要目的是初始化构建, 它又分为两个子过程,一个是执行 Init Script,另一个是执行 Settin
阅读全文
摘要:简介 测试任务自动检测并执行测试源集中的所有单元测试。测试执行完成后会生成一个报告。支持 JUnit 和 TestNG 测试 默认测试目录及标准输出 Gradle 对于 Junit4.x 支持 dependencies { testImplementation group: 'junit' ,nam
阅读全文
摘要:方式1:将项目打成 war 包,部署到本地 tomcat 运行 方式2:使用 Gretty 插件中内置服务器方式部署项目 # 第一步:引入 Gretty 插件 plugins { id ‘war’ id 'org.gretty' version '2.2.0' } # 第二步:指定 maven 仓库
阅读全文
摘要:配置环境 添加插件 build.gradle中添加依赖 dependencies { implementation 'org.springframework:spring-beans:4.1.7.RELEASE' implementation 'org.springframework:spring-
阅读全文
摘要:配置环境 注意点 使得在 Terminal 中执行以 gradlew 开头命令和操作图形化的 IDEA 使用 Gradle 版本不一定是同一个版本 目前只能是在创建项目时重新设置本地 gradle,创建新项目需要重新去改 当我们在gradle.build文件添加依赖之后,这些依赖会在下载到GRADL
阅读全文
摘要:简介 功能强大,例如提供了动态类型转换、闭包和元编程(metaprogramming)支持 支持函数式编程,不需要 main 函数 默认导入常用的包 类不支持 default 作用域,且默认作用域为 public。 Groovy 中基本类型也是对象,可以直接调用对象的方法。 支持 DSL(Domai
阅读全文
摘要:简介 Gradle Wrapper 实际上就是对 Gradle 的一层包装,用于解决实际开发中可能会遇到的不同的项目需要不同版本的 Gradle 问题。例如:把自己的代码共享给其他人使用,可能出现如下情况: 1.对方电脑没有安装 gradle 2.对方电脑安装过 gradle,但是版本太旧了 wra
阅读全文
摘要:简介 Gradle 是一款Google 推出的基于 JVM、通用灵活的项目构建工具,支持 Maven,JCenter 多种第三方仓库; 支持传递性依赖管理、废弃了繁杂的xml 文件,转而使用简洁的、支持多种语言(例如:java、groovy 等)的 build 脚本文件 常见项目构建工具对比 查看与
阅读全文
摘要:SpringBoot启动过程 ● 创建 SpringApplication ○ 保存一些信息。 ○ 判定当前应用的类型。ClassUtils。Servlet ○ bootstrappers:初始启动引导器(List<Bootstrapper>):去spring.factories文件中找 org.s
阅读全文
摘要:新建1个项目,并在里面新建2个子模块 atguigu-hello-spring-boot-starter作为启动器 atguigu-hello-spring-boot-starter-autoconfigure用于自动配置包 启动器子模块中添加配置包 <dependencies> <dependen
阅读全文
摘要:常用外部配置源 Java属性文件、YAML文件、环境变量、命令行参数; 启动类中获取环境变量 @SpringBootApplication public class Boot09FeaturesProfileApplication { public static void main(String[]
阅读全文
摘要:配置文件激活 当我们的项目部署到线上之后,部署环境和开发环境不同,这时可写多个配置文件,在不同的环境指定不同的配置文件 例如用于默认,生产,测试环境的配置文件: application.properties application-prod.yaml application-test.yaml 我们
阅读全文