前言
在看狂神频道的时候偶然发现下图,感触颇深。特别在当今【程序 = 业务 + 框架】思想盛行的开发者中,夯实基础基础显得格外重要,因此开此专栏总结记录。
对于Spring框架的知识,已经在学习设计模式的时候练习过一轮,接下来不断温故而知新哈哈,学习记录回顾:
必会框架Spring
知识点汇总:
另外和之前一样,我会在课后附上面试,考察点加分项以及若干真题,先来看看常用框架的知识点汇总,看到这张脑图
- 左上方第一个是大名鼎鼎的spring 系列,许多研发人员把spring 看作心目中最好的java 项目,没有之一
- Spring:
- spring 系列包含非常多的项目,可以满足java 开发中的方方面面,这里我们来看看几个常用的spring 框架:
- spring framework 也就是我们常说的spring 框架,包括了
- AOP和IOC
- context上下文bean 管理
- spring mvc 等众多的功能模块
- 其他spring 项目,比如SpringBoot也会依赖spring 框架,
- SpringBoot的目标是简化spring 应用和服务的创建开发与部署,简化了配置文件,使用嵌入式外部服务
- 还有诸多开箱即用的微服务功能,可以和spring cloud 联合部署
- SpringBoot的核心思想是约定大于配置应用,只需要很少的配置即可,简化了应用开发模式
- spring data 是一个数据访问及操作的工具,集封装了对多种数据源的操作能力,用于简化数据库访问,支持NoSQL和 关系数据库存储。其主要目标是使数据库的访问Bean得方便快捷:
- Nosql:
- MongoDB(文档数据库)
- Neo4j (图形数据库)
- Redis(键/值存储)
- Hbase(列族数据库)
- 关系型数据库存储技术:
- JDBC
- JPA
- Nosql:
- spring cloud 是 一套完整的微服务解决方案,是一系列不同功能的微服务框架的集合
- spring cloud 基于SpringBoot简化了分布式系统的开发,集成了服务发现,配置管理消息,总线负载均衡,断路器数据监控等各种服务治理能力
- Sleuth 提供了全链路追踪能力
- Netflix 套件提供了high strict 熔断器,做网关等众多的治理组件
- Config 组件提供了动态配置能力
- Bus 组件支持了rabbitMQ ,kafka,activeMQ 等消息队列实现分布式服务之间的事件通信
- spring cloud 基于SpringBoot简化了分布式系统的开发,集成了服务发现,配置管理消息,总线负载均衡,断路器数据监控等各种服务治理能力
- spring security用于快速构建安全的应用程序和服务
- 在SpringBoot和Spring Security OAuth2 的基础上,可以快速实现常见安全模型,
- 比如单点登录令牌,中继令牌交换
- 这里可以了解一下的OAuth2 授权机制和JWT的认证方式
- OAuth2 是一种授权机制,规定了完备的授权认证流程
- JWT全称呢是jason web token,是一种把认证信息包含在token 中的认证实现
- OAuth2 的授权机制就可以应用JWT来作为认证的具体实现方法
- Struts:
- 第二个知识点是Struts,它是曾经非常火爆的外部组合SSH中的控制层
- 我们知道外部服务,一般都采用mvc 分层模型构建:
- model 层负责内部数据模型,controller 负责请求的分发控制,view负责返回给用户展示的视图
- Struts 实现的就是其中控制层的角色,Struts采用filter 实现针对lay 进行拦截,每次请求就会创建一个action
- 不过使用struts 的ssh 组合已经逐渐被使用spring mvc 的ssm 组合代替,也就是springMVC spring mybatis的组合
- 一方面原因是由于stress 对几次安全漏洞的处理,让大家对Struts 的信心受到了影响,
- 另一方面,springmvc 更加灵活不需要额外配置,不存在和spring 整合的问题,使用更加方便,
- 所以建议以s s m 框架的学习为主
- ORM框架:
- ORM就是对象关系匹配是为了解决面向对象与关系数据库存在互相不匹配的问题,简单来说就是把关系数据库中的数据转化成面向对象
- 程序中的对象常用的ORM框架有Hibernate 和Mybatis,也就是SSH组合和SSM 组合中的H与M,我们来看一下它们的特点和区别:
- Hibernate :
- 对数据库结构提供了完整的封装,实现了POJO对象与数据库表之间的映射,能够自动生成并执行SQL 语句
- 只要定义了POJO到数据库表的映射关系,就可以通过Hibernate提供的方法完成数据库操作
- Hibernate符合JPA规范,就是java 持久层API
- Mybatis:
- 通过映射配置文件将SQL 所需的参数和返回的结果映射到指定对象
- Mybatis 不会自动生成SQL, 需要自己定义SQL 语句
- 不过这样也更方便对SQL 语句进行优化
- 现在也有MyBatis-Plus
- 总结起来:
- hibernate 配置要比Mybatis复杂,学习成本也比Mybatis高,
- Mybatis简单高效灵活,但是需要自己维护SQL
- hibernate 功能强大,全自动适配不同数据库,但是非常复杂,灵活性稍差
- Netty:
- 是一个高性能的异步事件驱动的网络通信框架,Netty 对JDK原生的NIO进行封装
- 简化了网络服务的开发,Netty 的知识点详解
- RPC:
- Motan,Dubbo,Grpc都是比较常用的高性能RPC框架,可以提供完善的服务治理能力
- java 版本的通信层都是基于前面提到的Netty 实现的,它们的特点也会在详解中进行介绍
- 其他框架:
- Shiro框架是一个与spring security 类似的开源权限管理框架,用于访问的授权认证,加密及会话管理,能够支持单机与分布式的session 管理,相比security 是Shrio更加简单易用
Spring框架
spring 框架讲解中涉及的流程与实现,默认都是基于5.x版本,先来看spring 中的几个重要概念
-
IOC:
- 拿公司招聘岗位来举个例子:假设一个公司有产品研发,测试等岗位
- 如果是公司根据岗位要求,如何安排人选,如图中向下的箭头,这就是正向流程
- 如果反过来,不用公司来安排人选,而是由第三方猎头来匹配岗位和候选人然后进行推荐,如图中向上的箭头
- 这就是控制反转在spring 中,对象的属性是由对象自己创建的,这是正向流程
- 如果属性不是对象创建,而是由来自动进行装配,这就是控制反转
- 这里的DI 也就是依赖注入,是实现控制反转的一种方式
- 正向流程导致了对象与对象之间的高耦合,IOC 可以解决对象耦合的问题,有利于功能的复用,能够使程序的结构Bean得非常灵活
- 拿公司招聘岗位来举个例子:假设一个公司有产品研发,测试等岗位
-
Context & Bean:
- 这两个是spring 进行IOC实现时使用的两个概念,context 上下文和bean 如中间图所示
- 所有被spring 管理的由spring 创建的用于依赖注入的对象就叫做一个Bean
- spring 创建并完成依赖注入后所有的bean 统一放在一个叫做context 上下文中进行管理
-
AOP:
也就是面向切面编程,看右面的图:
- 一般我们的程序执行流程是从controller,调用service 层,然后service 层调用DAO层访问数据,最后再逐层返回结果
- 这是一个图中向下箭头所示的,按程序执行顺序的纵向处理
- 但是我们思考这样一个问题,一个系统中会有多个不同的服务:
- 例如用户服务,商品信息服务等等
- 每个服务的controller 层都需要验证参数,都需要处理异常,如果按照图中红色的部分,对不同服务的纵向处理流程中进行横切,在每个切面上完成通用的功能:
- 例如身份验证,参数验证异常处理等等
- 这样就不用在每个服务中都写相同的逻辑了,这就是AOP思想解决的问题,aop功能进行划分对服务顺序执行流程中的不同位置进行横切,完成各服务共同需要实现的功能
Spring框架组件:
图中列出了spring 框架主要包含的组件:
- 这张图来自spring 4.X 的文档,目前5.X版本中右面的Portlet组件已经被废弃掉,同时增加了用于异步响应式处理的WebFlux组件,这里你不需要对所有组件都详细了解
- 只需要重点了解最常用的几个组件实现,以及知道每个组件用来实现哪一类功能就可以了
- 图中红框框住的是比较重要的组件:
- Core组件是spring 所有组件的核心
- Bean组件和Context组件, 刚才我提到了,是实现IOC和依赖注入的基础
- AOP组件用来实现面向切面编程,外部组件包括了springMVC,是外部服务的控制层实现
Spring中的机制与实现:
-
AOP:
-
aop的实现是通过代理模式在调用对象的某个方法时执行插入的切面逻辑,
-
实现的方式有动态代理,也叫做运行式增强:
- 比如JDK代理,cglib
-
还有静态代理,就是在编译时进行植入或者类加载时进行植入
- 比如aspectj
-
关于 AOP还需要了解一下对应的注解:
- aspect
- pointcut
- advice 等注解和具体的使用方式
【SpringBoot-3】切面AOP实现权限校验:实例演示与注解全解
@Aspect:作用是把当前类标识为一个切面供容器读取 @Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。 @Around:环绕增强,相当于MethodInterceptor @AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行 @Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有 @AfterThrowing:异常抛出增强,相当于ThrowsAdvice @After: final增强,不管是抛出异常或者正常退出都会执行
-
placeholder 动态替换
- 主要需要了解替换发生的时间是在Bean define创建完成后
- bean 初始化之前是通过实现Beanfactory,BeanPostProcessor接口实现的
-
事务
- 需要了解Spring中对事务规定的隔离类型和事务传播类型
- 这里需要知道事务的隔离级别是由具体的数据库来实现的在数据库的课程中我再来详细介绍
- 事务的传播类型可以重点了解最常用的require 和suppose 两种类型
-
核心接口/类:
- ApplicationContext 保存的IOC 的整个应用上下文可以通过其中的BeanFactroy获取到任意的bean
- BeanFactroy 的主要作用是根据bean definition,也就是bean 的描述,来创建具体的Bean
- BeanWrapper 是对bean 的包装,一般情况下是在spring IOC 的内部使用,提供了访问并的属性值属性,编辑器注册类型转换等功能,方便IOC容器,用统一的方式来访问Bean人的属性
- FactoryBean 通过get object 方法返回实际的Bean对象
-
Scope:
- Bean scope 是指bean 的作用域,默认情况下是单例模式,这也是使用最多的一种方式
- 多例模式就是每次从BeanFactroy 中获取Bean时,都创建一个新的Bean
- request session global session 是在web 服务中使用的scope,
- request 每次请求时都会创建一个实例session,是在一个会话周期内保证只有一个实例
- global session 在五点几版本中已经不再使用
- 同时增加了application 和web socket 两种scope
分别保证在一个servant context 与一个web socket 中只创建一个实例
-
事件机制:
- 还可以了解一下spring 的事件机制,知道spring 定义的五种标准事件
- 了解如何自定义事件,和实现对应的application listener 来处理自定义事件
Spring应用:
-
首先要熟练掌握常用的注解的使用:
-
按类型来分:
@Controller @Service @Repository @Component @Configuration @Bean
- 重点了解一下component 和bean 这两个注解的区别:
- component 注解在类上使用表明这个类是个组件类,需要spring 为这个类创建Bean
- Bean注解使用在方法上告诉Spring这个方法将会返回一个bean对象,需要把返回的对象注册到spring 应用的上下文中
- 重点了解一下component 和bean 这两个注解的区别:
-
设置类的注解:
@Required @Autowired&&@Qualifier @Scope
- 可以重点了解Autowired和Qualifier,以及by type、by name 等不同的自动装配机制
-
web 类:
@RequestMapping&&@GetMapping&&@PostMapping @PathVariable&&@RequestParam @RequestBoy&&@ResponseBody
- 主要以了解为主,关注requestmapping,getmapping,postmapping等路径匹配注解以及variable request 等参数获取注解
-
最后是功能类注解
@ImportResource @ComponentScan @EnableCaching&&@Cacheable @Transactional @Aspect&&@Pointcut @Scheduled
- 包括import resource 引用配置component scan注解
- 自动扫描transactional 事务注解等等
- 这里就不一一介绍了
-
-
配置Spring 的几种方式
- xml文件配置
- 注解配置
- 使用API 进行配置
-
自动装配机制需要了解:
-
按类型匹配进行自动装配 byType
-
按Bean名称进行自动装 byName
-
配构造器自动装配和
-
自动检测
等四种主要方式
-
-
集合属性注入:
- 最后还可以了解一下list set map 等结合类型的属性,它的配置方式以及内部并的使用
Spring知识点脑图
图源:公众号:【三太子敖丙】