Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC、SpringBoot、SpringCloud、SpringCloud Dataflow等解决方案。
有人亲切的称之为:Spring全家桶。
很多研发人员把Spring看作心目中最好的java项目,没有之一。
工作中必须会,面试时肯定考。
那么,今天花10分钟,梳理Spring框架相关知识吧。
也就是我们经常说的Spring框架,包括了ioc依赖注入,context上下文、bean管理、springmvc等众多功能模块,其他spring项目比如spring boot也会依赖spring框架。
它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和Spring Cloud联合部署。Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。
是一个数据访问及操作的工具集,封装了多种数据源的操作能力,包括jdbc、Redis、MongoDB、Elasticsearch等。
是一套完整的微服务解决方案,是一系列不同功能的微服务框架的集合。Spring Cloud基于Spring Boot,简化了分布式系统的开发,集成了服务发现、配置管理、消息总线、负载均衡、断路器、数据监控等各种服务治理能力。
比如sleuth提供了全链路追踪能力,Netflix套件提供了hystrix熔断器、zuul网关等众多的治理组件。config组件提供了动态配置能力,bus组件支持使用RabbitMQ、kafka、ActiveMQ等消息队列,实现分布式服务之间的事件通信。
主要用于快速构建安全的应用程序和服务,在Spring Boot和Spring Security OAuth2的基础上,可以快速实现常见的安全模型,比如单点登录,令牌中继和令牌交换。你可以了解一下oauth2授权机制和jwt认证方式。
oauth2是一种授权机制,规定了完备的授权、认证流程。JWT全称是JSON Web Token,是一种把认证信息包含在token中的认证实现,oauth2授权机制中就可以应用jwt来作为认证的具体实现方法。
Struts是曾经非常火爆的web组合SSH中的控制层。我们知道web服务一般都采用MVC分层模型构建,就是model层负责内部数据模型,controller负责请求的分发控制,view层负责返回给用户展示的视图。struts实现的就是其中控制层的角色。
Struts采用Filter实现,针对类进行拦截,每次请求就会创建一个Action。使用Struts的SSH组合已经逐渐被使用SpringMVC的SSM组合代替,也就是SpringMVC+Spring+MyBatis组合,
一方面原因是由于struts对几次安全漏洞的处理,让大家对struts的信心受到影响;
另一方面,springmvc更加的灵活,不需要额外的配置,不存在和spring整合等问题,使用更加方便,所以建议以SSM框架的学习为主。
ORM就是对象关系匹配,是为了解决面向对象与关系数据库存在的互不匹配的问题。简单来说,就是把关系数据库中的数据转换成面向对象程序中的对象。常用的ORM框架有Hibernate和MyBatis,也就是SSH组合和SSM组合中的H和M。
Hibernate对数据库结构提供了完整的封装,实现了POJO对象与数据库表之间的映射,能够自动生成并执行SQL语句。只要定义了POJO到数据库表的映射关系,就可以通过Hibernate提供的方法完成数据库操作。Hibernate符合JPA规范,就是Java持久层API。
MyBatis通过映射配置文件,将SQL所需的参数和返回的结果字段映射到指定对象,MyBatis不会自动生成SQL,需要自己定义SQL语句,不过
更方便对SQL语句进行优化。
1.Hibernate配置要比MyBatis复杂的多,学习成本也比MyBatis高。MyBatis,简单、高效、灵活,但是需要自己维护SQL。
2.Hibernate功能强大、全自动、适配不同的数据库,但是是非常复杂,灵活性稍差。
Netty是一个高性能的异步事件驱动的网络通信框架,Netty对JDK原生NIO进行封装,简化了网络服务的开发。下文会详细讲解。
另外,同类型的框架还有mina、grizzly,不过目前是用的相对较少,一般不会在面试中出现,可以作为兴趣简单了解。
Motan、Dubbo、gRPC都是比较常用的高性能rpc框架,可以提供完善的服务治理能力,java版本的通信层都是基于前面提到的Netty实现。它们的特点稍后介绍。
jersy和restEasy都是可以快速开发restful服务的框架。
和SpringMVC相比,这两个框架都是基于jax-rs标准,而SpringMVC基于servlet,使用自己构建的API,是两个不同的标准。
Shiro框架是一个与Spring Security类似的开源的权限管理框架,用于访问授权、认证、加密、及会话管理。能够支持单机与分布式session管理。相比security,shiro更加简单易用。
本文涉及的流程与实现默认都是基于最新的5.x版本。
spring中的几个重要概念如下:
IOC,就是控制反转,拿公司招聘岗位来举例:
假设一个公司有产品、研发、测试等岗位。如果是公司根据岗位要求,逐个安排人选,这是正向流程。如果反过来,不用公司来安排候选人,而是由第三个猎头来匹配岗位和候选人,然后进行推荐,这就是控制反转。
在spring中,对象的属性是由对象自己创建的,就是正向流程;如果属性不是对象创建的,而是由spring来自动进行装配,就是控制反转。这里的DI也就是依赖注入,就是实现控制反转的方式。正向流程导致了对象与对象之间的高耦合,IOC可以解决对象耦合的问题,有利于功能的复用,能够使程序的结构变得非常灵活。
spring进行IOC实现时使用的有两个概念:context上下文和bean。
所有被spring管理的、由spring创建的、用于依赖注入的对象,就叫做一个bean。Spring创建并完成依赖注入后,所有的bean统一放在一个叫做context的上下文中进行管理。
AOP就是面向切面编程。一般程序执行流程是从controller层调用service层、然后service层调用DAO层访问数据,最后在逐层返回结果。
但是,一个系统中会有多个不同的服务,列如用户服务、商品信息服务等等,每个服务的controller层都需要验证参数,都需要处理异常,如果对不同服务的纵向处理流程进行横切,在每个切面上完成通用的功能,例如身份认证、验证参数、处理异常等等,这样就不用在每个服务中都写相同的逻辑了,这就是AOP思想解决的问题。
AOP以功能进行划分,对服务顺序执行流程中的不同位置进行横切,
完成各服务共同需要实现的功能。
目前最新的5.x版本中的portlet组件已经被废弃忘掉,
同时增加了用于异步响应式处理的WebFlux组件。
你并不需要对所有的组件都详细了解,只需重点了解最常用的几个组件实现,以及知道每个组价用来实现哪一类功能。
core组件是spring所有组件的核心;
bean组件和context组件刚才提到了,是实现IOC和依赖注入的基础;
AOP组件用来实现面向切面编程;
web组件包括springmvc是web服务的控制层实现。
AOP的实现是通过代理模式,在调用对象的某个方法时,执行插入的切面逻辑。实现的方式有动态代理也叫运行时增强,比如jdk代理、CGLIB;静态代理是在编译是进行织入或类加载时进行织入,比如AspectJ。
关于AOP还需要了解一下对应的Aspect、pointcut、advice等注解和具体使用方式。
主要需要了解替换发生的时间,是在bean definition创建完成后,bean初始化之前,是通过实现BeanFactoryPostProcessor接口实现的。主要实现方式有PropertyPlaceholderConfigurer和PropertySourcesPlaceholderConfigurer。这两个类实现逻辑不一样,spring boot使用PropertySourcesPlaceholderConfigurer实现。
需要了解spring中对事务规定的隔离类型和事务传播类型。要知道事务的隔离级别是由具体的数据库来实现的。
事务的传播类型,可以重点了解最常用的REQUIRED和SUPPORTS类型。
ApplicationContext保存了ioc的整个应用上下文,可以通过其中的beanfactory获取到任意bean;
BeanFactory主要的作用是根据bean definition来创建具体的bean;
BeanWrapper是对Bean的包装,一般情况下是在spring ioc内部使用,提供了访问bean的属性值、属性编辑器注册、类型转换等功能,方便ioc容器统一的方式来访问bean的属性;
FactoryBean通过getObject方法返回实际的bean对象,例如motan框架中referer对service的动态代理就是通过FactoryBean来实现的。
bean的scope是指bean的作用域,默认情况下是单例模式,这也是使用最多的一种方式;多例模式,即每次从beanFactory中获取bean都会创建一个新的bean。
request、session、global-session是在web服务中使用的scope,request每次请求都创建一个实例,session是在一个会话周期内保证只有一个实例。
global-session在5.x版本中已经不在使用,同时增加了Application和Websocket两种scope,分别保证在一个ServletContext与一个WebSocket中只创建一个实例。
spring的事件机制需要知道spring定义的五种标准事件。
1.上下文更新事件(ContextRefreshedEvent):该事件会在ApplicationContext被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
2.上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
3.上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
4.上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
5.请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。
要是还有不太明白的地方请留言,评论必回
要是对我的文章感兴趣的话,关注一下吧,谢谢!