Spring学习笔记

Spring

Spring是什么

Spring是一个框架,是一个容器,也是一个生态,目的是简化Java企业应用程序的开发,控制反转(IOC)和面向切面(AOP)是Spring框架的核心
IOC:控制反转
AOP:面向切面编程
容器:包含并管理应用对象的生命周期

Spring是如何简化开发的

基于POJO的轻量级和最小侵入行编程
通过依赖注入和面向接口轻松实现耦合
基于切面和惯例进行声明式编程
通过切面和模板减少样板式代码

Spring的事务传播机制

REQUIRED:默认的传播特性,如果有事务则加入,没有事务则新建事务
SUPPORTS:如果有则加入,没有则以非事务的方式执行
MANDATORY:如果有则加入,没有则抛出异常
REQUIRED_NEW:创建一个新的事务,如果存在当前事务,则挂起事务
NOT_SUPPORTED:以非事务方式执行,如果存在当前事务,则挂起事务
NEVER:不使用事务,如果存在当前事务,则抛出异常
NESTED:如果当前事务存在,则在嵌套事务中执行,否则和REQUIRED一样

Spring事务的隔离级别

读未提交(Read UnCommitted)
读已提交(Read Committed)
可重复读(Repeatable Read)
可串行化(Serializable)

Bean

Spring的bean是线程安全的吗

Spring中的bean默认是singleton(单例模式),并没有对bean进行多线程的封装处理,最简单的方法就是把bean改成prototype(原型模式)。
可以用ThreadLocal把变量变成线程私有,如果bean的实例变量或者类变量需要在多个线程之间共享,可以使用synchronized,volatile等方法实现。

Bean的生命周期

  1. 实例化,反射的方式创建对象
  2. 属性设置,populateBean()创建对象,循环依赖(三级缓存)
  3. 调用aware接口相关的方法:invokeAwareMethod(),完成BeanName,BeanFactory,BeanClassLoader对象的属性设置
  4. 调用BeanPostProcessor中的前置处理方法

配置文件

格式

配置文件格式:properties,yaml,yml
优先级:properties > yaml > yml

IOC

对IOC的理解

  • 控制反转:是一种面向对象编程的设计思想。在不使用IOC的情况下,我们需要自己维护对象之间的依赖关系,容易造成耦合性过高的问题,IOC则可以帮我们维护对象之间的依赖关系,降低耦合度。IOC的实现方式为DI(依赖注入),注入方式有:构造器,setter,接口注入。
  • 容器:存储对象,用map结构来存储,一般使用三级缓存,singletonObjects存放完整的bean对象,整个bean的生命周期从创建到销毁的过程都由容器来管理。

IOC的底层实现(源码)

  1. 通过CreateBeanFactory创建Bean工厂(DefaultListableFactory)
  2. 开始循环创建对象,因为Bean默认是单例的,所以先掉调用getBean(),doGetBean()获取对象,获取不到则执行3
  3. 通过createBean()和doCreateBean(),以反射的方式创建对象,一般情况下使用的是无参构造方法(getDeclaredConstructor(), newInstance)
  4. 进行对象的属性填充populateBean()
  5. 进行其他的初始化操作initializingBean()

AOP

对AOP的理解

面向切面,是一种编程思想,是为了解耦而生的,是通过预编译和动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术,实现业务逻辑与系统逻辑的分离,降低不同业务之间的耦合度。

Spring AOP实现方式有

  • JDK动态代理:Java提供的动态代理技术,在运行时创建接口的代理实例,Spring AOP默认的实现方式。
  • CGLib动态代理:底层的字节码技术,在运行时创建子类的代理实例,当对象不存在接口时,Spring AOP就会使用该方式,但是不能对final修饰的类进行处理。

Spring AOP只能对IOC容器中的Bean进行增强,对于不受容器管理的对象不能增强。