11Spring面试宝典

目录

1.Spring家族

2.IOC

2.1IOC原理

DI

依赖注入(DI)的方式:

IOC的优势

IOC运行流程

SpringIOC支持的功能

2.2SpringIOC的应用

2.2.1BeanDefinitionRegistry

2.2.2BeanFactory

2.2.3ApplicationContext

2.2.4Bean是如何装载在spring中的?

2.3.SpringIOC的refresh源码解析

2.4IOC的getBean源码解析

bean常见面试题

3.AOP

3.1AOP介绍使用

AOP注解概念

AOP种类

3.2AOP的原理

4.小结:


提前声明:本篇文章是我个人看视频截图的杂乱笔记。为了方便复习,我会边发布边更新文章。各位大佬不要较真。

1.Spring家族

如何选择框架

对应的开发者社区是否活跃,是否有名

框架的模块是否不断迭代

 

Spring家族体系

 

2.IOC

2.1IOC原理

DI

如上图,我们改动了轮子,那么整个系统自下而上的依赖组件都得改,这会要了程序员的头发的。

依赖注入(DI)的方式:

IOC的优势

IOC运行流程

SpringIOC支持的功能

依赖注入,依赖检查,自动装配,支持集合,指定初始化方法和销毁方法。支持回调方法。

 

2.2SpringIOC的应用

2.2.1BeanDefinitionRegistry

2.2.2BeanFactory

2.2.3ApplicationContext

SpringBoot中的SpringApplication.run()方法底层也是使用了ApplicationContext。如下图所示:

2.2.4Bean是如何装载在spring中的?

通过@Configuration配置,@Bean标志初始化一个对象交给spring.

获取ApplicationContext.getBean()方法来获取对象。

通过@Component()将类标志为给spring管理

通过@ComponentScan扫描装配好的bean,这里会报错,因为我们的@SpringBootApplication已经有扫描的功能了。

我们通过@Value给复制,之前ApplicationConfig类中的@Bean方法可以全部注释掉。

我们写一个接口Pet(宠物),定义一个move()方法。

一个Dog类实现Pet,dog类方法move(输出running),要加上@Component加载到ioc中。

一个Bird类实现Pet,bird类方法move(输出flying),要加上@Component加载到ioc中。

Person类中注入Pet,调用pet.move()方法。

我们在Application中调用call方法,spring会报错,因为spring也不知道我们要调用dog还是bird的move()方法。

spring容器会告诉我们加入@Primary或者@Qualifier通知spring调用哪个方法。

我们在dog方法中加入@Primary执行一遍,这时候能够成功运行了。

 

2.3.SpringIOC的refresh源码解析

(1)我们从SpringApplication.run()方法一直点,run()-->run()-->代码最多的地方,找到下图所示,我们继续研究一下。

(2)我们继续点击refreshContext()方法,这个方法调用了另一个refresh()方法,来到如下图方法中,我们详解一下里面做了什么操作。

 

prepareRefresh()方法进去后可以看到,里面设置了容器的启动时间,撤销关闭状态,开启活跃状态,初始化属性元信息,验证环境信息里必须存在的属性。

beanFactory里面主要获取我们的beanFactory实例的,也就是我们交给spring管理的@Component。

prepareBeanFactory对beanFactory进行相关设置。

postProcessBeanFactory()对beanFactory进行不同的操作。

invokeBeanFactoryPostProcessors()对beanFactory,调用工厂后处理器,处理各类bean标签,扫描bean文件,解析成一个个bean等等操作。方法内会调用到ConfigurationClassParser类,这个类会对@Configuration,@Bean,@Import,@SpringBootApplication等标签进行解析

写不下去了......丢篇链接给你们详解。

https://www.jianshu.com/p/c7a416ba7950

 

refresh方法的作用:

 

2.4IOC的getBean源码解析

(1)进入从AbstractBeanFactory类,找到我们的getBean()-->doGetBean()

getSingleton获取我们beanName的实例,获取一个共享的实例。

getObjectForBeanInstance从缓存或者实例工厂中获取实例。

bean常见面试题

Spring的5个作用域

SpringBean的生命周期--创建过程--销毁过程

 

 

3.AOP

3.1AOP介绍使用

我们定义一个controller类,给配置请求路径和请求方法get。

定义一个Aspect类,实现aop的功能,请求之前打印url和ip,请求返回之前打印相应内容。

 

AOP注解概念

AOP种类

 

3.2AOP的原理

 

代理模式代码案例

定义一个支付接口Payment(银行)

定义用户RealPayment

定义支付宝AliPay.

定义ProxyDemo执行

Spring里代理模式的实现

getBean()源码分析

先去判断是否singleton,之后去创建实例,之后去加载属性等操作。

关键地方initializeBean进入下图。

进入方法后看到调用了processor方法,

最终看到proxy实现方法了

到这里我们可以看到用一个三元运算符判断是用jdkProxy还是CGLIB动态生成。

 

 

Spring事务

事务的ACID

  • 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  • 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

事务的隔离级别

  1. 脏读(Dirty read)
  2. 不可重复读(Nonrepeatable read)
  3. 幻读(Phantom reads)

事务7种传播机制如下:

 

4.小结:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值