SSM
SSM
Huang_ChunSpring Framework系统框架
学习内容
- 核心容器:IOC, DI
- 整合:整合数据层技术MyBatis
- AOP
- 事务
核心概念
IoC 控制反转
- 使用对象时,由主动new出生对象转换为由==外部==提供对象,此过程中对象创建控制权由程序转移到==外部==,此思想称为控制反转。
- IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中称为==bean==
DI(Dependency Injection)依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
bean
bean配置
bean基础配置
bean别名配置
bean作用范围配置
适合交给容器进行管理的bean–表现层对象,业务层对象,数据层对象,工具对象
不适合的–封装实体的域对象。
bean实例化
bean本质上就是对象,创建bean使用构造方法完成。(==常用==)
- 提供可访问的构造方法
- 配置
- 无参构造方法如果不存在,将抛出异常BeanCreationException
通过静态工厂实例化bean对象
静态工厂
配置
使用实例工厂实例化bean
实例工厂
配置
FactoryBean(实用)
FactoryBean
配置
Bean生命周期
- Bean生命周期:Bean从创建到销毁的整体过程
- Bean生命周期控制: 在Bean创建后到销毁前做一些事情
bean生命周期控制
提供生命周期控制方法
配置生命周期控制方法
- 初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set操作)
- 执行Bean初始化方法
- 使用Bean
- 执行业务操作
- 关闭、销毁容器
- 执行Bean销毁方法
- ConfigurableApplicationContext
- close()
- registerShutdownHook()
bean相关
依赖注入
依赖注入
setter注入——引用类型
在Bean中定义引用类型属性并提供可访问的==set==方法
配置中使用==property==标签==ref==属性注入引用类型对象
setter注入——简单类型
- 在Bean总定义引用类型属性并提供可访问的set方法
- 在配置中使用property标签value属性注入简单类型数据
依赖自动装配
- IOC容器根据Bean所依赖的资源在容器中自动查找并注入到Bean中的过程称为自动装配。
- 自动装配方式
- 按类型(常用)
- 按名称
- 按构造方法
- 不启用自动装配
配置中使用==bean==标签==autowire==属性设置自动装配的类型
自动装配用于引用类型依赖注入,不能对简单类型进行操作
使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用。
使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
集合注入
- 注入数组对象
- List
set
- map
依赖注入相关
案例:数据源对象管理
导入druid坐标
配置数据源对象作为Spring管理的bean
加载properties文件
开启==context==命名空间
使用==context==命名空间,加载指定properties文件
使用==${}==读取加载的属性值
注意
不加载系统属性
加载多个properties文件
加载所有properties文件
加载properties文件标椎格式
从类路径或jar包中搜索并加载properties文件
容器
创建容器
类路径加载配置文件
文件路径加载文件
加载多个配置文件
使用bean名称获取
使用bean名称获取并指定类型
使用bean类型获取
容器类层次结构图
BeanFactory初始化(了解)
类路径加载配置文件
BeanFactory创建完毕后,所有的Bean均为延迟加载
注解开发
注解开发定义Bean
使用@Component定义Bean
核心配置文件中通过组件扫描加载Bean
spring提供@Component注解的三个衍生注解
- @Controller:用于表现层bean定义
- @Service:用于业务层bean定义
- @Repository:用于数据层bean定义
纯注解开发
spring3.0开启了纯注解开发模式,使用java类代替配置文件,开启了Spring快速开发赛道。
java类代替Spring核心配置文件
@Configuration注解用于设定当前类为配置类
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据用数组格式
读取Spring和兴配置文件初始化容器对象切换为java配置类初始化容器对象
bean管理
使用@Scope定义bean作用范围
使用@PostConstruct、@PreDestroy定义bean生命周期
依赖注入
使用@Autowired注解开启自动装配模式(按类型)
注意:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法。
自动装配建议使用无参构造器创建对象(默认),如果不提供对应构造方法,其提供唯一的构造方法。
使用@Qualifier注解开启指定名称装配bean
注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用。
使用@Value实现简单类型注入
使用@ProperSource注解加载properties文件
- 注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符 *.
第三方bean管理
使用==@Bean==配置第三方bean
使用独立的配置类管理第三方bean
将独立的配置类加入核心配置
导入式
使用==@Import==注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式。
第三方bean注入
简单类型依赖注入
引用类型依赖注入
- 引用类型注入只需要bean定义方法设置形参即可,容器会根据类型自动装配对象。
- 如果方法的内部需要使用到IOC容器中已经存在的bean对象,那么只需要在方法上声明即可,spring会自动的注入。
注册bean条件
SpringBoot提供了设置注册生效条件的注解@Conditional:
总结
XML配置对比注解配置:
Spring整合MyBatis
整合MyBatis:
Spring整合JUnit
使用Spring整合JUnit专用的类加载器
AOP
AOP简介
- AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构
- 作用:在不惊动原始设计的基础上为其进行功能增强。
- Spring理念:无入侵式
核心概念
- 连接点(JoinPoint): 程序执行过程中的任意位置,粒度为执行方法,抛出异常,设置变量等
- 在SpringAOP中,理解为方法在执行
- 切入点(Pointcut):匹配连接点的式子
- 在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
- 一个具体方法:com.xxx.xxx包下的xxx接口中的方法。
- 匹配多个方法:接口中任意方法
- 通知(advice):在切入点出执行的操作,也就是共性功能,在SpringAOP中,功能最终以方法的形式呈现
- 通知类:定义通知的类、
- 切面(Aspect):描述通知与切入点的对应关系。
AOP入门案例
导入AOP相关坐标
定义dao接口与实现类
定义通知类,制作通知
定义切入点
说明:切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑。
绑定切入点与通知关系,指定添加到原始连接点的具体执行位置。
定义通知类受Spring容器管理,并定义当前类为切面类
开启Spring对AOP注解驱动支持
AOP工作流程
- Spring容器启动
- 读取所有切面配置中的切入点
- 初始化bean,判定bean对应类中的方法是否匹配到任意切入点
- 匹配失败,创建对象
- 匹配成功,创建原始对象(目标对象)的代理对象
- 获取bean执行方法
- 获取bean,调用方法并执行,完成操作
- 获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作。
AOP核心概念
- 目标对象(target):原始功能共性功能对应的类产生的对象,这种对象是无法直接完成工作的
- 代理(proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理实现。
- SpringAOP本质:代理模式
AOP切入点表达式
切入点:要进行增强的方法
切入点表达式:要进行增强的方法的描述方式
切入点表达式标椎格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数) 异常名),如:
- executeion(public User com.xxx.service.UserService.findById(int))
- 其中访问修饰符和异常名可以省略
可以使用通配符描述切入点,开始描述
*****: 单个地理的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现。
匹配com.itheima包下的任意包中UserService类或接口中所有find开头的带有一个参数的方法。
..: 多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
匹配com报下的任意包中Us二Service类或接口中所有名称为findByID的方法
**+**:专用于匹配子类类型
书写技巧
AOP通知类型
AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到河里的位置。
@Before
- 方法注解
- 位置:通知方法定义上方
- 设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行
@After
作用:设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法后运行
@Around
作用:设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前后后运行
注意事项
AOP通知获取数据
获取参数
JoinPoint对象描述了连接点方法的运行状态,可以获取到原始方法调用参数
ProceedJointPoint是JoinPoint的子类
获取返回值
抛出异常后通知可以获取切入点方法中出现的异常信息,使用形参可以接收对应的异常对象
环绕通知中可以手工书写对原始方法的调用,得到的结果即为原始方法的返回值
获取异常
抛出异常后通知可以获取切入点方法中出现的异常信息,使用形参可以接收对应的异常对象
AOP总结
Spring事务
Spring事务简介
Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败
步骤
在业务层接口上添加Spring事务管理
设置事务管理器
开启注解式事务驱动
Spring事务角色
- 事务管理员:发起事务方,在Spring中通常代指业务层开启事务的方法。
- 事务协调员:加入事务方,在Spring中通常代指数据层方法,也可以是业务层方法。
事务相关配置
事务传播行为
SpringMVC
SpringMVC简介
springMVC简介
- springMVC技术与Servlet技术功能等同,均属于web层开发技术。
- springMVC是一种表现层框架技术
- springMVC用于进行表现层功能开发
入门案例
使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标
创建SpringMVC控制器类(等同于Servlet功能)
初始化SpringMVC环境(同Sprig环境),设定springMVC加载对应的bean
初始化Servlet容器,加载springMVC环境,并设置springMVC技术处理的请求
- @Controller
- 作用:设定SpringMVC的核心控制器bean
- @RequestMapping
- 作用:设置当前控制器方法请求访问路径
- @ResponseBody
- 作用:设置当前控制器方法响应内容为当前返回值
简化开发
springMVC相关bean加载控制
- springMVC加载的bean对应的包均在com.xxx.controller包内
Spring相关bean加载控制
Spring加载的bean设定扫描范围为com.xxx,排除controller包内的bean
Spring加载的bean设定扫描范围为精准范围,例如service包,dao包等。
请求
- @RequsetMapping
- 作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
- 属性:value(默认):请求访问路径,或访问路径前缀
请求方式
- get请求传参
- 普通参数:URL地址传参,地址参数与形参变量名相同,定义形参即可接收参数
- post请求传参
普通参数:from表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数
post请求中文乱码处理:为web容器添加过滤器并指定字符集,spring-web包中提供了专用的字符过滤器
传递普通参数
@RequestParam
- 作用:绑定请求参数与处理器方法形参间的关系
传递JSON数据
添加JSON数据转换相关坐标
设置发送JSON数据
开启自动转换JSON数据的支持
设置接收JSON数据
日期类型参数传递
接收形参时,根据不同的日期格式设置不同的接收方式
响应
响应页面
响应文本数据
响应JSON数据(对象转JSON)
REST风格
REST简介
定义:表现形式状态转换。
按照REST风格访问资源是使用行为动作区分对资源进行了何种操作
根据REST风格对资源进行访问称为RESTful
RESTful入门案例
设定http请求动作(动词)
设定请求参数(路径变量)
@PathVariable
- 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
RESTful快速开发
- @RestController
- 作用:设置当前控制类为RESTful风格,等同于@Controller和@ResponseBody两个注解组合功能
- @GetMapping、@PostMapping、@PutMapping、@DeleteMapping
- 作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求。
基于RESTful页面数据交互
制作SpringMVC控制器
设置对静态资源的访问放行
SSM整合流程
- 创建工程
- SSM整合
- spring
- SpringConfig
- MyBatis
- MyBatisConfig
- JdbcConfig
- Jdbc.properties
- SpringMVC
- servletConfig
- springMVCConfig
- 功能模块
- 表与实体类
- dao(接口+自动代理)
- service(接口+实现类)
- 业务层接口测试(整合JUnit)
- Controller
- 表现层接口测试(postman)
表现层数据封装
- 设置统一数据返回结果类
- 设置统一数据返回结果编码
异常处理器
出现异常现象的常见位置与常见诱因
所有的异常均抛出到表现层进行处理
异常处理器:集中的,统一的处理项目中出现的异常
- AOP思想
项目异常处理
项目异常分类
自定义项目系统级异常
自定义项目业务级异常
自定义异常编码
触发自定义异常
拦截并处理异常
JWT令牌
简介
应用场景:登录认证
JWT生成
JWT校验
注意事项
- JWT校验是使用的签名秘钥,必须和生成JWT令牌是使用的秘钥是配套的
- 如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法。
登录-生成令牌
- 引入JWT令牌操作工具类
- 登录完成后,调用工具类生成JWT令牌,并返回。
拦截器
拦截器的概念
- 拦截器是一种冬天拦截方法调用的机制,在springMVC中动态拦截控制器方法的执行。
- 作用:
- 在指定方法调用前后执行预先设定的代码
- 阻止原始方法的执行
拦截器与过滤器的区别
- 归属不同:Filter属于Servlet技术,Interceptor属于springMVC技术
- 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强。
入门案例
声明拦截器的bean,并实现HandlerInterceptor接口(扫描加载bean)
定义配置类,继承webMvcConfigurationSupport,实现addInterceptor方法,(扫描加载配置)
添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个
使用标准接口WebMvcConfigurer简化开发(入侵式较强)
拦截器的执行顺序
- preHandle
- return true
- controller
- postHandle
- afterCompletrion
- return false
- 结束
拦截器参数
- 前置处理
- 参数
- request:请求对象
- Response:响应对象
- handler:被调用处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了在包装
- 返回值
- 返回值为false,被拦截的处理器将不执行
- 完成后处理
- 参数:ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理。
多拦截器执行顺序
- 当配置多个拦截器时,形成拦截器链
- 拦截器链的运行顺序参照拦截器添加顺序为最
- 当拦截器出现对原始处理器的拦截,后面的拦截器均终止运行
- 当垃圾区运行中断,仅运行配置在前面的拦截器的afterCompletrion操作
Maven进阶
分模块开发与设计
创建Maven模块
书写模块代码
通过Maven指令安装模块到本地仓库(install指令)
- 团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服)
依赖管理
依赖传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目简介依赖其他资源
依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源是,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖是,配置顺序靠前的覆盖配置顺序靠后的
可选依赖
可选依赖指对外隐藏当前所依赖的资源-不透明
排除依赖
排除依赖指主动断开依赖的资源,被排除的主义无需指定版本-不需要
聚合与继承
聚合
- 聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合。
- 聚合工程:通常是一个不具有业务功能的”空”工程(有且仅有一个pom文件)
- 作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步国建
- 当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题。
聚合工程开发
- 创建Maven模块,设置打包类型为pom
- 设置当前聚合工程所包含的子模块名称
继承
- 概念:继承描述的是两个工程之间的关系,与java中继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承
- 作用:简化配置,减少版本冲突
继承关系
创建Maven模块,设置打包类型为pom
在父工程的pom文件中配置依赖关系(子工程将沿用父工程中的依赖关系)
配置子工程可选的依赖关系
在子工程中配置当前工程所继承的父工程
在子工程中配置使用父工程中可选依赖的坐标
属性
定义属性
引用属性
资源文件引用属性
定义属性
配置文件中引用属性
开启资源文件目录加载属性的过滤器
配置Maven打war包时,忽略web.xml检查
版本管理
多环境开发
定义多环境
使用多环境(构建过程)
跳过测试
跳过测试
范例
细粒度控制跳过测试
私服
Nexus安装与启动
启动服务器(命令性启动)
1 nexus.exe /run nexus
私服资源操作流程分析
私服仓库分类
本地仓库访问私服权限设置
- 配置位置(setting.xml文件中)
- 发布命令
- mvn deploy