设计模式----创建型模式之简单工厂设计模式
设计模式—-创建型模式之简单工厂设计模式1.1. 模式动机考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。
1.2. 模式定义简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
1.3. 模式结构简单工厂模式包含如下角色:
Factory:工厂角色
工厂角色负责实现创建所有实例的内部逻辑
Product:抽象产品角色
抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
Con ...
restTemplate
RestTemplate
简介
RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式,统一了RESTFul的标准,封装了http连接,我们只需要传入url及其返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更为优雅的调用RESTFul服务的方式。
在Spring应用程序中访问第三方REST服务与使用Spring RestTemplate类有关。RestTemplate类的设计原则与许多其他Spring的模板类(例如JdbcTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。
RestTemplate默认依赖JDK提供了http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如Apache HttpCompoent、Netty或OKHttp等其他Http libaray。
考虑到了RestTemplate类是为了调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者时 ...
HttpClient
Apache HttpClient简介
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。
使用HttpClient、可以灵活地发送HTTP请求,并且Apache HttpClient提供了很多自定义的请求内容的API(包括连接超时时间设置等)。方便了开发人员测试接口(基于HTTP协议的),既提高了开发效率,也方便了提高代码的健壮性。(后续的RestTemplate的底层也是HttpClient)因此熟悉掌握HttpClient是很重要的必修内容,掌握了HttpClient后,对于HTTP的协议的了解也会更加深刻。
Apache HttpClient特性
基于标准,纯净的Java语言。实现了HTTP1.0和HTTP1.1
以可扩展的面向对象的结构实现 ...
事务的嵌套
事务的嵌套什么是嵌套事务? 嵌套是子事务在父事务中执行,子事务是父事务的一部分,在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务,这个子事务的执行也算是父事务的一部分,然后子事务执行结束,父事务继续执行。
可以通过下述的问答进一步去熟悉嵌套事务?
如果子事务回滚,会发生什么? 父事务会回滚到进入子事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。
如果父事务回滚,会发生什么? 父事务回滚,子事务也会跟着回滚!为什么呢,因为父事务结束之前,子事务是不会提交的,我们说子事务是父事务的一部分,正是这个道理。
事务的提交,是什么情况? 父事务先提交,然后子事务提交,还是子事务先提交,父事务再提交?答案是第二种情况,还是那句话,子事务是父事务的一部分,由父事务统一提交。
原文链接:https://blog.csdn.net/javashareauthor/article/details/82842177
Annotation
Annotation简介 Annotation(注解)是JDK5开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类,方法或者变量,在框架中大量使用(如 Spring、Mybatis等)
注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。
下面是我简单写的一个自定义注解
@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface Test { public int id() default -1; public String msg() default "Hi";}
通过对上述文件的字节码(.class)的反编译(javap - p xxx.class)可以得到@interface其实就是一个继承了Annotation的一个接口
javap -p Test.class
public interface ...
RESTful API
RESTful API正式学习RESTful API之前,我们需要把什么是API搞懂.
什么是API?API(Application Programming Interface) 翻译过来是应用程序编程接口的意思。
相信大家对于API这个此已经不陌生了, 比如”我调用了某某的API”等 又比如我们在进行后端开发的时候,主要的工作就是为前端或者其他后端服务提供 API 比如查询用户数据的 API.
API不仅仅代表了后端系统暴露出的接口, 像框架中提供的方法也属于是API的范畴.
例如:
你写的程序需要由支付功能,需要微信支付,就需要去调用微信提供支付的相关API
使用JDK开发Java程序, 需要获取当前系统时间,需要使用JDK提供的Date相关的API
….
API可以理解为程序与程序之间通信的桥梁, 其本质就是一个函数或者一个方法(函数和方法还是不同的)而已. 另外, API的使用也不是没有章法了, 它的相关规则或是使用协议由API的提供者制订.
什么是RESTful API?RESTful API 经常也被叫做 REST API,它是基于 REST 构建的 A ...
雪花算法
雪花算法简介:
雪花算法是Twitter开源的分布式ID生成算法 Github仓库地址
雪花算法主要用于分布式系统中,数据库的ID生成
在自然界中并不存在两片完全一样的雪花,每一片雪花都拥有自己漂亮独特的形状,独一无二.雪花算法也表示生成的分布式id如雪花般独一无二.
分布式ID随着业务被使用的人越来越多, 单机的数据库已经很难保证业务能够流畅稳定的运行了, 这是我们需要对数据库进行分库分表存储, 使用分布式集群, 但是这样每个表的数据怎么保证ID唯一呢? 如果使用主键递增肯定发生ID不唯一的冲突情况, 所以急需一种可以生成全局唯一ID的算法来解决这个囧境.
分布式ID需要满足的要求全局唯一:
这是最基本的要求
高性能:
不能为了全局唯一就去生成一大长串,肯定需要考虑性能,既要考虑生成的效率,又要考虑查询的效率(即存储的效率).
高可用:
生成分布式ID的服务要保证可用性高,无限接近100%
方便易用:
拿来即用,使用方便,快速接入!
安全:
分布式ID中不应含有敏感信息,否则了解算法的不怀好意之人解码可能会获取到这些敏感信息.
有序递增:
如果要把 ID 存放 ...
Redis
Redis介绍Redis是一种NOSQL型数据库,即一种非关系型数据库
我们常见的Mysql是一种SQL型数据库,是一种关系型数据库
SQL型数据库结构化 Structured
下面这张图,我们创建这张表之初就对表的字段做了指定与规定,比如下面这张表只有三个字段,每个字段我们都加上了不同的约束,并且规定了字段的类型和长度,就使得这张表具有很强的结构体系,后续插入修改的数据都必须遵守表的结构
关联的(Relational)
比如一个表中的某个字段被其他表中的字段所关联(外键) 这样表中的数据就会自动维护,当删除某个字段时,就会提示无法删除的情况,除此之外,关联的优点还有可以节省存储空间,不需要记录数据的全部信息,只需要记录一个数据的主键即可.
SQL查询
优点:语法固定
缺点:需要去学习大量的语法
事务
满足ACID(原子性, 一致性, 隔离性, 持久性) 对关系性要求较高的业务采用SQL
存储方式
磁盘
扩展性
垂直(即一主多从 数据存储的大小没有改变 只是增强了数据的存储效率(读写分离))
使用场景
数据结构稳定
相关业务对数据安全性,一致性较高.(ACID ...
Git分布式版本控制工具
Git分布式版本控制工具
命令如下:
clone(克隆): 从远程仓库中克隆代码到本地仓库
checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
add(添加): 在提交前先将代码提交到暂存区
commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于fetch+merge
push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
备注:
Git GUI:Git提供的图形界面工具
Git Bash:Git提供的命令行工具
当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息
git config --global user.name "itcast"git config --global user.email "hello@qq.com" ...
ThreadLocal
ThreadLocal
摘自《Java并发编程之美》再结合一些自己的理解
简介多线程访问同一个共享变量时特别容易出现并发问题,特别时在多个线程需要对同一个共享变量进行写入时。为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步,如图。
同步的措施一般是加锁,这就需要使用者对锁有一定的了解,这显然加重了使用者的负担。那么有没有一种方式可以做到,当创建一个变量后,每个线程对其访问的时候访问的是自己线程的变量呢?其实 ThreadLocal 就可以做这件事,虽然 ThreadLocal 并不是为了解决这个问题而出现的。
ThreadLocal 是 JDK 包提供的,他提供了线程本地变量,也就是如果你创建了一个 ThreadLocal 变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个 ThreadLocal 变量后,每个线程都会复制一个变量到自己的本地内存(也就是如果你创建了一个 ThreadLocal 变量,那么访问这个变量的每个线程都会有该变量的一个副本),如图。
使用示例本例开启了两个线程,在每个线程内部都设置了本地变量的值,然后调用 prin ...