架构设计
1、架构设计的目的软件项目中的架构设计是想要解决一个问题:让普通程序员也能参与其中,一起实现复杂系统,而不必依赖于很多精英。
架构设计,就是通过组织人员和技术,低成本满足需求以及需求的变化,保障软件稳定高效运行。
1.1、什么是复杂的软件项目复杂的软件项目通常有两个特点:
需求不确定技术复杂
技术的复杂性主要体现在四个方面:
需求让技术变复杂:软件要能不断响应新的需求
人员让技术变复杂:团队成员水平不一,擅长的技术方向也不一样
技术本身复杂:技术本身的使用门槛较高
保证软件稳定运行是复杂的:运行时的不确定性
1.2、架构设计如何解决“复杂”因为技术的复杂性,会导致软件开发变得很复杂,开发成本高。而架构设计恰恰可以在这些方面很好地解决技术复杂的问题。 主要从四
个方面来:
架构设计可以降低满足需求和需求变化的开发成本:通过对系统抽象和分解,把复杂系统拆分成若干简单的;对需求的变化,已经有一些
成熟的架构实践。架构可以帮助组织人员一起高效协作:通过抽象再拆分,可以把复杂的系统拆分成开发人员可以各自独立完成的模块。
架构设计可以帮助组织好各种技术:如分层架构架构设计可以保障服务稳定 ...
需求分析
1、对需求的基本认识1.1、什么是需求这个不是哲学问题啦,在工程中,需求按提出者分为两种:
用户需求:由用户提出。原始的用户需求通常是不能直接做成产品的,需要对其进行分析提炼,最终形成产品需求。
产品需求:产品经理针对用户需求提出的解决方案。
1.2、需求分析内容需求分析不是一个动作,而是一个过程,需要经历三个步骤:
挖掘真实需求提出解决方案:直到目标用户,其使用场景和想要解决的问题,就可以结合产品定位,提出相应的解决方案。
筛选和验证方案:对方案进行筛选,去掉不合适的方案,选定方案后,需要对方案进行验证,确保能解决用户需求。
挖掘用户的真实需求,可以从三个角度入手:
目标用户使用场景要解决的问题:用户背后想要解决的问题是什么
1.3、怎么做需求分析软件项目的需求从来不是单一的,是一系列需求,需求分析的整个过程是迭代进行的:
收集需求:对用户需求进行收集整理
分析需求:对需求进行分析,挖掘用户真实需求
需求评估:筛选过滤掉不可行的需求
需求设计:针对用户需求提出解决方案,设计成产品方案验证需求:验证方案是否可行
收集需求 收集用户需求有很多方法,可以参考:
头脑风暴:头脑风暴会议
用户 ...
项目规划
项目规划
项目开始之前有很多准备工作需要进行,可行性研究、项目计划、风险管控、流程规范的制定,选择合适的工具对项目整体进行管控。除此之外,还要树立正确的认知,避免感性奔走。
1、可行性研究可行性研究讲的是如何科学地论证项目的可行性,以及项目是不是值得做。如何科学论证是方式方法,是否值得做则是对投入回报比进行评估。 宝玉老师举了几个例子来说明可行性研究的必要性,以及在软件行业中大家对可行性研究的重视程度不高。 在过去的工作经历中,我是被要求写过可行性研究报告的,当时可能大家也只是觉得这是立项的一个必要文档,内容是其次的。
1.1、如何做好可行性研究
当你决定要做可行性研究的时候,你就已经成功了一半了,怎么做反而是相对简单的部分!
忽略可行性研究报告繁琐的引言、背景、定义,从核心的地方开始,如何进行通常从这三个方面进行:
经济可行性:从成本和收益角度分析,看投入产出比。不仅分析短期利益,还要分析长期利益。
技术可行性:技术上是否可以实现,不能解决的问题能否规避。
社会可行性:法律、道德、社会影响等因素的考量。
光列出这三点还是很抽象的,具体分析的时候老师给了个示例,这里就 ...
理解软件工程
1、什么是软件工程1.1、定义最开始:为研究和克服软件危机而生; 官方定义:讲系统化、规范的、可度量的方法用于软件的开发、运行和维护的过程。 抓住定义的本质:用工程化方法去规范软件开发,让项目可以按时完成,成本可控、质量有保障。
想起来在读李智慧老师的《从0开始学大数据》专栏的时候,有一段话印象深刻
不管是学习某门技术,还是讨论某个事情,最好的方式一定不是一头扎到具体的细节里,而是应该从时空的角度先了解它的来龙去脉,以及它为什么会演进成为现在的状态。当你深刻理解了这些前因后果之后,再去看现状,就会明朗很多,也能更直接地看到现状背后的本质。
1.2、演化史开发软件本质上就像是盖房子一样,是从无到有的创造过程。 工程化的方式,就是你分步骤(过程),采用科学的方法,借助工具来做产品。 于是,参考建筑工程,软件开发过程也被分成了几个阶段:需求定义与分析、设计、实现、测试、交付和维护。
所以读到的重点就是,软件工程的过程划分是参考建筑工程的,所以嘛,对于需求分析就叫需求分析。
1.3、软件工程的核心
一句话总结:软件工程 = 工具 + 方法 + 过程
刚开始看的时候我也只是象征性 ...
MyBatis设计思维
MyBatis 自身亮点结合工作实践来讲,MyBatis 所具备的亮点可总结为如下三个方面。
第一,MyBatis 本身就是一款设计非常精良、架构设计非常清晰的持久层框架,并且 MyBatis 中还使用到了很多经典的设计模式,例如,工厂方法模式、适配器模式、装饰器模式、代理模式等。 在阅读 MyBatis 代码的时候,你也许会惊奇地发现:原来大师设计出来的代码真的是一种艺术。所以,从这个层面来讲,深入研究 MyBatis 原理,甚至阅读它的源码,不仅可以帮助你快速解决工作中遇到的 MyBatis 相关问题,还可以提高你的设计思维。
第二,MyBatis 提供了很多扩展点,例如,MyBatis 的插件机制、对第三方日志框架和第三方数据源的兼容等。 正由于这种可扩展的能力,让 MyBatis 的生命力非常旺盛,这也是很多 Java 开发人员将 MyBatis 作为自己首选 Java 持久化框架的原因之一,反过来促进了 MyBatis 用户的不断壮大。
第三,开发人员使用 MyBatis 上手会非常快,具有很强的易用性和可靠性。这也是 MyBatis 流行的一个很重要的原因。当你具备了 My ...
MyBatis类型转换
前言 JDBC 的数据类型与 Java 语言中的数据类型虽然有点对应关系,但还是无法做到一一对应,也自然无法做到自动映射。
在使用 PreparedStatement 执行 SQL 语句之前,都是需要手动调用 setInt()、setString() 等 set 方法绑定参数,这不仅仅是告诉 JDBC 一个 SQL 模板中哪个占位符需要使用哪个实参,还会将数据从 Java 类型转换成 JDBC 类型。当从 ResultSet 中获取数据的时候,则是一个逆过程,数据会从 JDBC 类型转换为 Java 类型。
可以使用 MyBatis 中的类型转换器,完成上述两次类型转换,如下图所示:
深入 TypeHandler说了这么多,类型转换器到底是怎么定义的呢?其实,MyBatis 中的类型转换器就是 TypeHandler 这个接口,其定义如下:
public interface TypeHandler<T> {
// 在通过PreparedStatement为SQL语句绑定参数时,会将传入的实参数据由JdbcType类型转换成Java类型
void setParam ...
MyBatis日志框架
前言Apache Commons Logging、Log4j、Log4j2、java.util.logging 等是 Java 开发中常用的几款日志框架,这些日志框架来源于不同的开源组织,给用户暴露的接口也有很多不同之处,所以很多开源框架会自己定义一套统一的日志接口,兼容上述第三方日志框架,供上层使用。
一般实现的方式是使用适配器模式,将各个第三方日志框架接口转换为框架内部自定义的日志接口。MyBatis 也提供了类似的实现。
适配器模式适配器模式主要解决的是由于接口不能兼容而导致类无法使用的问题,这在处理遗留代码以及集成第三方框架的时候用得比较多。其核心原理是:通过组合的方式,将需要适配的类转换成使用者能够使用的接口。
适配器模式的类图如下所示:
在该类图中,你可以看到适配器模式涉及的三个核心角色。
目标接口(Target):使用者能够直接使用的接口。以处理遗留代码为例,Target 就是最新定义的业务接口。
需要适配的类/要使用的实现类(Adaptee):定义了真正要执行的业务逻辑,但是其接口不能被使用者直接使用。这里依然以处理遗留代码为例,Adaptee 就是遗留业务实现, ...
MyBatis启动流程(上)
MyBatis 有两方面的 XML 配置,一个是 mybatis-config.xml 配置文件中的整体配置,另一个是 Mapper.xml 配置文件中的 SQL 语句。
在初始化的过程中,MyBatis 会读取 mybatis-config.xml 这个全局配置文件以及所有的 Mapper 映射配置文件,同时还会加载这两个配置文件中指定的类,解析类中的相关注解,最终将解析得到的信息转换成配置对象。完成配置加载之后,MyBatis 就会根据得到的配置对象初始化各个模块。
MyBatis 在加载配置文件、创建配置对象的时候,会使用到经典设计模式中的构造者模式。
构造者模式核心的思想
将创建复杂对象的过程与复杂对象本身进行拆分
通俗来讲,构造者模式是将复杂对象的创建过程分解成了多个简单步骤,在创建复杂对象的时候,只需要了解复杂对象的基本属性即可,而不需要关心复杂对象的内部构造过程。这样的话,使用方只需要关心这个复杂对象要什么数据,而不再关心内部细节。
构造者模式的类图如下所示:
从图中,我们可以看到构造者模式的四个核心组件。
Product 接口:复杂对象的接口,定义了要创建的目标对象 ...
MyBatis启动流程(下)
Mapper.xml 映射文件解析全流程在上一章分析 mybatis-config.xml 配置文件解析流程的时候我们看到,在 mybatis-config.xml 配置文件中可以定义多个 <mapper> 标签指定 Mapper 配置文件的地址,MyBatis 会为每个 Mapper.xml 映射文件创建一个 XMLMapperBuilder 实例完成解析。
与 XMLConfigBuilder 类似,XMLMapperBuilder也是具体构造者的角色,继承了 BaseBuilder 这个抽象类,解析 Mapper.xml 映射文件的入口是 XMLMapperBuilder.parse() 方法,其核心步骤如下:
执行 configurationElement() 方法解析整个Mapper.xml 映射文件的内容;
获取当前 Mapper.xml 映射文件指定的 Mapper 接口,并进行注册;
处理 configurationElement() 方法中解析失败的 <resultMap> 标签;
处理 configurationElement() 方法中解 ...
Springboot整合Swagger2
整合 Swagger2Swagger2简介Swagger2是什么 Swagger是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTfu风格的web服务。目标是使客户端和文件系统作为服务器一同样的速度来更新文件的方法,参数和模型紧密集成到服务器。这个解释简单点来讲就是说,swagger是一款可以根据restful风格生成的接口开发文档,并且支持做测试的一款中间软件。
为什么使用swagger2对于后端开发人员来说
不用再手写Wiki接口拼大量参数,避免手写错误
对代码侵入性低,采用全注解的方式,开发简单
方法参数名修改、新增、减少参数都可以直接生效,不用手动维护
缺点:增加了开发成本,写接口还得再写一套参数配置
对前端开发来说
后端只需要定义好接口,会自动生成文档,接口功能、参数一目了然
联调方便,如果出了问题,直接测试接口,实时检查参数和返回值,就可以快速定位是前端还是后端的问题
对于测试
但对于测试没有前端界面UI的功能,可以直接用它来测试接口
操作简单,不用了解具体代码就可以操作
工程搭建
...
Springboot整合模板引擎
整合FreemarkerFreemarker简介
这是一个相当老牌的开源的免费的模版引擎。通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页、电子邮件、配置文件以及源代码等。Freemarker 不是面向最终用户的,而是一个 Java 类库,我们可以将之作为一个普通的组件嵌入到我们的产品中。
来看一张来自 Freemarker 官网的图片:
可以看到,Freemarker 可以将模版和数据渲染成 HTML 。
Freemarker 模版后缀为 .ftl(FreeMarker Template Language)。FTL 是一种简单的、专用的语言,它不是像 Java 那样成熟的编程语言。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
POM文件增加依赖<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifact ...
Springboot工程搭建
使用idea搭建SpringBoot使用initializer 创建项目
File->new->project;
选择“Spring Initializr”,点击next;(jdk1.8默认即可)
完善项目信息,组名可不做修改,项目名可做修改;最终建的项目名为:test,src->main->java下包名会是:com->example->test;点击next;
Web下勾选Spring Web;点击next;
选择项目路径,点击finish;打开新的窗口;
刚创建好的项目目录结构
使用 Maven 管理依赖,自动生成的 POM 文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http ...