文章目录
常用的spring框架
名称 | 描述 |
---|---|
SpringFramework | 即使我们常说的spring框架,包含IOC、context上下文、bean管理、springmvc等众多的功能模块 |
Springboot | 依赖spring框架,目标是简化应用的创建、开发和部署,简化了配置文件,使用嵌入式web服务。核心思想是“约定大于配置”,只需要很少的配置就可以,简化了开发模式 |
springdata | 是一个操作和访问数据的工具集,提供了对多种数据源的操作能力,jdbc、mongdb、redis等 |
springcloud | 是一个微服务的解决方案,是一系列不同的开箱即用的微服务框架的集合,基于springboot,简化了分布式系统的开发,集成了服务发现、配置管理、消息总线、负载均衡、断路器、服务监控等各种服务治理能力 |
spring中的基本概念
IOC
我们拿公司中的招聘来举例,假如一个公司有产品、研发、测试,如果公司是跟据岗位要求来安排人员,就是上图的↓,就是正向流程。
如果反过来,不用公司来安排人选,由第三方猎头来匹配和安排人员,如上图的↑,这就是控制反正
在spring中,对象的属性是由对象自己创建的,就是正向流程,如果对象的属性不是自己创建而是由容器创建的,这就是控制反转。上图中的DI(依赖注入)是实现控制反转的一种方式,正向流程导致了对象与对象之间的高耦合,IOC可以解决高耦合的问题,有利于功能的复用,能使程序结构变的非常灵活。
IOC实现时的两个概念
Context和Bean是spring中IOC实现的两个概念,所有被spring管理的、创建的用于依赖注入的对象就叫一个bean,spring创建并完成依赖注入后所有的bean统一放在一个叫做context的上下文中进行管理。
AOP
一般我们的程序是从controller调用Service层,然后Service层再调用Dao层来返回数据,最后再逐层返回结果,这是一个途中向↓指示的按执行顺序的纵向处理。
但是我们思考这样的问题:一个系统中有多个不同的服务,如用户服务、商品信息服务等等,每个服务的controller层都需要验证参数,都需要处理异常,如果按图中绿色部分对不同服务中相同功能进行横切,例如身份验证、参数验证、异常处理等,这就不需要在不同服务中都写相同的逻辑了,这就是AOP思想所解决的问题。
AOP以功能进行划分,对不同顺序服务中的不同位置进行横切,完成个服务共同需要实现的部分。
spring框架组件
上图是4.0版本的,在5.0中portlet已经废弃,同时增加了用于web异步响应的WebFlux。我们面试不需要对所有组件进行了解,只需要对途中红色框里的了解就行。
组件名 | 描述 |
---|---|
core | 是所有组件的核心 |
Beans、context | 实现IOC/DI的基础 |
AOP | 用来实现面向切面编程 |
Web | 包括了springMvc,是web服务的控制层实现 |
机制与实现
AOP
是通过代理实现在执行对象的某个方法是执行插入的切面逻辑,实现的方式有动态代理,也叫运行时增强,比如jdk代理、cglib代理;还有静态代理,在编译时进行代理,比如ApectJ。
对于AOP还需要了解下@Aspect、@Advice等注解的使用。
PlaceHolder动态置换
主要需要了解替换发生的时间,是在bean创建完成后,初始化之前。是通过实现BeanFactoryPossetPoccer接口,主要通过PropertyPlaceholderConfigure接口、PropertySourcesPlaceholderConfigure(springboot)来实现的。
核心接口/类
名称 | 描述 |
---|---|
ApplicationContext | 保存了整个IOC的应用上下文 ,可以通过其中的BeanFactory获取到任意的bean |
Beanfactory | 根据bean的描述创建具体的bean |
BeanWrapper | 是对bean的包装,一般情况在springIoc的内部适用,提供了访问bean的属性值、bean的编辑注册、类的转换器,用统一的方式来访问bean的属性 |
factoryBean | 通过getObject方法来返回实际的bean对象 |
scope
是bean的作用域,默认使用单例模式,这也是使用最多的一种模式。
名称 | 描述 |
---|---|
singleton | 单例 |
prototype | 获取bean时都创建一个新的Bean |
Request | 每次请求都创建一个Bean |
Session | 在一个会话内保证一个bean |
Global Session | 5.0后 已经废弃 |
Apllication | 5.0后新增 |
Websocket | 5.0后新增 |
事件机制
spring定义的5种标准事件ContextRefreshedEvent、ContextStartedEvent、ContextStoppedEvent、ContextClosedEvent、RequestHandleEvent。
常用注解
类型名 | 注解集 |
---|---|
类型类 | @Controller、@Service、@Repository、@Component、@Configuration、@Bean(方法上) |
设置类 | @Requied、@Autowired、@Qualifier、@Scope |
Web类 | @RequestMapping、@GetMapping、@PostMapping、@PathVariable、@RequestParam、@RequestBody、@ResponseBody |
功能类 | @ComponentScan、@importResource、Transcation |
配置方式
有Xml配置、注解方式、API方式
自动装配
- 按类型bytype
- 按名称byName
- 构造器construction
- 自动检测autodotect
Spring Context的初始化流程
左边图中ClassPathXmlAC是xml配置的AC,SpringAC是SpringBoot的AC,WebAC 是springmvc的AC,不论哪种AC都要调用AbstractAC.refresh()。
右边是refresh()方法的历程:
- 对刷新做准备,设置激活状态,初始化Context环境中的占位符,这个动作由具体的子类来完成
- 刷新并获取内部的beanFactory
- 对内部的beanFactory进行处理,比如设置类加载器和后置处理器,配置不能自动状态的类型,注册默认的环境bean
- 配置beanFactory的后置扩展处理能力,比如开始上下文之前做些处理逻辑,就可以复写这个方法
- 执行beanFacotory中配置的后置处理器,执行顺序是按顺序执行bean的后置处理器,再执行beanFactory的后置处理器。
- 在beanFactory中注册bean的后置处理器,bean的后置处理器可以在bean的初始化前和后执行处理
- 用来支持消息的国际化
- 初始化应用事件的广播器,用来想application通知各种应用产生的事件,是一个标准的观察者模式
- 是留给子类的扩展,用来初始化子类特有的bean
- 把事件的applicationBeanListionerBean注册到事件广播器,并对事件广播器中早起没有广播的bean进行通知
- 执行所有bean的初始化,实例化非延迟加载的单例bean
- 刷新工作,发布ContextRefreshEven事件
- 重置公共的缓冲,比如RefleshUtils、AnnotationUtils中的缓冲
bean的生命周期
SpringBoot
启动流程
- prepareEnvironment
- createApplicationContext
- postProcessApplicationContext
- applyInitializers
- listeners.contextPrepared
- listeners.contextLoaded
- refreshContext AbstractAC.refresh()
配置文件
bootstrap 、application,bootstrap是application的父级,bootstrap主要用于从额外的配置文件中加载信息和解密属性,并且是优先加载和不能被本地的配置覆盖
注解
@SpringBootApplication
@SpringbootConfiguration
@EnableAutoConfiguration
@Conditional
模块
- starter 是springboot提供的和其它框架的无缝集成功能的一种方式,不需要关注各种依赖库的配置,由springboot的自动配置来实现
- actuator 进行监控和管理,通过restfulapi请求来监管审计请求应用的一些情况
- devtools 提升开发效率,支持热部署
- cli 是命令行工具,支持使用groovy脚本,可以快速搭建spring原型项目