谈谈你对Spring的理解
Spring是目前Java开发几乎离不开的企业级框架,可以说是Spring给了Java新的生命活力。
Spring的核心是IOC和DI。
IOC即控制翻转,核心思路就是将创建和管理对象的操作交给Spring容器,如果类需要使用这个对象通过Autowired等注解声明需要这个对象,由Spring完成注入。
DI即依赖注入,是实现IOC的方式,spring通过构造器注入,setter注入等方式完成对象的注入。
基于Spring的这个核心特性,我们能写出低耦合的代码。我们的上层代码可以不再依赖下层代码的具体实现,可以更好的实现分层设计。
Spring还引入了一个关键特性AOP,即面向切面编程,大致可认为是可把一些非核心代码写在切面中,分离核心业务和横切关注点的实现。
Spring还帮我们简化了ORM框架、声明式事务的的实现,方便了我们的代码开发。
Spring还是一个大量Web框架的粘合剂,我们会发现,几乎所有的成熟的框架都离不开Spirng。
使用过AOP吗
我们的业务代码中有部分代码使用到了AOP,比如说有一个记录操作日志的方法使用到了AOP。 个人不太爱用AOP来实现编程,目前没觉得有什么必用AOP不可的使用场景,而AOP带来的额外的复杂性感觉有点得不偿失。
Bean的生命周期
SpingBean的生命周期大致有以下几个。
- 实例化Bean:这一步Spring会通过构造器或工厂方法创建Bean实例。
- 属性赋值:Spring通过Autowired注解或XML配置进行属性赋值。
- 初始化:在这一步Spring会完成bean的初始化,会注入bean的相关信息比如bean ID或所属工厂,我们可以在这一步通过自定义方法对bean的内容做一些加工。
- 使用:bean被创建出来了,可以被使用了。
- 销毁:可通过Destroy方法对bean进行销毁。
Bean是单例的吗\怎么实现多例\多例的使用场景
Bean默认是单例的,每个Spring容器中只有一个实例,所有请求共享同一个bean。大部分我们的业务也是使用的是单例的bean。
Bean也可以配置成多例的,即每个请求生成一个新的bean,通过指定prototype开启多例模式,一般用于有状态,对实例不共享有需求的场景。
Spring如何解决循环依赖
一般说spring通过三级缓存来解决循环依赖。
大致思路就是三级缓存存放bean的工厂,二级缓存存放没有进行属性赋值、初始化的对象,一级缓存才放初始好的对象,这样在遇到循环依赖时,可通过查询三级缓存逐步完成初始化。
一般解决循环依赖需要通过Setter注入的方式来实现。
Spring如何实现事务
Spring通过@Transactional注解实现声明式事务,其底层原理是基于AOP加上注解关键字,帮我们创建了事务代码,并根据所配置的注解实现了事务的隔离级别、传播行为、超时时间、异常处理等机制。