1,谈谈对Spring IOC的理解:
- IOC:控制反转,将原来是由我们使用者来对对象进行控制的控制权移交给Spring容器来进行管理;
- IOC是一种思想;而DI是具体的实现方式;
- DI:依赖注入,将对应的属性注入到具体的对象中,如:@Autowired,@Resource,populateBean方法(只要是配置文件注入,都会走这个方法)来完成依赖的注入;
容器:存储对象,使用Map结构构成存储对象,在Spring中存储对象的时候一般有三级缓存;一级缓存(SingletonObjects):用于存储成品的Bean对象;二级缓存(EarlySingletonObjects):用于存放半成品Bean对象;三级缓存(SingletonFactory):用来存放Lambda表达式和对象名称的映射;在整个Bean的生命周期,从创建到使用到销毁,都是由Spring容器来对bean进行管理;
2,Spring Bean的生命周期?

- 实例化对象,通过反射的方式来生成,在源码中会有一个createBeanInstance的方法来专门生成对象;
- 当Bean对象创建完成后,对象的属性值都是默认值,所有现在要对Bean的属性进行填充,通过populateBean方法来对Bean对象的属性来进行填充,中间会涉及到循环依赖的问题;
- 向Bean对象设置容器属性,会调用invokeAwareMethods方法来将具体的容器对象设置到具体的Bean对象中;
- 调用BeanPostProcessor中的前置(Before)处理方法来对Bean对象进行前置处理工作,如ApplicationContext对象处理上下文属性数据;
- 调用invokeInitMethods方法来完成初始化方法的调用,在此方法调用过程中,需要判断当前bean对象是否实现了InitializingBean接口,如果实现了就调用afterPropertiesSet方法来最后设置Bean对象;
- 调用BeanPostProcessor的后置(after)处理方法,完成对Bean对象的后置处理工作,aop就是在这里实现的,实现的接口名称叫:AbstractAutoProxyCreator;
- 获取到完整的Bean对象,通过getBean方法就能进行对bean的获取与使用;
- 当对象使用完成后,在容器关闭的时候,会销毁Bean对象,首先会判断是否实现了DisposableBean接口,然后再去执行destory方法完成销毁;
- (注意)补充一下:只有单例模式下创建bean对象时销毁方法才会伴随容器的销毁而执行,如果是多例模式下创建Bean的话就相反,Spring会根据上下文的内容进行校验该bean在后续是否还会被引用,如果没有的话,会直接销毁,释放内存;目的呢就是优化性能;
3,Spring AOP的理解/(原理):
- AOP是面向切面编程;
- 是为了对代码解耦而生的;用于将那些与业务无关,但是却对多个对象产生影响的公共行为和逻辑,抽取并封装一个可复用的模块,这个模块被称为“切面”;减少了代码的重复度,这样子就能实现解耦,提高系统的可维护性;
AOP的执行过程:
- 1.Spring 创建IOC容器:先扫扫描包中的所有由@Service 和@Component修饰的类,并为它们创建对象,放在Spring IOC容器中。
- 2.寻找切面类Spring在创建完对象后,开始寻找由 @Aspect 修饰的切面类并获取切面类中的所有方法。
- 3.寻找切面类的方法中带有表达式的部分接下来,Spring找到所有由合法表达式修饰的方法
- 4.查找有相应方法的类随后,Spring检查它所扫描到的所有类,并将上一步中找到的方法与所有类进行对照,找出有这个(些)方法的类(这个类就是被代理类)。
- 5.创建动态对象
最后,Spring根据上一步找到的被代理类以及切面类创建动态类的动态对象并放入Spring IOC容器中。
4,Spring的事务:
事务的作用就是:保证数据的一致性,要么全部成功,要么全部失败;
事务一般应用在Service层;在Spring中事务本质就是数据库对事务的支持,如果说没有数据库的支持,Spring是无法提供事务的;因此也可以说Spring事务其实就是数据库的事务;
Spring事务的管理方式一般有两种:
(1)声明式事务管理(重点)
- 在配置文件中配置属性声明,基于AOP方式实现事务操作,也是将事务管理作为一个切面,织入到目标方法实现事务的管理;
- 开发步骤:
I,创建原始类
II,配置原始类的相关信息
III,书写额外功能(事务—spring)
IV,配置额外功能类的相关信息
V,定义切点
VI,组装切面(2)编程式事务管理
- 自己编写管理事务方式,即进行提交和异常回滚等操作,只有少数业务操作时适合;
