自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 认识drools

1、基础api:1.1 KnowledgeBuilderKnowledgeBuilder 在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用1.2 KnowledgeBaseKnowledgeBase 是 Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象,在一个KnowledgeBase 当中可以包含普通的规则(rule)、规则流(rule flow)、函数定义(func

2022-05-10 17:26:14 477

原创 socket的使用

1、网络架构模型主要有OSI参考模型和TCP/IP五层模型OSI(Open System Interconnect),即开放式系统互联。一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)。TCP/IP五层协议(物理层、数据链路层、网络层、传输层、应用层)各协议层的说明应用层应用层最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的

2022-04-22 17:39:34 1704

原创 研磨设计模式--生成器模式

抽象工厂模式的定义:生成器模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。demo:下面使用抽象工厂模式写一个简单的打印小程序ExportHeaderModel:描述输出到文件头到内容的对象ExportDataModel:描述输出数据的对象ExportFooterModel:描述输出到文件尾到内容的对象Builder:生成器接口Director:指导者,知道使用生成器的接口来构建输出的文件的对象TxtBuilder:txt生成器对象XmlBuilder

2022-02-17 22:24:00 147

原创 研磨设计模式--抽象工厂模式

抽象工厂模式的定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类demo:下面使用抽象工厂模式写一个简单的台式机装机的小程序CPUApi:cpu的接口MainboardApi:主板接口AMDCpu:amd cpuIntelCpu:intel cpuMSIMainboard:微星主板GAMMainboard:技嘉主板Schema1:组合1Schema2:组合2ComputerEngineer:装机工程师的工具类Client:客户端/** * cpu的接口 *

2022-02-10 21:28:53 321

原创 研磨设计模式--工厂方法模式

工厂方法模式的定义:定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使类的实例化延迟到其子类。demo:下面使用工厂模式写一个简单的数据不同方式导出的程序ExportFileAPi:导出对文件对象对接口ExportDB:导出到数据库ExportTxtFile:导出到txtExportOperate:实现导出数据对业务功能对象ExportDbFileOperate:实现创建导出数据库格式的对象ExportTxtFileOperate:实现创建导出文本文件格式的对象Client:客

2021-12-09 21:47:41 632

原创 研磨设计模式--单例模式

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。demo:下面使用单例模式写一个简单的读取配置文件的对象。AppConfig:读取应用配置文件test.properties:配置文件Client:服务端@Data@Builder@AllArgsConstructor@Slf4j@Componentpublic class AppConfig implements Serializable { // 饿汉 /** * 定义一个变量来存储

2021-12-02 20:42:23 99

原创 研磨设计模式--适配器模式

适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。demo:下面使用双向适配器写一个简单的支持db和文件的log记录功能。将要创建的类:LogModel:日志数据对象LogFileOperateApi:日志文件操作接口LogDbOperateApi:数据库操作日志LogFileOperateApiService:文件日志操作实现LogDbOperateService:数据库日志操作实现Client:服务端/*

2021-11-30 22:12:39 457

原创 研磨设计模式--外观模式

外观模式本质:封装交互,简化调用demo:下面使用外观模式写一个简单的代码生成器将要创建的类:ConfigModel:配置描述的数据modelConfigManager:配置管理Presentation:表现层的模块Business:逻辑层的代码Dao:数据层的模块Facade:组装模块Client:消费者@Datapublic class ConfigModel { /** * 是否需要生成表现成,默认是true */ private boole

2021-11-26 17:53:47 307

原创 研磨设计模式--简单工厂

简单工厂模式的定义:提供一个创建对象实例的功能,而无需关心其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。将要创建的类:Api:定义客户所需要的功能接口。Impl:具体实现Api的实现类。Impl2:具体实现Api的实现类。Factory:工厂,选择合适的实现类,来创建Api接口对象。Client:客户端,通过Factory来回去Api接口对象,然后面向Api接口编程。/** * 接口的定义,该接口可以通过简单工厂来创建 */public interface Api

2021-11-25 22:19:00 227

原创 sql优化

分享一些sql优化,希望对你有所帮助:1避免使用select *:在实际业务场景中,可能我们真正需要使用的只是一两列,查了很多数据,但是不用,白白浪费资源。且select*不会走覆盖索引,会出现大量的回表操作,从而导致sql性能降低。2使用union all 替代union:union是获取去重后结果,union all是获取所有数据,包含重复数据。但是如果特殊业务场景,不允许出现重复数据的时候,可以使用union。3批量操作避免循环请求数据库反例:for(Order order: list

2021-11-17 17:47:55 347

原创 security实现账密、手机号和微信三种方式登陆

:security实现多种方式登陆 spring security 的核心功能主要包括认证授权攻击防护其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。在说多种认证方式之前,咱们先简单过下单认证方式是如何配置的,也说下Spring Security的各个配置类的作用。1、UsernamePasswordAuthenticationFilte

2021-09-16 16:03:15 4493 4

原创 认识Nacos

Nacos是什么一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 关键特性:服务发现和服务健康监测Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如

2021-03-21 10:17:22 363 2

原创 认识ZooKeeper

Zookeeper定义Zookeeper是一个开源的分布式协调服务,Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。Zookeeper原理Zookeeper是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅,负载均衡,命名服务,分布式协调/通知,集群管理,Master选举,分布式锁和分布式队列等功能。Zookeeper应用场景Zookeeper一个最常用的使

2021-03-21 09:43:38 104

原创 重新认识Java--SpringBoot自动配置原理

SpringBoot项目里有一个配置文件叫application.yml或properties,然后还有一个启动类,这个启动类上有一个SpringBootApplication注解,这个注解是一个复合注解,它里面有一个@EnableAutoConfiguration注解,所以在启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.pactories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的

2021-03-21 09:36:03 67

原创 认识Dubbo

Dubbo简介简单介绍Dubbo让我们的同学们都有一个简单的认知Dubbo是什么Dubbo是阿里巴巴开源的基于 Java 的高性能RPC(一种远程调用) 分布式服务框架(SOA)。为什么要用Dubbo使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展。Dubbo 和 Spring Cloud 有什么区别通信方式不同Dubbo使用的是RPC通信,而Spring Cloud 使用的是HTTP RESTFul 方式。组成不一样dubbo的服

2021-03-21 09:35:39 95 1

原创 重新认识Java--SpringMvc

SpringMvc是什么:SpringMvc是spring对web框架的一个解决方案,提供了一个总的前端控制器,用来接收请求,然后定义一套路由策略及适配器,将结果使用视图解析技术生产视图展现给前端。SpringMvc工作流程:用户向服务端发送请求,请求会先到前端控制器DispatcherServlet,DispatcherServlet接收到请求会调用HandlerMapping处理器映射器,由此得知该请求由哪个controller来处理,DispatcherServlet调用HandlerAdapt

2021-03-20 13:46:35 52

原创 重新认识Java--Spring

Spring是什么:Spring是一个轻量级的控制反转和切面编程的容器框架。其中主要包括IOC和AOP。IOC:控制反转,依赖注入。控制反转,在没有IOC之前,我们使用对象的时候是通过new的方式去创建对象,控制权是在程序员手上,有了IOC之后,IOC容器会主动去创建对象,当使用的时候IOC会自动注入,控制器颠倒了,这就是控制反转。依赖注入是指在控制权反转之后,获取对象的过程由自己控制变成了IOC容器主动注入,在IOC容器在运行期间,动态的将某种依赖关系注入到对象中。实际上就是个Map,里面存放的是各

2021-03-20 13:44:45 89

原创 重新认识Java--重载与重写

重载发生在同一个类中,方法名必须相同,参数列表不同,方法返回值和访问修饰符可以不同。重写发生在父子类中,方法名和参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,如果父类方法被private修饰则子类不能重写。...

2021-03-20 13:38:19 64

原创 重新认识Java--==和equals

双等对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址。equals在object中默认也是采用双等比较,通常会重写。

2021-03-20 13:37:45 66

原创 重新认识Java--String、StringBuffer、StringBuilder

String是被final修饰的,不可变,每次操作都会产生新的String对象。StringBuffer和StringBuilder都是在原对象上修改的。StringBuffer是线程安全的,StringBuiler是线程不安全的。StringBuffer是被synchronize修饰的。...

2021-03-20 13:35:44 49

原创 重新认识Java--线程的生命周期

创建、就绪、执行、阻塞、死亡。创建就是创建一个新的线程对象。就绪是线程创建后,其他线程调用该对象的start方法,该状态的线程位于可运行线程池中,变得可运行,等待获取cpu的使用权。执行时就绪的线程获取了cpu使用权,执行程序代码。阻塞是指线程因为某些原因放弃cpu的使用权。死亡是指线程执行完了,生命周期结束了。...

2021-03-20 13:34:46 28

原创 重新认识Java--JVM

JVM:主要包括:类加载子系统,运行时数据区和字节码执行引擎。其中运行时数据区又包含:堆,栈,本地方法栈和程序计数器。其中堆存放 new出来的对象和数组,栈存在局部变量和方法。一个线程执行的时候会分配栈,栈里面会有该线程栈帧,这个栈帧就是当前线程方法的一些局部变量,当该方法调用了另外的其他方法,栈就会给这个其他方法的分配栈帧内存区域,以存放该方法的局部变量。用图来看内存模型:gc机制:当线程一直执行,对象先放Eden区,Eden区满了之后,触发manor gc,用可达性算法去找到非回收的对象,

2021-03-20 13:30:45 41

原创 重新认识Java--Java类加载器

JDK自带类加载器:Bootstrap ClassLoader、ExtClassLoader、AppClassLoader。Bootstrap ClassLoader是ExtClassLoader的父类加载器,加载lib下的jar和class文件。ExtClassLoader是AppClassLoader的父类加载器,加载lib/ext下的jar和class文件。AppClassLoader是自定义类加载器的父类,负责加载classpath下的类文件。可以继承ClassLoader实现自定义类加载器

2021-03-20 13:17:10 47

原创 重新认识Java--双亲委派

双亲委派主要有向上委托和向下加载。当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候

2021-03-20 13:15:33 46

原创 重新认识Java--HashMap、HashTable和ConcurrentHashMap

HashMap方法没有synchronized修饰,线程不安全,HashTable线程安全。HashMap允许key和value为null;HashTable不允许。

2021-03-20 13:12:47 73

原创 重新认识Java--ThreadPoolExecutor

学习目标:话不多说,先上源码 public ThreadPoolExecutor(int corePoolSize,//线程池的核心线程数量 int maximumPoolSize,//线程池的最大线程数 long keepAliveTime,//当线程数大于核心线程数时,多余的空闲线程存活的最长时间 TimeUnit uni

2021-01-17 10:53:55 43

原创 重新认识Java--Java并发(4) sleep() 与wait()

sleep() 方法没有释放锁,而 wait() 方法释放了锁两者都可以暂停线程的执行wait() 通常被用于线程间交互/通信,sleep() 通常被用于暂停执行。wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用 wait(long timeout) 超时后线程会自动苏醒。学习自:https://snailclimb.gitee.io/javaguide/#

2020-12-26 14:40:43 79

原创 重新认识Java--Java并发(3)死锁与如何避免死锁

死锁必须具备以下四个条件:互斥条件:该资源任意一个时刻只由一个线程占用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:线程已获得的资源在末使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。避免线程死锁:破坏互斥条件 :这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)。破坏请求与保持条件 :一次性申请所有的资源。破坏不剥夺条件 :占用部分资源的线程进

2020-12-26 14:38:48 60

原创 重新认识Java--Java并发(2)并发、并行和串行

并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行)并行:单位时间内,多个任务同时执行。

2020-12-26 14:36:27 167

原创 重新认识Java--Java并发(1)进程与线程

进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。线程:线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。总结:线程是进程划分成的更小的运行单位。线程和进程最大

2020-12-26 14:34:50 53

原创 重新认识Java--List、Set、Map

Java 集合中除了以 Map 结尾的类之外, 其他类都实现了 Collection 接口,以 Map 结尾的类都实现了 Map 接口List:List(对付顺序的好帮手): 存储的元素是有序的、可重复的Arraylist: Object[]数组Vector:Object[]数组LinkedList: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)Set:Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。HashSet(无序,唯一): 基于 HashMap

2020-12-26 14:05:52 79 1

原创 重新认识Java--BIO,NIO,AIO

BIO,NIO,AIO:IO的方式通常分为几种:  同步阻塞bai的BIO  同步非阻塞的NIO  异步非阻塞的AIO。  Java对BIO、NIO、AIO的支持:  Java BIO :同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。  Java NIO :同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮

2020-12-19 16:31:05 82 1

原创 重新认知Java--线程、进程

线程、程序、进程:进程:是程序的一次执行过程,是系统运行程序的基本单位程序:是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码线程:与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程进程生命周期:就绪:进程处于可执行的状态,只是CPU时间片还没有轮转到该进程,则该进程处于就绪状态。执行:进程处于可执行的状态,且CPU时间片轮转到该进程,该进程正在执行代码,则该进程处于运行状态。阻塞:进程不具备执行条件,正在等待某个事件的完成

2020-12-19 16:25:13 46 1

原创 重新认识Java--面向对象

面向对象:成员变量与局部变量:1、成员变量存在于堆内存,局部变量则存在于栈内存2、成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰3、成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数4、成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失5、成员变量如果没有被赋初值,则会自动以类型的默认值而赋值,而局部变量则不

2020-12-19 15:45:56 45 1

原创 重新认识Java--Java语言特点、JVM、JDK与JRE

Java语言特点:简单性面向对象(封装、继承、多态)安全性稳定性高性能多线程分布性JVM:JVM(Java Virtual Machine)是一个Java虚拟机,是运行 Java 字节码的虚拟机。Java字节码又是什么呢?那么我们的Java代码又是如何让计算机去运行的呢?记得大学第一节Java课,我们写的第一个Java类-----HelloWord.java。我们在控制台打出javac HelloWord.java,我们发现多了一个HelloWord.class文件,这个文件就是字节码文件

2020-12-19 14:08:38 87 1

原创 重新认识Java

重新认识Java作为已经工作两年的Java程序员,对Java的相关应用已经有了自己的认识。从今天起,我想从头看起,重新认识Java,一方面可以温故而知新,另一方面想看看是否会对Java产生新的认识。...

2020-12-19 12:00:14 57 1

空空如也

空空如也

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

TA关注的人

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