Maven
Maven是apache旗下的一个开源项目,是一款用于管理和构建Java项目的工具。
依赖管理
依赖:指当前项目运行所需要的jar包,一个项目可以引入多个依赖
配置:
- 在pom.xml中编写<dependencies>标签
- 在<dependencies>标签中使用<dependency>引入坐标
- 定义坐标的groupid,artifactid,version
- 点击刷新按钮,引入最新加入的坐标
依赖传递
依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
- 排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。
依赖范围
依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>...<scope>设置其作用范围
作用范围
- 主程序范围有效。(main文件夹范围内)
- 测试程序范围有效。(test文件夹范围内)
- 是否参与打包运行。(package指令范围内)
生命周期
maven的生命周期是为了对所有的maven项目构建过程进行抽象和统一
Maven中由三套相互独立的生命周期:
- clean:清理工作
- default:核心工作,如:编译、测试、打包、安装、部署等。
- site:生成报告、发布站点等。
- clean:移除上一次构建生成的文件
- compile:编译项目源代码
- test:使用合适的单元测试框架运行测试(junit)
- package:将编译后的文件打包,如:jar、war等
- install:安装项目到本地仓库
注意事项:在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。
web入门
HTTP
概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
特点:
基于TCP协议:面向连接,安全
基于请求-响应模型的:一次请求对应一次响应
HTTP协议是无状态的协议:对于事物处理没有记忆能力。每次请求-响应都是独立的。
- 缺点:多次请求间不能共享数据
- 优点:速度快
请求协议
响应协议
常用状态码
协议解析
Tomcat
web服务器
web服务器是一个软件程序,对HTTP协议的操作进行封装,使程序员不必直接对协议进行操作,让web开发更加便捷。主要功能是“提供网上信息浏览服务”。
tomcat的基本使用
常见问题
配置tomcat的网络端口
HTTP协议默认端口号为80,如果将tomcat端口号改为80,则将来访问tomcat时,将不用输入端口号。
tomcat部署项目
将项目放置到webapps目录下,则部署完成。
入门程序解析
1.起步依赖
sping-boot-starter-web
spring-boot-starter-test
2.内嵌tomcat服务器
基于springboot开发的web应用程序,内置了tomcat服务器,当启动类运行时,会自动启动内嵌的tomcat服务器。
请求响应
请求响应
请求(HttpServleRequest):获取请求数据
响应(HttpServleResponse):设置响应数据
BS架构:Browser/Server,浏览器/服务器架构模式。客服端 只需要浏览器,应用程序的逻辑和数据都存储在服务端(维护方便 体验一般)
CS架构:Client/Server,客户端/服务器架构模式。(开发、维护麻烦 体验不错)
请求
postman
postman是一款功能强大的网页调试与发送网页HTTP请求的chrome插件
作用:常用于进行接口测试
简单参数
传输方式:
原始方式:
在原始web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取
spring boot方式
简单参数:参数名与形参变量名相同,定义形参即可接收参数
如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射
@RequestParam中的requried属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false。
实体参数
简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可
复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。
数组集合参数
数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组型形参即可接收参数。
集合参数:请求参数名与形参集合名称相同且请i去参数为多个,@RequestParam绑定参数关系
日期参数
日期参数:使用@DateTimeFormat注解完成日期参数格式转换
JSON参数
JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识。
路径参数
路径参数:通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数。
总结
响应
@ResponseBody
类型:方法注解、类注解
位置:Controller方法上/类上
作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应
说明:@RestController = @Controller + @ResponseBody
统一响应结果
定义一个result类,作为接口返回值
案例
基本步骤
第一步:在pom.xml文件中引入dom4j的依赖,用于解析XML文件
.
第二步:引入解析XML的工具类XMLParserUtils、对应的实体类Emp、XML文件emp.xml
第三步:引入需要显示的静态页面文件,放在resources下的static目录下
spring boot项目的静态资源(html、css、js等前端资源)默认存放目录为:classpath:/static、classspath:/public、classpath:/resources
第四步:编写Controller程序,处理请求,响应数据
分层解耦
三层架构
- controller:控制层,接收前端发送的请求,对请求进行处理,并 响应数据。
- service:业务逻辑层,处理具体的业务逻辑。
- dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增。删、改、查。
基础流程:
分层解耦
- 内聚:软件中各个功能模块内部的功能联系。
- 耦合;衡量软件中各个层/模块之间的依赖、关联的程度。
- 软件设计原则:高内聚低耦合
控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
bean对象:IOC容器中创建、管理的对象,称之为bean。
IOC详解
Bean的声明
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注释之一:
注意事项:
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。
Bean组件扫描
- 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
- @ComponentScan注解虽然没有显示配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。
DI详解
@Autowired //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量 -依赖注入
Bean注入
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
通过以下几种方案来解决:
@Primary
@Autowired + @Qualifier(”bean的名称“)
@Resource(name=”bean的名称“)
@Resource与@Autowired区别
- @Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。
- @Autowired默认是按照类型注入,而@Resource默认是按照名称注入。
Mybatis
入门
Mybatis是一款优秀的持久层框架,用于简化JDBC的开发
使用Mybatis查询所有用户数据
JDBC介绍
JDBC,就是使用Java语言操作关系型数据库的一套API。
数据库连接池
- 数据库连接池是个容器,负责分配,管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
优势:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
标准接口:DataSource
- 官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。
- 功能:获取连接
常见产品:
Druid(德鲁伊)
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一
切换Druid数据连接池
方法一:
方法二:
Lombok
Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化Java开发、提高效率。
引入依赖
Mybatis基础操作
日志输出
预编译SQL
优势:
- 性能更强
- 更安全(防止SQL注入)
SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
参数占位符:
删除
根据主键删除
SQL语句:
delete from emp where id=17;
接口方法:
@Delete(“delete from emp where id= #{id}")
public void delete(Integer id);
如果mapper接口方法形参只有一个普通类型的参数,#{...}里面的属性名可以随便写,如:#{id}、#{value}
新增
新增(主键返回)
- 描述:在数据添加成功后,需要获取插入数据库数据的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据。
- 实现:
更新
接口方法:
查询(根据ID查询)
接口方法
查询(条件查询)
数据封装
- 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
- 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。
解决方案
登录校验
会话技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
会话跟踪:一种维护浏览器状态的方法,服务器需要多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪方案:
- 客户端会话跟踪技术:Cookie
- 服务端会话跟踪技术:Session
- 令牌技术
会话跟踪方案对比
JWT令牌
思路:
- 令牌生成:登录成功后,生成JWT令牌,并返回给前端。
- 令牌校验:在请求到达服务端后,对令牌进行统一拦截、校验。
JWT-生成
JWT-校验
注意事项:
- JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的密钥是配套的。
- 如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法。
过滤器Filter
Filter快速入门
定义:实现Filter接口
配置:@WebFilter(urlPattern=“/*”)
@ServletComponentScan
详解
异常处理
全局异常处理器
- @RestControllerAdvice
- @ExceptionHandler
事务管理
spring事物管理
概念:事物是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。
操作:
注解
- 注解:@Transactional
- 位置:业务(service)层的方法上、类上、接口上
- 作用:将当前方法交给spring进行事物管理,方法执行前,开启事物;成功执行完毕,提交事物;出现异常,回滚事物。
事物管理日志的配置文件 .yml
#开启事物管理日志
logging:
level:
org.springframework.jdbc.suport.jdbcTransactionManager:debug
事物进阶
事物属性-回滚
rollbackFor
默认情况下,只有出现RuntimeException才回滚异常。rollbackFor属性用于控制出现任何==何种异常类型,回滚事务。
事务属性-传播行为
propagation
事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
场景:
REQUIRED:大部分情况下都是用该传播行为即可。
REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订
单前需要记录日志,不论成功与否,都需要保证日志记录能够记录成功。
AOP
AOP:Aspect Oriented Programming(面向切面编程、面向方面编程)。其实就是面向特定方法编程。
场景:
案例部分功能运行较慢,定位执行耗时较长的业务方法,此时需要统计每一个业务方法的执行耗时
核心概念
通知类型
@PointCut
通知顺序
当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。
切入点表达式
execution
execution主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为
execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)
其中带?的表示可以省略的部分
访问修饰符:可省略(比如:public、protected)
包名.类名:可省略
throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)
注意事项:
根据业务需要,可以使用且(&&)、或(||)、非(!)来组合比较复杂的切入点表达式
@annotation
@annotation切入点表达式,用于匹配标识有特定注解的方法。
@annotation(com.ithema.anno.Log)
连接点
在spring中用JoinPoint抽象了连接点, 用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。
对于@Around通知,获取连接点信息只能使用ProceedingJoinPoint
对于其他四种通知,获取连接点信息只能使用JoinPoint,他是ProceedingJoinPoint的父类型
springboot原理
配置优先级
springboot中支持三种格式的配置文件:
springboot除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置。
优先级(低-->高)
- application.yaml(忽略)
- application.yml
- application.properties
- java系统属性(-Dxxx=xxx)
- 命令行参数(--xxx=xxx)
Bean管理
获取bean
默认情况下,spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:
bean的作用域
Spring支持五种作用域,后三种在web环境才生效
可以通过@Scope注解来进行配置作用域:
注意事项
- 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
- prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
- 实际开发当中,绝大部分的bean是单列的,也就是说绝大部分bean不需要配置scope属性
第三方bean
- 如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明bean的,就需要用@Bean 注解
- 若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。
注意事项:
- 通过@Bean注解的name/value属性指定bean名称,如果未指定,默认是方法名
- 如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
springboot原理
起步依赖
自动配置
springboot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器当中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
自动配置原理
方案一:@ComponentScan组件扫描
方案二:@Import导入。使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:
- 导入 普通类
- 导入 配置类
- 导入 ImportSelector 接口实现类
- @EnableXxxx注解,封装@Import注解
源码跟踪
@SpringBootApplication
该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解该注解由三个部分组成:
- @SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是一个配置类。
- @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。
- @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。
@Conditional
作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中
位置:方法、类
@Condition本身是一个父注解,派生出大量的子注解:
- @ConditionalOnClass:判断环境中是否有对应字节码文件,才能注册bean到IOC容器。
- @ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器。
- @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。
maven高级
分模块设计与开发
为什么?将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的互相调用,资源共享。
注意事项
分模块设计需要先针对模块功能进行设计,在进行编码。不会先将工程开发完毕,然后进行拆分