2.框架分类:
- Spring框架:整个框架负责宏观调控,负责整合其他的第三方框架。
- SpringMVC框架:主要负责实现前端和后端的交互。
- Mybatis框架和MybatisPlus框架:持久层框架,简化了JDBC操作数据库。
- SpringBoot框架/工具:SpringBoot采用了一种更加简化的封装方式去封装上面的框架, 简化用户的调用步骤,让程序变得更加简单。
3.普通的业务请求过程:
1.Spring框架
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。提供了功能强大的IOC、AOP及Web MVC等功能。
bean: 是spring容器管理的对象。
生命周期:创建对象/对象的初始化/执行业务逻辑/销毁对象
轻量级容器:spring在内存中申请了一块内存空间,用来存储其他对象。
Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
控制反转(IOC)
6.1定义:loc:全称Inversion of Control,即“控制反转”,这是一种设计思想。
对象创建的权利由Spring框架完成,即由Spring容器管理对象的生命周期。
需要时注入(DI)即可
6.2目的:降低代码的耦合性。
6.3 spring容器
Spring容器的数据结构是Map集合. Map<key,value>
key=“user” 类名首字母小写
value=“通过反射机制实例化的对象”
反射机制在框架中,一般使用比较多,给定类型的路径就可以获取其中的对象,但是要求必须有无参构造. 否则程序运行必报异常.
创建spring容器,并且加载指定的配置文件将对象交给容器管理。用户无需关心对象是如何实例化. 容器负责对象的注入即可. 以后几乎不用修改任何代码. 降低了代码的耦合性
Spring对象生命周期管理
1.定义: 一个对象从创建到消亡,可以划分为四个阶段. 如果需要对程序进行干预.则可以通过周期方法进行干预. (回调函数/钩子函数/接口回调)
2.明生命周期函数的作用: 主要作用可以在各个时期对对象进行干预
Spring生命周期管理的四个过程
创建对象;
初始化对象(@PostConstrucct);
业务调用;
对象销毁(@PreDestroy)
通知
可以记录程序执行的各个过程,程序的运行状态,为日志提供记录
第一类(用于为日志提供记录,不可更改):
1.前置通知:在目标方法执行之前回滚:@Before(“pointcut()”)
2.后置通知:在目标方法执行完之后执行: @AfterReturning(“pointcut()”)
3.报错通知:在目标方法执行完之后执行:@AfterThrowing(“pointcut()”)
4.最终通知:目标方法之后都要执行的通知: @After(“pointcut()”)
第二类(控制方法的执行):
5.环绕通知:在目标方法执行前后都要执行,可以控制目标方法: @Around(“pointcut()”)
IOC/DI注入
1.历史: 传统代码其中的属性对象一般都是通过new关键字手动创建,这样的代码耦合性高,不方便扩展
功能: 使得对象与对象之间的耦合性降低,进行解耦即实现松耦合
- IOC: 控制反转,将对象交给spring容器,由Spring容器管理对象的生命周期.
- DI是依赖注入. 只有被spring容器管理的对象的属性才可以被依赖注入. 默认的条件下采用类型注入.如果有特殊需求也可以采用名称注入@Qualifier(“cat”)
- Spring中 IOC和DI相互配合,可以极大程度上降低耦合性.可以整合其它的第三方框架。
jdk代理: 要求必须有/实现接口. 如果没有接口,则JDK代理不能正常执行.
cglib代理: 要求被代理者有无接口都可以. 代理对象是目标对象的子类 重写子类方法
AOP(面向切面编程)
- AOP介绍 在软件业,AOP为Aspect Oriented Programming的缩写,
意为:面向切面编程,通过预编译方式和 运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点, 也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离, 从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
总结: Spring中的AOP 利用代理对象在不修改源代码的条件下,对方法进行扩展.
AOP的专业术语
1 连接点:用户可以被扩展的方法
2 切入点:用户实际扩展的方法
3 通知:扩展方法的具体实现
4 切面:将通知应用到切入点的过程
spring中的注解 @ComponentScan("com.jasg.demo")//扫描当前包和其子孙包,首先生效 @Configuration//当前的类标识为配置类,与.xml的效果一致 @Bean//相当于xml的反射机制,自己创建对象,将自己方法的返回值交给Spring容器管理 @Scope("singleton")//默认值 单例模式 @Scope("prototype")//多例模式 @Lazy//懒加载模式 @PostConstruct//创建对象之后立即调用 @PreDestroy//对象消亡时调用 @Component//将该类交给spring容器管理 @Autowired//将当前接口的实现类自动注入 @Qualifier("cat")//注解不能单独使用,必须配合Autowired使用,根据key进行注入 @Resource(name = "cat")//在功能上相当于: @Autowired+@Qualifier("cat") @Repsitory//继承了@Component,标识持久层,将该类交给spring容器管理 @Service//也继承了@Component,标识业务层 @Controller//也继承了@Component,标识控制层,与页面进行交互 @value//为属性赋值 //加载单个配置文件,spring根据指定的路径加载properties配置文件,将数据添加到spring容器中 @PropertySource(value = "classpath:/addUser.properties",encoding = "UTF-8") @PropertySources()//加载多个配置文件 @Aspect//标识该类是一个切面类,AOP类 @Pointcut//用于定义切入点表达式,有4种写法 @EnableAspectJAutoProxy//让spring中的AOP生效 @Before//AOP的前置通知 @AfterReTurning//AOP的后置通知 @AfterThrowing//AOP的异常通知 @After//AOP的最终通知 @Around//AOP的环绕通知 @Order(2)//环绕通知执行的顺序,第二个执行,数字越小执行顺序越靠前 |
2.SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。 SpringMVC框架主要功能: 实现前后端的交互。SpringMVC框架使用需要借助tomcat服务器. 默认端口号8080,可以随意修改。
1.前端通过http请求可以携带参数访问后端服务器。请求
2.后端服务器将结果通过响应返回给前端。响应
请求类别 | 特点 |
GET | 长度限制为1024,请求时的速度快,接口与参数暴露引起风险,但使用方便,K-V结构 |
DELETE | 请求服务器删除指定的资源,不常用,因为研发不会允许向外直接暴露非业务性质的删除接口 |
PUT | 上传某种特定资源时使用,不常用,除非研发需要,不然现在的上传spring等框架都有着成熟的上传手段 |
POST | 可携带的数据长度由具体的Controller决定,但是它本身的长度理论上是不受限的,常用在异步请求中,数据比GET慢,但比GET安全 |
HEAD | 请求的方式类似于GET,同属于HTTP1.0的请求方式,和GET的区别在于开发中使用较少,因为它不会返回任何的实体信息,它常用来测试接口等资源,不法分子暴力攻击一个地址时也会使用这个 |
TRACE | 查看服务器收到的所有请求,用于测试或查看问题 |
OPTIONS | 用来向服务器查询对于某些特殊资源的被允许的请求方式,也有人用来检查服务器性能 |
CONNECT | 一般用不到,这个请求是HTTP1.0协议,不算1.0,以后被提出的一个预留给管理形式的代理服务器的 |
COPY | 将指定的资源复制到Destination消息头指定的位置 |
MOVE | 将指定的资源移动到某一位置 |
SEARCH | 用来搜索某一资源 |
PROPFIND | 获取资源信息 |
restFul风格说明
1.restFul的风格数据的位置一旦确定不能修改
2.参数与参数之间使用”/“的方式分割,
需要接收的参数使用{}包裹,可以使用@PathVariable注解获取
3.restFul的风格适用于get/post/put/delete请求类型
4.若{name}的属性和对象的属性名称一致或属性过多时可以使用对象接收调用
对象的set方法为属性赋值。
- JSON介绍
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。
它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
根源: 网络传输协议http/https,本质传输的数据都是字符串/字节信息. 协议与系统无关. 所以采用JSON的方式将数据按照特定的顺序进行排列. JSON中的特殊的数据结构,可以很好的解析字符串.
1 同源策略
要素1: 浏览器的访问地址
要素2: Ajax的请求的网址
策略说明: 如果上述的要素同时满足
符合:*协议://域名:端口号**都相同的情况*,则称之为满足同源策略.可以进行正确的调用. 也称之为 “同域访问”.
@Controller 将该类首先交给SpringMVC管理之后将SpringMVC整体框架交给Spring管理. @CrossOrigin 允许跨域访问 @ResponseBody 表示该方法的返回值都是JSON串结构,如果返回值为String类型,则不变,对象转换为json字符串 @RequestMapping("/hello") 实现浏览器的请求路径与方法的映射 @PathVariable restFul结构,接收参数的注解. @GetMapping("") 只能接收GET请求类型 @DeleteMapping("") 只能接收DELETE请求类型 @PostMapping("") 只能接收POST请求类型 @PutMapping("") 只能接收PUT请求类型 @RestController 表示Controller类,同时要求返回值为JSON=>@Controller+@ResponseBody //3-->@ResponseBody User转化为JSON串 @RequestBody JSON串转化为User对象,json中的key与属性一致 |
3.SpringBoot
1.定义
SpringBoot框架是框架的框架,简化常规框架的配置的方式,只需要很少的代码,即可以实现大量的功能. 体现了 “开箱即用” 思想。
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
4.Mybatis
1.定义
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。可以通过简单的 XML 或注解来配置和映射原始类型,接口和 Java POJO,为数据库中的记录MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
2.Mybatis的特点
- 简单易学:文件本身就很小,没有任何第三方依赖,安装只要两个jar文件+配置几个sql映射文件,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响,将sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
一级缓存: Mybatis默认条件下只开启一级缓存, 一级缓存是sqlSession级别的, 在同一个sqlSession中查询数据可以共享数据.
二级缓存默认开启,二级缓存是SqlSessionFactory级别. 同一个工厂创建多个sqlSession共享数据. Mybatis 也提供了第三方Cache接口,整合第三方缓存
如果采用springboot的方式进行测试时执行多次SQL时,一级缓存无效, Springboot在整合mybatis之后,使用Mapper.find查询时,springboot会默认开启多个sqlSession。 可以添加事务注解的方式解决。 @Transactional //控制事务,添加事务注解之后会默认采用同一个SQLSession。
1.如果是单表操作,一般使用resultType
2.如果进行关联操作,使用resultMap;
3.如果是多表联查,结果集不允许出现重名字段,写出具体的字段
1.定义:当表中的字段与java当中的属性名称不一致时,需要使用resultMap的方式进行映射.
2.关于返回属性的说明
resultType : 只能支持字段名称与属性的名称一致时才能自动映射.
resultMap: 可以支持 任意类型的映射 万能的结构
利用注解可以根据返回值类型,自动映射
//规则1: 注解和映射文件 二选一 映射文件为主导.
//规则2: 注解写法一般适用于简单操作.关联查询不适用
5.MyBatis-Plus
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改 变,为简化开发、提高效率而生。
2.特点
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
3.ORM思想
定义:对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。说明:ORM以面向对象的方式操作数据库。特点:对象与数据库中的表一一映射。对象中的属性与表中的字段一一对应。
以面向对象的方式操作数据库,由框架动态生成SQL语句,实现了跨数据库的操作。
步骤: 1.编辑pojo 添加注解 @tableName @tableId 2.实现接口继承BaseMapper 3.编辑YML文件配置信息 将mybatis改为mybatis-plus |
6.代理机制
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了邮箱(IMAP/POP3/SMTP)的服务。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
反向代理
若将网址的真实路径直接告知用户,会造成服务器不安全,所以需要采用
代理技术来规避问题。
反向代理特点:
反向代理服务器介于用户和目标服务器之间。
用户从反向代理服务器获取资源,用户到达不了真实的服务器地址,降低真实服务器的负载。
正向代理:
目的:网络访问通信使用,网络出口
正向代理服务器(vpn )
用户访问~~vpn ~~间接访问服务器
正向代理的使用伴随着路由
2.特点
nginx是一个开源免费的 轻量级的反向代理服务器、web服务器。
nginx并发能力强 并发理论值:5万次/秒 实际值3万次/秒 tomcat:150-220–处理之后1000个/秒
nginx占用内存少,不超过2M, tomcat理论值2G,内存占用200M
7.linux
Linux全部都是基于文件的,并且Linux中的目录都是树形结构。
绝对路径:即含有–> /
相对目录:当前的文件目录
ifconfig/ip addr | 检查IP地址 |
pwd | 检查当前的位置 |
tab键 | 自动补齐(注意唯一性) |
clear | 清空当前屏幕 |
cd / | 返回根目录 |
cd ~ | 用户主目录 |
cd . | 当前目录 |
cd .. | 返回到上一级目录 |
cd /usr/ | 进入到usr目录 |
cd – | 返回上一个目录 |
cd | 直接回家 |
ls | 查看当前目录的内容 |
ls –l | 详细格式,文件权限,时间 |
ll | 和ls –l作用相同 |
ls *.txt | 查看所有的txt类型文档 |
mkdir | 创建目录 |
mkdir a | 创建 a目录 |
mkdir a b c | 创建 a,b,c目录 |
mkdir -p a/b | 创建 a目录,并在a目录里创建b目录 |
mkdir -m 777 c | 创建一个权限为777的C目录 |
rmdir | 删除目录(如果目录里有文件,则不能用此命令) |
Esc | 切换到命令行模式。 |
按i | 在光标前开始编辑 |
按a | 在光标后开始编辑 |
按o | 在当前行的下一行开始编辑 |
按u | 撤销之前的操作 |
按 shift+:冒号 | 底行模式 |
:q! | 不保存退出 |
:wq | 保存退出 |
:/world | 从当前光标处,向上查找world关键字 |
:?world | 从当前光标处,向后查找world关键字 |
touch
1.1 创建一个文件 touch yyTest.ini
1.2 同时创建两个文件 touch test1.txt test2.txt
1.3 批量创建文件(如创建2000个文件) touch test{0001..2000}.txt
编辑文件脚本:vim 文件名.sh vim start1.sh
vi test.txt
vim touch.txt
使用>、>>
3.1 >
直接覆盖原文件,不会有任何提示
3.2 >>
追加在原文件末尾,不会覆盖原文件的内容
rm | 删除文件 |
rm n.txt | 提示y删除n放弃 |
rm –f n.txt | 不提示 |
rm –rf dirname | 不提示递归删除目录下所以内容 |
rm –rf * | 删除所有文件 |
rm –rf /* | 删除所有子目录所有和文件 |
cp | 复制文件 |
cp nginx.conf n.txt | |
cp –R tomcat1 tomcat2 | 复制整个目录 |
mv | 修改文件名,移动文件 |
mv n.txt m.txt | 修改文件名称 |
cat | 输出文件所有的内容 |
more | 输出文档所有的内容,分页输出,空格浏览下一屏,q退出 |
less | 用法和more相同,只是通过PgUp、PgOn键来控制 |
tail | 用于显示文件后几号,使用频繁 |
tail -10 nginx.conf | 查看nginx.conf的最后10行 |
tail –f nginx.conf | 动态查看日志,方便查看日志新增的信息 |
ctrl+c | 结束查看 |
tar命令 | 位于/bin目录下,它能够将用户所指定的文件或目录打包成一个文件,但不做压缩。一般Linux上常用的压缩方式是选用tar将许多文件打包成一个文件,再以gzip压缩命令压缩成name.tar.gz的文件。 |
-c | 创建一个新的tar文件 |
-v | 显示运行过程的信息 |
-f | 指定文件名 |
-z | 调用gzip压缩命令进行压缩 |
-t | 查看压缩文件的内容 |
-x | 解开tar文件 |
tar –cvf n.tar ./* | 压缩当前目录下的所有文件和目录,文件名为n.tar |
tar –xvf n.tar | 解压压缩包中的文件到当前目录(如果长时间未解压成功 Ctrl+C推出) |
tar –cvzf m.tar.gz ./* | 压缩文件 |
tar -zxvf m.tar.gz | 解压m.tar文件到当前目录 |
grep root /etc/passwd | 在文件中查找关键字root |
grep root /etc/passwd –-color | 高亮显示 |
grep root /etc/passwd –A5 –B5 | 高亮显示,A后5行,B前5行 |
grep -n root /etc/passwd | 查找并显示行数 |
grep -v root /etc/passwd | 取反,查出不含root的数据 |