点关注,不迷路;持续更新Java架构相关技术及资讯热文!!!
Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解决方案。java
不少研发人员把spring看做心目中最好的java项目,没有之一。web
因此这是重点也是难点,工做中必须会,面试时确定考。面试
那么,今天花费10分钟,梳理Spring框架相关知识。spring
spring系列包含很是多的项目,能够知足java开发中的方方面面。sql
先来看经常使用框架的知识点汇总,如图:数据库
Ⅰ、5个经常使用的spring框架编程
1.spring frameworkbootstrap
也就是咱们常常说的spring框架,包括了ioc依赖注入,Context上下文、bean管理、springmvc等众多功能模块,其它spring项目好比spring boot也会依赖spring框架。api
2.spring boot缓存
它的目标是简化Spring应用和服务的建立、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,能够和spring cloud联合部署。
Spring Boot的核心思想是约定大于配置,应用只须要不多的配置便可,简化了应用开发模式。
3.Spring Data
是一个数据访问及操做的工具集,封装了多种数据源的操做能力,包括:jdbc、Redis、MongoDB等。
4.Spring Cloud
是一套完整的微服务解决方案,是一系列不一样功能的微服务框架的集合。Spring Cloud基于Spring Boot,简化了分布式系统的开发,集成了服务发现、配置管理、消息总线、负载均衡、断路器、数据监控等各类服务治理能力。好比sleuth提供了全链路追踪能力,Netflix套件提供了hystrix熔断器、zuul网关等众多的治理组件。config组件提供了动态配置能力,bus组件支持使用RabbitMQ、kafka、Activemq等消息队列,实现分布式服务之间的事件通讯。
5. Spring Security
主要用于快速构建安全的应用程序和服务,在Spring Boot和Spring Security OAuth2的基础上,能够快速实现常见安全模型,如单点登陆,令牌中继和令牌交换。你能够了解一下oauth2受权机制和jwt认证方式。oauth2是一种受权机制,规定了完备的受权、认证流程。JWT全称是JSON Web Token,是一种把认证信息包含在token中的认证明现,oauth2受权机制中就能够应用jwt来做为认证的具体实现方法。
Ⅱ、Struts的具体做用
struts是曾经很是火爆的web组合ssh中的控制层。咱们知道web服务通常都采用MVC分层模型构建,就是model层负责内部数据模型,controller负责请求的分发控制,view层负责返回给用户展现的视图。struts实现的就是其中控制层的角色。
Struts采用Filter实现,针对类进行拦截,每次请求就会建立一个Action。使用struts的SSH组合已经逐渐被使用springMVC的SSM组合代替,也就是Spring-MVC+Spring+MyBatis的组合,一方面缘由是因为struts对几回安全漏洞的处理,让你们对struts的信心受到影响;另外一方面,springmvc更加的灵活,不须要额外配置,不存在和spring整合等问题,使用更加方便,因此建议以SSM框架的学习为主。
Ⅲ、经常使用的ORM框架
ORM就是对象关系匹配,是为了解决面向对象与关系数据库存在的互不匹配的问题。简单来讲,就是把关系数据库中的数据转换成面向对象程序中的对象。
经常使用的ORM框架有Hibernate和MyBatis,也就是ssh组合和ssm组合中的h与m。
它们的特色和区别以下:
Hibernate对数据库结构提供了完整的封装,实现了POJO对象与数据库表之间的映射,可以自动生成并执行SQL语句。只要定义了POJO 到数据库表的映射关系,就能够经过Hibernate提供的方法完成数据库操做。Hibernate符合JPA规范,就是Java持久层API。
mybatis经过映射配置文件,将SQL所需的参数和返回的结果字段映射到指定对象,mybatis不会自动生成sql,须要本身定义sql语句,不过更方便对sql语句进行优化。
总结起来:
Ⅳ、Netty简介
Netty是一个高性能的异步事件驱动的网络通讯框架,Netty对JDK原生NIO进行封装,简化了网络服务的开发。下文会详细讲解
另外,同类型的框架还有mina、grizzly,不过目前使用的相对较少,通常不会在面试中出现,能够做为兴趣简单了解。
Ⅴ、RPC服务
Motan、Dubbo、gRPC都是比较经常使用的高性能rpc框架,能够提供完善的服务治理能力,java版本的通讯层都是基于前面提到的Netty实现。它们的特色稍后介绍。
Ⅵ、其余经常使用框架
jersy和restEasy都是能够快速开发restful服务的框架。
和springmvc相比,这两个框架都是基于jax-rs标准,而springmvcs基于servlet,使用本身构建的API,是两个不一样的标准。
shiro框架是一个与spring security相似的开源的权限管理框架,用于访问受权、认证、加密及会话管理。可以支持单机与分布式session管理。
相比security,shiro更加简单易用。
Ⅰ、spring基本概念
本文涉及的流程与实现默认都是基于最新的5.x版本。
spring中的几个重要概念以下:
1.IOC
IOC,就是控制反转,如最左边,拿公司招聘岗位来举例:
假设一个公司有产品、研发、测试等岗位。若是是公司根据岗位要求,逐个安排人选,如图中向下的箭头,这是正向流程。若是反过来,不用公司来安排候选人,而是由第三方猎头来匹配岗位和候选人,而后进行推荐,如图中向上的箭头,这就是控制反转。
在spring中,对象的属性是由对象本身建立的,就是正向流程;若是属性不是对象建立,而是由spring来自动进行装配,就是控制反转。这里的DI也就是依赖注入,就是实现控制反转的方式。正向流程致使了对象于对象之间的高耦合,IOC能够解决对象耦合的问题,有利于功能的复用,可以使程序的结构变得很是灵活。
2.context上下文和bean
spring进行IOC实现时使用的有两个概念:context上下文和bean。
如中间图所示,全部被spring管理的、由spring建立的、用于依赖注入的对象,就叫作一个bean。Spring建立并完成依赖注入后,全部bean统一放在一个叫作context的上下文中进行管理。
3.AOP
AOP就是面向切面编程。如右面的图,通常程序执行流程是从controller层调用service层、而后service层调用DAO层访问数据,最后在逐层返回结果。
这个是图中向下箭头所示的按程序执行顺序的纵向处理。可是,一个系统中会有多个不一样的服务,例如用户服务、商品信息服务等等,每一个服务的controller层都须要验证参数,都须要处理异常,若是按照图中红色的部分,对不一样服务的纵向处理流程进行横切,在每一个切面上完成通用的功能,例如身份认证、验证参数、处理异常等等、这样就不用在每一个服务中都写相同的逻辑了,这就是AOP思想解决的问题。
AOP以功能进行划分,对服务顺序执行流程中的不一样位置进行横切,完成各服务共同须要实现的功能。
Spring框架组件
上图列出了spring框架主要包含的组件。这张图来自spring4.x的文档。目前最新的5.x版本中右面的portlet组件已经被废弃掉,同时增长了用于异步响应式处理的WebFlux组件。
并不须要对全部的组件都详细了解,只需重点了解最经常使用的几个组件实现,以及知道每一个组件用来实现哪一类功能。
图中红框是比较重要的组件,core组件是spring全部组件的核心;bean组件和context组件我刚才提到了,是实现IOC和依赖注入的基础;AOP组件用来实现面向切面编程;web组件包括springmvc是web服务的控制层实现。
1.AOP
AOP的实现是经过代理模式,在调用对象的某个方法时,执行插入的切面逻辑。实现的方式有动态代理也叫运行时加强,好比jdk代理、CGLIB;静态代理是在编译时进行织入或类加载时进行织入,好比AspectJ。
关于AOP还须要了解一下对应的Aspect、pointcut、advice等注解和具体使用方式。
2.placeHolder动态替换
主要须要了解替换发生的时间,是在bean definition建立完成后,bean初始化以前,是经过实现BeanFactoryPostProcessor接口实现的。主要实现方式有PropertyPlaceholderConfigurer和PropertySourcesPlaceholderConfigurer。这两个类实现逻辑不同,spring boot使用PropertySourcesPlaceholderConfigurer实现。
3.事务
须要了解spring 中对事务规定的隔离类型和事务传播类型。要知道事务的隔离级别是由具体的数据库来实现的,在数据库部分我会详细介绍。
事务的传播类型,能够重点了解最经常使用的REQUIRED和SUPPORTS类型。
4.核心接口类
5.Scope
bean的scope是指bean的做用域,默认状况下是单例模式,这也是使用最多的一种方式;多例模式,即每次从beanFactory中获取bean都会建立一个新的bean。
request、session、global-session是在web服务中使用的scope,request每次请求都建立一个实例,session是在一个会话周期内保证只有一个实例。
global-session在5.x版本中已经不在使用,同时增长了Application和Websocket两种scope,分别保证在一个ServletContext与一个WebSocket中只建立一个实例。
6.事件机制
spring的事件机制须要知道spring定义的五种标准事件,具体事件可见上图,了解如何自定义事件和实现对应的applicationListener来处理自定义事件。
1.经常使用注释
a.类型类注释:
类型类注释包括controller、service等,须要重点了解
其中component和bean注解的区别以下:
b.设置类注解
重点了解@Autowire和@Qualifier以及bytype、byname等不一样的自动装配机制。
c.web类注解
主要以了解为主,关注@RequestMapping、@GetMapping、@PostMapping等路径匹配注解,以及@PathVariable、@RequestParam 等参数获取注解。
d.功能类注解
包括@ImportResource引用配置、@ComponentScan注解自动扫描、@Transactional事务注解等等,这里不一一介绍了。
2.配置方式
须要了解配置spring的几种方式,xml文件配置、注解配置和使用api进行配置。
自动装配机制须要了解按类型匹配进行自动装配,按bean名称进行自动装配,构造器中的自动装配和自动检测等主要的四种方式。
还须要了解一下list、set、map等集合类属性的配置方式以及内部bean的使用。
Spring Context初始化流程
图中左上角是三种类型的context,xml配置方式的context、springboot的context和web服务的context。不论哪一种context,建立后都会调用到AbstractApplicationContext类的refresh方法,这个方法是咱们要重点分析的。
refresh方法中,操做共分13步:
第1步:对刷新进行准备,包括设置开始时间、设置激活状态、初始化context环境中的占位符,这个动做根据子类的需求由子类来执行,而后验证是否缺失必要的properties;
第2步:刷新并得到内部的bean factory;
第3步:对bean factory进行准备工做,好比设置类加载器和后置处理器、配置不进行自动装配的类型、注册默认的环境bean;
第4步:为context的子类提供后置处理bean factory的扩展能力。若是子类想在bean定义加载完成后,开始初始化上下文以前作一些特殊逻辑,能够复写这个方法;
第5步,执行context中注册的bean factory后缀处理器;
注:这里有两种后置处理器,一种是能够注册bean的后缀处理器,另外一种是针对bean factory进行处理的后置处理器。执行的顺序是,先按优先级执行可注册bean的处理器,在按优先级执行针对beanfactory的处理器。对springboot来讲,这一步会进行注解bean definition的解析。流程如右面小框中所示,由ConfigurationClassPostProcessor触发、由ClassPathBeanDefinitionScanner解析并注册到bean factory。
第6步:按优先级顺序在beanfactory中注册bean的后缀处理器,bean后置处理器能够在bean初始化前、后执行处理;
第7步:初始化消息源,消息源用来支持消息的国际化;
第8步:初始化应用事件广播器。事件广播器用来向applicationListener通知各类应用产生的事件,是一个标准的观察者模式;
第9步:是留给子类的扩展步骤,用来让特定的context子类初始化其余的bean;
第10步:把实现了ApplicationListener的bean注册到事件广播器,并对广播器中的早期未广播事件进行通知;
第11步:冻结全部bean描述信息的修改,实例化非延迟加载的单例bean;
第12步:完成上下文的刷新工做,调用LifecycleProcessor的onFresh()方法以及发布ContextRefreshedEvent事件;
第13步:在finally中,执行第十三步,重置公共的缓存,好比ReflectionUtils中的缓存、AnnotationUtils中的缓存等等;
至此,spring的context初始化完成。这里仅介绍了最主要的主流程,建议课后阅读源码来复习这个知识点,补全细节。
Spring中bean的生命周期
面试中常常问到的bean的生命周期,先看绿色的部分,bean的建立过程:
第1步:调用bean的构造方法建立bean;
第2步:经过反射调用setter方法进行属性的依赖注入;
第3步:若是实现BeanNameAware接口的话,会设置bean的name;
第4步:若是实现了BeanFactoryAware,会把bean factory设置给bean;
第5步:若是实现了ApplicationContextAware,会给bean设置ApplictionContext;
第6步:若是实现了BeanPostProcessor接口,则执行前置处理方法;
第7步:实现了InitializingBean接口的话,执行afterPropertiesSet方法;
第8步:执行自定义的init方法;
第9步:执行BeanPostProcessor接口的后置处理方法。
这时,就完成了bean的建立过程。
在使用完bean须要销毁时,会先执行DisposableBean接口的destroy方法,而后在执行自定义的destroy方法。
这部分也建议阅读源码加深理解。
Spring扩展接口
对spring进行定制化功能扩展时,能够选择以下一些扩展点:
1.BeanFactoryPostProcessor
是beanFactory后置处理器,支持在bean factory标准初始化完成后,对bean factory进行一些额外处理。在讲context初始化流程时介绍过,这时全部的bean的描述信息已经加载完毕,可是尚未进行bean初始化。例如前面提到的PropertyPlaceholderConfigurer,就是在这个扩展点上对bean属性中的占位符进行替换。
2.BeanDefinitionRegistryPostProcessor
它扩展自BeanFactoryPostProcessor,在执行BeanFactoryPostProcessor的功能前,提供了能够添加bean definition的能力,容许在初始化通常bean前,注册额外的bean。例如能够在这里根据bean的scope建立一个新的代理bean。
3.BeanPostProcessor
提供了在bean初始化以前和以后插入自定义逻辑的能力。与BeanFactoryPostProcessor的区别是处理的对象不一样,BeanFactoryPostProcessor是对beanfactory进行处理,BeanPostProcessor是对bean进行处理。
注:上面这三个扩展点,能够经过实现Ordered和PriorityOrdered接口来指定执行顺序。实现PriorityOrdered接口的processor会先于实现Ordered接口的执行。
4.ApplicationContextAware
能够得到ApplicationContext及其中的bean,当须要在代码中动态获取bean时,能够经过实现这个接口来实现。
5.InitializingBean
能够在bean初始化完成,全部属性设置完成后执行特定逻辑,例如对自动装配对属性进行验证等等。
6.DisposableBean
用于在bean被销毁前执行特定的逻辑,例如作一些回收工做等。
7.ApplicationListener
用来监听spring的标准应用事件或者自定义事件。
Ⅷ、springboot相关的知识点
1.启动流程
主要步骤首先要配置environment,而后准备context上下文,包括执行applicationContext的后置处理、初始化initializer、通知listener处理contextPrepared和contextLoaded事件。最后执行refreshContext,也就是前面介绍过的AbstractApplicationContext类的refresh方法。
2.配置文件
而后要知道在Spring Boot中有两种上下文,一种是bootstrap, 另一种是application。
bootstrap是应用程序的父上下文,也就是说bootstrap会先于applicaton加载。bootstrap主要用于从额外的资源来加载配置信息,还能够在本地外部配置文件中解密属性。bootstrap里面的属性会优先加载,默认也不能被本地相同配置覆盖。
3.注解
@SpringBootApplication包含了@ComponentScan、@EnableAutoConfiguration、@SpringBootConfiguration三个注解
而@SpringBootConfiguration注解包含了@Configuration注解。也就是springboot的自动配置功能。
@Conditional注解就是控制自动配置的生效条件的注解,例如bean或class存在、不存在时进行配置,当知足条件时进行配置等等。
4.特点模块
以上为Spring框架须要掌握的内容,前面提到的核心机制、核心流程,建议阅读源码加深理解。
我们来一块儿抱团取暖,好吗?【Java高级互联网架构:964357187】群内有免费分享最新Java架构教学视频,面试题,编程书籍
点关注,不迷路;持续更新Java架构相关技术及资讯热文!!!