1.框架是什么?

半成品
与特定领域有关,通过固化流程控制,表达解决方案
问题驱动
问题 -> 框架
与类库的不同
框架是主板,而类库是cpu或内存

2.有哪些优缺点?

复用代码
减少编码、测试的工作量,提高开发效率
享用特性
框架都有自己鲜明的特点,使用者省去了实现它的思考过程
忍受缺陷
世间没有完美的事物,享用优点的同时、必然要忍受其缺点
学习成本
需要花费时间,掌握框架的用法

3.如何选择框架?

问题导向
先明确要解决什么问题
上限和下限
针对项目特点,确定需要的特性、和不能承受的缺陷
筛选
列出问题相关的所有框架,用下限剔除、用上限排序

4.如何引入框架?

手工添加
麻烦! 要逐个下载,还要考虑多个框架之间的版本兼容问题
maven管理依赖
方便! 只需配置好框架的id和版本,就会自动匹配它所依赖的其它框架,并一次全部下载完
maven项目构建
构建过程包括一系列步骤:清理(生成目录)、编译(目标程序)、(运行单元)测试、(目标程序)打包、部署(到服务器),使用maven命令可以自动完成

1.绿色安装包

下载
http://maven.apache.org/download.cgi
解压
不需要管理员权限的目录

2.环境变量

MAVEN_HOME
{maven目录}
PATH
%MAVEN_HOME%\bin;

3.验证

命令行
mvn -v

4.配置

maven配置
修改中央仓库地址(国内的更快),指定本地缓存目录
eclipse配置
Maven\Installations:选择Maven的安装目录 Maven\User Settings:选择Maven本地仓库的Settings.xml
				
				

1.查找框架的id

网址
http://mvnrepository.com

2.项目描述

id和版本号
描述本项目的信息,和所依赖框架的信息
				
				
				
				

3.构件命令(mvn xxx)

clean
清理 生成目录
compile
编译 目标程序
test
运行 单元测试
package
目标程序 打包成jar或war文件
install
程序包 复制到本地仓库,供其它项目引用
deploy
程序包 复制到服务器上

4.项目模版(archetype)

目录结构
已经定义好各目录的功能,分别存放哪些文件
pom.xml
已经定义好的项目描述,指定该类项目用到的所有框架
好处
可以用maven命令,将自己常用的项目,做成模版来复用

1.Spring是什么?

一组框架
除了业务逻辑,在基础结构的各个方面都提供了框架
一条产品线
Pivotal公司的一系列软件产品
口号
让程序员只需关注 业务逻辑
核心理念
组装代码

2.有哪些模块?

Core
依赖注入, 面向切面, 数据验证
Testing
单元测试
Data Access
访问数据库,事务管理
Web Servlet
Spring MVC, WebSocket
Web Reactive
非阻塞响应
Integration
消息, 邮件, 缓存, 远程调用, 任务计划
官方文档
https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/

3.最适合的工具

STS
spring基于eclipse做的IDE

1.原理:看图 自动 组装

图纸
xml配置文件(描述bean,以及bean之间的组装关系)
积木
bean(pojo的实例)
谁来组装?
ApplicationContext(应用程序上下文)
专业术语
依赖注入(依赖就是bean之间的组装关系,注入就是组装的动作)

2.画图纸

显示装配
在xml配置文件中,根据id明确指定bean的装配关系
自动装配
根据bean的属性(class/id),自动匹配
结合使用
以自动装配为主,(对于匹配关系不唯一的)辅之以显示装配
				
				

3.看图纸

ClassPathXmlApplicationContext
在ClassPath中,根据相对路径找到bean的配置文件,然后加载
FileSystemXmlApplicationContext
在FileSystem中,根据物理路径找到bean的配置文件,然后加载
XmlWebApplicationContext
详见springMVC的配置(推荐使用@注解,不建议使用bean文件)
				
				

1.原理

① 接收请求
web容器 --[请求]--> DispacherServlet --[UrlHandlerMapping]--> Controller
DispacherServlet
项目启动时创建,SpringMVC用它匹配大部分请求(通常是 '/')
UrlHandlerMapping
提前定义好 [url, Controller] 的映射规则
Controller
DispacherServlet根据请求的Url找到Controller,创建它并调用
② 返回响应
Controller --[处理结果 + view名称]--> DispacherServlet --[ViewResolver]--> web容器
Controller
读取请求数据,调用注入的Model、生成处理结果,最后将结果和view名称一起返回
ViewResolver
提前定义好 [view名称, View] 的映射规则
View
DispacherServlet根据view名称找到View,并将Controller返回的处理结果嵌入到view中,生成最终的数据
框架的原理

2.使用步骤

引入spring-webmvc的jar包
[接收请求]
在web.xml中定义DispacherServlet
创建mvc配置文件,命名规范为{DispacherServletName}-servlet.xml
在mvc配置文件中,启用注解,并指定在哪些包中扫描注解
创建controller并用@Controller注解,用@RequestMapping注解要映射的url
[封装请求数据]
定义action方法的形参(@PathVariable用来匹配uri的一部分,@RequestParam用来映射queryString,默认根据参数名称自动匹配)
[返回json]
引入jackson-databind的jar包
直接返回java对象,用@ResponseBody注解action
[返回html]
在mvc的配置文件中,指定ViewResolver及映射规则
将[处理结果]添加到ModelMap中,返回视图名称
创建view,并在view中使用 ${} 将[处理结果]填充到视图模板中

3.常用的注解

配置类
@Configuration
进行配置
@ComponentScan
在哪些包中扫描注解
@Bean
方法返回的对象,作为bean放在容器中
@Scope
指定bean的scope(singleton/prototype)
定义被依赖组件(容器将它实例化成bean)
@Component
通用组件,后面3个是对三层架构的细化
@Controller
Controller层,处理请求
@RestController
返回json的Controller
@Service
Service层,处理业务(数据库的事务)
@Repository
Repository层,访问数据库
定义依赖组件(容器用什么方式查找bean)
@Autowired
自动装配byType
@Qualifier
配合@Autowired使用,指定id解决多个匹配的问题
@Resource
自动装配byName
请求路由(用RequestMethod细化Controller层)
@RequestMapping
指定Controller或Action对应的url
@GetMapping
Action对应Get方法(查询:/资源/参数)
@PostMapping
Action对应Post方法(新增:/资源)
@PatchMapping
Action对应Patch方法(修改部分属性:/资源/参数)
@PutMapping
Action对应Put方法(替换所有属性:/资源/参数)
@DeleteMapping
Action对应Delete方法(删除:/资源/参数)
数据绑定(从请求中拿数据,并赋给变量)
@PathVariable
URI中的模板变量(url参数的另一种格式) ——> 单个变量
@RequestParam
请求参数(FormString/QueryString) ——> 单个变量
@ModelAttribute
请求参数(FormString/QueryString) ——> 类的所有属性
@SessionAttributes
session对象
@CookieValue
cookie对象
@RequestHeader
请求头 ——> 单个变量
@RequestBody
请求体 ——> 单个变量
@InitBinder
自定义数据绑定器
返回响应
@ResponseStatus
指定响应状态码
@ResponseBody
指定响应正文

1.原理

访问数据库:写sql -> 获得ResultSet -> 映射到对象上
sql单元
sql单元是mybatis的核心,它对应DAO访问数据库的方法
①方便写sql
把#{动态参数}填充到sql里,它替我们拼接
②简化映射
只需维护 [sql字段, 对象属性] 的映射规则,它替我们映射

2.使用步骤

引入mybatis的jar包
[配置和映射]
新建mybatis的配置文件: mybatis.cfg.xml
新建映射文件xxxMapper.xml、与数据访问interface一一对应
在xxxMapper.xml文件中,编写sql单元对应接口中的方法,并提前定义好的映射关系
[执行sql单元]
读取mybatis的配置文件,获取SqlSessionFactory(从官网复制代码)
用SqlSessionFactory打开会话,获取SqlSession(从官网复制代码)
根据interface获取mapper
commit并关闭SqlSession

3.Mybatis generator自动生成代码

安装插件
Help/Eclipse Marketplace...搜索mybatis、安装、重启
配置generator
在项目中加入generatorConfig.xml: 填写数据库连接、生成文件的位置、要映射的表
运行generator
在generatorConfig.xml上右键: Run As/Run Mybatis Generator
[参考]
http://mybatis.org/generator/configreference/xmlconfig.html
				
				

1.原理

比喻
(观察者模式)动态添加listener,同时监听多个方法,执行同一段逻辑
微观
(代码复用)在多个方法中有相同的逻辑, 手动重复编写代码 --> 自动织入代码
宏观
(关注点分离)代码组织的更清晰,解耦 <业务逻辑, 非功能逻辑(方面)>

2.概念准备

JoinPoint接入点
(待焊接点)程序运行时,能被监听的所有方法
Pointcut切入点
(实际焊接点)接入点被监听后,就成了事实上的切入点
TargetObject目标对象
切入点所在的对象
Aspect切面
非功能逻辑,系统的某一面(如:缓存、日志、安全、事务、异常处理等)
Advice通知
(焊枪)切面的方法 --> 切入点的位置( 前/后/环绕/...)

3.使用步骤

引入aspectjweaver的jar包
[识别切面]
定义切面类,并在其方法中实现切面逻辑
[识别切入点]
在aop.xml中,用正则表达式描述切入点
[定义通知]
在aop.xml中,用切面类的方法 关联 切入点

4.语法细节

[切入点描述]
正则表达式
execution(修饰符? 返回类型 包名.类名?方法名(参数) 抛出的异常类型?)
?
代表{占位符}可以省略
*
匹配所有字符
..
匹配所有参数
[5类通知]
before
调用前
after
调用后
after-returning
成功后
after-throwing
失败后
around
前+后(参数:必须有ProceedingJoinPoint pjp,返回值:必须是Object)
[数据传递]
入参
(名称一致)在切入点表达式中加上 and args(参数1, 参数2, ...)
返回值
returning="参数名"
				
				

1.thymeleaf + springMvc + springTx + mybatis/spring-jdbc + log4j12

				
				
				
				
				
				
				
				
				
				
				
				

1.
2.