Skip to main content
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.验证
4.配置
- maven配置
- 修改中央仓库地址(国内的更快),指定本地缓存目录
- eclipse配置
- Maven\Installations:选择Maven的安装目录 Maven\User Settings:选择Maven本地仓库的Settings.xml
maven配置: {maven目录}/conf/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.最适合的工具
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
/WEB-INF/springMVC-servlet.xml
/WEB-INF/mybatis-config.xml
/WEB-INF/datasource.properties