--------进阶篇------
1.一个典型的SpringMVC请求流程如图所示,详细分为12个步骤:
用户发起请求,由前端控制器DispatcherServlet处理
前端控制器通过处理器映射器查找hander,可以根据XML或者注解去找
处理器映射器返回执行链
前端控制器请求处理器适配器来执行hander
处理器适配器来执行handler
处理业务完成后,会给处理器适配器返回ModeAndView对象,其中有视图名称,模型数据
处理器适配器将视图名称和模型数据返回到前端控制器
前端控制器通过视图解析器来对视图进行解析
视图解析器返回真正的视图给前端控制器
前端控制器通过返回的视图和数据进行渲染
返回渲染完成的视图
将最终的视图返回给用户,产生响应
2.Spring、SpringMVC和Springboot的区别
spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,spring mvc 只是spring 处理web层请求的一个模块。
因此他们的关系大概就是这样:spring mvc < spring < springboot。
spring boot 我理解就是把 spring、spring mvc、spring data jpa(Java持久层API) 等等的一些常用的基础框架组合起来,提供默认的配置,然后
提供可插拔的设计,就是各种 starter ,来方便开发者使用这一系列的技术,套用官方的一句话, spring 家族发展到今天,已经很庞大了,作为一个
开发者,如果想要使用 spring 家族一系列的技术,需要一个一个的搞配置,然后还有个版本兼容性问题,其实挺麻烦的,偶尔也会有小坑出现,其实
蛮影响开发进度, spring boot 就是来解决这个问题,提供了一个解决方案吧,可以先不关心如何配置,可以快速的启动开发,进行业务逻辑编写,各
种需要的技术,加入 starter 就配置好了,直接使用,可以说追求开箱即用的效果吧.
spring 框架有超多的延伸产品例如 boot、security(Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的
安全框架)、jpa … 但它的基础就是 spring 的 ioc 和 aop,ioc 提供了依赖注入的容器,aop 解决了面向横切面的编程。然后在此两者的基础上实
现了其他延伸产品的高级功能
Spring MVC 是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置太复杂了 各种 XML JavaConfig hin 麻烦 于是懒人改
变世界推出了 Spring boot 约定优于配置 简化了 spring 的配置流程.
Spring 最初利用“工厂模式”( DI )和“代理模式”( AOP )解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC 框架(一些用
Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后有发现每次开发都要搞很多依赖,写很多样板代码很麻烦,于是搞了一些懒人整合包(
starter ),这套就是 Spring Boot 。
3.Spring 框架中都用到了哪些设计模式?
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如.?RestTemplate,?JmsTemplate,?JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中
listener的实现–ApplicationListener。
4.springboot优点
独立运行、简化配置、自动配置、无代码生成和XML配置、应用监控、上手容易
5.Spring 注解
Spring 在 2.5 版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代 XML 方式的 bean 描述,可以将 bean 描述转移到组件类的
内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在 XML 注入之前被处理,所以后者会覆盖掉前者对于同一个属性
的处理结果。
注解装配在 Spring 中是默认关闭的。所以需要在 Spring 文件中配置一下才能使用基于注解的装配模式。
几种比较重要的注解类型:
1.@Required:该注解应用于设值方法。
2.@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
3.@Qualifier:该注解和@Autowired 注解搭配使用,用于消除特定 bean 自动装配的歧义。
4.JSR-250 Annotations: Spring 支持基于 JSR-250 注解的以下注解,@Resource、 @PostConstruct 和 @PreDestroy。
6.springmvc 常用注解
@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@PathVariable:用于将请求 URL 中的模板变量映射到功能处理方法的参数上,即取出 uri 模板中的变量作为参数。
@requestParam : 主 要 用 于 在 SpringMVC 后 台 控 制 层 获 取 参 数 , 类 似 一 种 是request.getParameter(“name”),它有三个常用参
数:defaultValue = “0”, required = false, value = “isApp”;defaultValue 表示设置默认值,required 铜过 boolean 设置是否是必须要传
入的参数,value 值表示接受的传入的参数类型。
@ResponseBody : 该 注 解 用 于 将 Controller 的 方 法 返 回 的 对 象 , 通 过 适 当 的HttpMessageConverter 转换为指定格式
后,写入到 Response 对象的 body 数据区。使用时机:返回的数据不是 html 标签的页面,而是其他某种格式的数据时(如 json、xml 等)使用
@RequestBody : 该 注 解 常 用 来 处 理 Content-Type: 不 是 application/x-www-form-urlencoded 编码的内容,例如 application/json,
application/xml 等; @RequestHeader :可以把 Request 请求 header 部分的值绑定到方法的参数上。
@CookieValue :可以把 Request header 中关于 cookie 的值绑定到方法的参数上。
7.SpringMVC 和 Struts2 对比
机制:spring mvc 的入口是 servlet,而 struts2 是 filter(这里要指出,filter 和 servlet 是不同的。以前认为 filter 是 servlet 的一种特
殊),这样就导致了二者的机制不同,这里就牵涉到 servlet 和 filter 的区别了。
性能:spring 会稍微比 struts 快。spring mvc 是基于方法的设计,而 sturts 是基于类,每次发一次请求都会实例一个 action,每个 action 都会
被注入属性,而 spring 基于方法,粒度更细,但要小心把握像在 servlet 控制数据一样。spring3 mvc 是方法级别的拦截,拦截到方法后根据参数上
的注解,把 request 数据注入进去,在 spring3 mvc 中,一个方法对应一个 request 上下文。而 struts2 框架是类级别的拦截,每次来了请求就创
建一个 Action,然后调用 setter getter 方法把 request 中的数据注入;struts2 实际上是通过 setter getter 方法与 request 打交道的;
struts2 中,一个 Action 对象对应一个 request 上下文。
参数传递:struts 是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
设计思想上:struts 更加符合 oop 的编程思想,spring 就比较谨慎,在 servlet 上扩展。
8.Mybatis 的理解
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。
MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录
。
Mybatis 的优点:
1、简单易学。mybatis 本身就很小且简单。没有任何第三方依赖,最简单安装只要两个 jar 加配置几个 sql 映射文件,易于学习,易于使用,通过文
档和源代码,可以比较完全的掌握它的设计思路和实现;
2、灵活。mybatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql 写在 xml 里,便于统一管理和优化。通过 sql 基本上实现不使用数据
访问框架可以实现的所有功能;
3、解除 sql 与程序代码的耦合。通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql 和代码的
分离,提高了可维护性;
4、提供映射标签,支持对象与数据库的 orm 字段关系映射;
5、提供对象关系映射标签,支持对象关系组建维护;
6、提供 xml 标签,支持编写动态 sql。
Mybatis 缓存:
一级缓存:Mybatis 的一级缓存的作用域是 session,当 openSession()后,如果执行相同的SQL(相同语句和参数),Mybatis 不进行执行 SQL,而是
从缓存中命中返回。
二级缓存:Mybatis 的二级缓存的作用域是一个 mapper 的 namespace,同一个 namespace 中查询 sql 可以从缓存中命中。二级缓存是可以跨
session 的。
9.SpringCloud
SpringCloud 简介
spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、
控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
SpringCloud 核心组件
服务注册发现 - Netflix Eureka
配置中心 - spring cloud config
负载均衡-Netflix Ribbon
断路器 - Netflix Hystrix
路由(网关) - Netflix Zuul
10.微服务
微服务是一种可以让软件职责单一、松耦合、自包含、可以独立运行和部署的架构思想。关键思想就是:拆分、单一、独立、组件化。把原本一个庞大
、复杂的项目按业务边界拆分一个一个独立运行的小项目,通过接口的方式组装成一个大的项目。
11.Docker
Docker 简介
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步
的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
Docker 理解
Docker 其实和虚拟机的目的差不多,都是虚拟化技术,但是 docker 比虚拟机更加轻量级,更快,更加易于移植。
镜像: 创建虚拟机和 docker 都必不可少的东西。创建一个虚拟机,就先得下载操作系统的 ISO 镜像文件,然后通过镜像文件安装操作系统,和实体机
类似,然后能在虚拟机中去安装各种软件。
容器: 通俗拿 VM 虚拟机和 Docker 来举例,一个容器就类似于一个虚拟机,只不过在 Docker 技术的术语上称为容器。这个容器里装的就是我们部署
的应用在运行,和虚拟机一样可以开机,关机,重启。Docker 称为容器的运行,关闭,重启。而且这个容器可以打包为镜像文件,类似虚拟机快照的文
件,放在其它虚拟机上又可以保持原样能运行,Docker 也是如此,把容器打包为镜像文件,然后在新的服务器安装好的 Docker 环境下导入进去,保持
原来的状态能够运行。
12.Redis
Redis 简介
Remote Dictionary Server(Redis)是一个基于 key-value 键值对的持久化数据库存储系统。支持多种数据结构,这些数据类型都支持 push/pop、
add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
Redis 支持的数据类型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
Redis 应用场景
缓存
计数器
发布订阅构建消息系统
排行榜
Redis 持久化
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。 AOF 持久化记录服务器执行的所有写操作命令,并在服务
器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以
在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
Redis 的优势
性能极高 – Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。
丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过
MULTI 和 EXEC 指令包起来。丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。
13.Solr
Solr 简介
Solr 是一个基于 Lucene 的 Java 搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。
它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr 已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,所以
Solr 的基本上沿用了 Lucene 的相关术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况
下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如 Nutch、 Luke)也可以使用 Solr
创建的索引。
14.RabbitMQ/ActiveMQ
(1)RabbitMQ 简介
RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
AMQP:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件
可传递消息,并不受产品、开发语言等条件的限制。
RabbitMQ 特点
可靠性(Reliability): 使用持久化、传输确认和发布确认机制来保证可靠性。
灵活的路由(Flexible Routing):在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的
Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
高可用(Highly Available Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
多种协议(Multi-protocol):RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等。多语言客户端(Many Clients):RabbitMQ 几乎支持所有常
用语言,比如 Java、.NET、Ruby等。
管理界面(Management UI):RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
跟踪机制(Tracing):如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
插件机制(Plugin System):RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
RabbitMQ 工作模式
简单模式:一个生产者发送消息到队列,一个消费者接收。
工作队列模式:一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列。
发布/订阅模式:一个生产者发送的消息会被多个消费者获取,每个消费者只能从自己订阅的队列中获取。
路由模式:生产者发布消息的时候添加路由键,消费者绑定队列到交换机时添加键值,这样就可以接收到需要接收的消息。
通配符模式:基本思想和路由模式是一样的,只不过路由键支持模糊匹配,符号“#”匹配一个或多个词,符号“*”只匹配一个词。
(2)ActiveMQ 简介
ActiveMQ 是 Apache 推出的一款开源的,完全支持 JMS1.1 和 J2EE1.4 规范的 JMS Provider 实现的消息中间件。
ActiveMQ 工作模式
点对点模式:一个消息只有一个消费者消费。
发布/订阅模式:订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS 规范允许客户创建持久订阅,这在一定程度上放松了时间上的相关性要
求。持久订阅允许消费者消费它在未处于激活状态时发送的消息。
15.Dubbo
Dubbo 简介
Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
其核心部分包括:
远程通讯:提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型、序列化、"请求-响应"模式的信息交换方案;
集群容错:提供基于借口方法的透明远程过程调用,包括多协议支持、软负载均衡、失败容错、地址路由、动态配置等集群支持;
自动发现:基于注册中心目录服务,使服务消费方能动态地查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo 开发流程
第一步:要在系统中使用 dubbo 应该先搭建一个注册中心,一般推荐使用 zookeeper;第二步:有了注册中心然后是发布服务,发布服务需要使用
spring 容器和 dubbo 标签来发布服务。并且发布服务时需要指定注册中心的位置;
第三步:服务发布之后就是调用服务。一般调用服务也是使用 spring 容器和 dubbo 标签来引用服务,这样就可以在客户端的容器中生成一个服务的代
理对象,在 action 或者 Controller 中直接调用 service 的方法即可。
16.FastDFS
FastDFS 简介
FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海
量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server 和 group,每个 storage 在启动后会连接
Tracker,告知自己所属 group 等信息,并保持周期性心跳。
Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
17.Nginx
Nginx 简介
Nginx 是一款高性能的 http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师 Igor Sysoev 所开发,官方测试
nginx 能够支支撑 5 万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定。
Nginx 功能
静态 HTTP 服务器:Nginx 是一个 HTTP 服务器,可以将服务器上的静态文件(如 HTML、图片)通过 HTTP 协议展现给客户端。
反向代理服务器:客户端本来可以直接通过 HTTP 协议访问某网站应用服务器,但如果单台服务器承受不住压力需要使用多台服务器共同处理请求,这
时可以在中间加上一个 Nginx,客户端请求 Nginx,Nginx 请求应用服务器,然后将结果返回给客户端,此时 Nginx 就是反向代理服务器。
负载均衡:当客户端访问量很大,通过反向代理的方式,使用轮询、加权轮询和 IP Hash 的策略将请求分配给多台服务器。
18.Quartz
Quartz 简介
Quartz 是一个任务调度框架。它具有以下特点:
强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升;
作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。
Quartz 核心元素
Scheduler:任务调度器,实际执行任务调度的控制器。在 spring 中通过 SchedulerFactoryBean 封装起来;
Trigger :触发器,用于定义任务调度的时间规则,有 SimpleTrigger 、 CronTrigger 、DateIntervalTrigger 和 NthIncludedDayTrigger,其中
CronTrigger 用的比较多,在 spring 中封装在 CronTriggerFactoryBean 中;
Calendar:一些日历特定时间点的集合。一个 trigger 可以包含多个 Calendar,以便排除或
包含某些时间点;
JobDetail:用来描述 Job 实现类及其它相关的静态信息。如 Job 名字、关联监听器等信息。在 spring 中有 JobDetailFactoryBean 和
MethodInvokingJobDetailFactoryBean 两种实现,如果任务调度只需要执行某个类的某个方法,可以通过 MethodInvokingJobDetailFactoryBean 来调
用;
Job:是一个接口,只有一个方法 void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext 类提供了调
度上下文的各种信息。Job 运行时的信息保存在 JobDataMap 实例中。实现 Job 接口的任务,默认是无状态的,若要将 Job 设置成有状态的,在
quartz 中是给实现的 Job 添加@DisallowConcurrentExecution 注解,在与 spring 结合中可以在 spring 配置文件的 job detail 中配置concurrent
参数。