目录
提前声明:本篇文章是我个人看视频截图的杂乱笔记。为了方便复习,我会边发布边更新文章。各位大佬不要较真。
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):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
事务的隔离级别
- 脏读(Dirty read)
- 不可重复读(Nonrepeatable read)
- 幻读(Phantom reads)
事务7种传播机制如下: