1、详细描述什么是Spring?
- Spring是轻量级的,面向切面编程(AOP)和控制反转(IoC)的容器框架,主要负责技术的整合;
- 它是一个容器,框架的框架,管理业务逻辑层;
- 优点:
- 可以降低组件之间的耦合度,方便解耦,简化开发;
- 便于系统组件的维护,扩展和替换,方便集成各种优秀框架;
- 利用Spring容器管理Controller、Service、Dao组件;
- 利用IoC特性降低Service和Dao之间的关联;
- 利用AOP进行事务等共通部分的处理;
- 使用Spring框架来创建性能好、易于测试、可重用的代码。
2、什么是Spring IoC?
-
Inversion of Control控制反转,也可以称为依赖倒置,是一种设计思想,将设计好的对象交给容器控制;
-
控制:对象的创建、初始化、销毁和对象之间关系的指定;
-
反转:由Spring容器进行对象创建和依赖注入,将控制的逻辑交给第三方框架或者容器负责,当两个组件之间的关系发生改变时,只需要修改框架或者容器的配置
-
正转:由程序员进行对象创建和依赖注入
-
组件:具有功能的类
-
资源:被创建的对象
3、什么是Spring AOP?描述其应用场景
-
OOP(Object-Oriented Programing,面向对象编程),引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。
-
AOP(Aspect-Oriented Programming,面向切面编程),以OOP为基础,主要关注的是Aspect方面,方面组件主要用来封装通用的逻辑,可以以低耦合的方式切入到某一批目标对象中。
-
将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。
-
实现AOP的技术,主要分为两大类:一是采用动态代理技术;二是采用静态织入Weaving的方式,引入特定的语法创建Aspect“方面”。
-
应用场景:
- Authentication 权限
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging, tracing, profiling and monitoring 记录跟踪 优化 校准
- Performance optimization 性能优化
- Persistence 持久化
- Resource pooling 资源池
- Synchronization 同步
- Transactions 事务
4、AOP的通知有几个,分别是什么?
- 前置通知(Before):方面组件在目标组件之前执行
- 后置通知(After):方面组件在目标组件之后执行,目标组件方法没有抛出异常才会执行方面组件
- 最终通知(After-returning ):方面组件在目标组件之后执行,目标组件不管是否发生异常都会执行 方面组件
- 异常通知(After-throwing):方面组件在目标组件抛出异常之后执行
- 环绕通知(Around):方面组件在目标组件之前和之后执行
5、描述Spring Bean的作用域?
Spring框架支持以下五种bean的作用域:
- singleton : 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值;
- prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行 newXxxBean()。以下作用域仅在基于web的Spring ApplicationContext情形下有效;
- request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境;
- session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web 的Spring WebApplicationContext环境;
- application:限定一个Bean的作用域为
ServletContext
的生命周期。该作用域仅适用于web的 Spring WebApplicationContext环境。
6、Spring Bean注入有几种方式?
- setter注入:单例、多例
- 构造方法注入
- 自动装配
7、SpringBean 生命周期?
- Spring Bean的生命周期指的是从一个普通的Java类变成Bean的过程
- Spring Bean的生命周期分为四个阶段和多个扩展点。扩展点又可以分为影响多个Bean和影响单个Bean。
- 四个阶段
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
- 多个扩展点
- 影响多个Bean
- BeanPostProcessor
postProcessBeforeInitialization
postProcessAfterInitialization - InstantiationAwareBeanPostProcessor
postProcessBeforeInstantiation
postProcessAfterInstantiation
postProcessPropertyValues - MergedBeanDefinitionPostProcessor
postProcessMergedBeanDefinition - SmartInstantiationAwareBeanPostProcessor
determineCandidateConstructors
getEarlyBeanReference
- BeanPostProcessor
- 影响单个Bean
- Aware
- Aware Group1(调用invokeInitMethods方法)
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware - Aware Group2(调用Aware和BeanPostProcessor#postProcessBeforeInitialization方法)
EnvironmentAware
EmbeddedValueResolverAware
ApplicationContextAware(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware)
- Aware Group1(调用invokeInitMethods方法)
- 生命周期
InitializingBean
DisposableBean
- Aware
- 影响多个Bean
- 四个阶段
8、Spring框架中 用到了哪些设计模式?
- 工厂设计模式 : Spring使用工厂模式通过
BeanFactory
、ApplicationContext
创建 bean 对象。 - 代理设计模式 : Spring AOP 功能的实现。
- 单例设计模式 : Spring 中的 Bean 默认都是单例的。 - 模板方法模式 : Spring 中
jdbcTemplate
、hibernateTemplate
等以 Template 结尾的对 数据库操作的类,它们就使用到了模板模式。 - 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同 的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式、Spring MVC 中也是用到了 适配器模式适配
Controller
。
9、描述Spring事务传播行为?
- REQUIRED(常用):如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
- SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
- MANDATORY:强制的 使用当前的事务,如果当前没有事务,就抛出异常。
- REQUIRES_NEW:需要JTA事务管理器的支持,新建事务,如果当前存在事务,把当前事务挂起。
- NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 - NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- NESTED:嵌套 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED类 似的操作
- 在同一个方法中,因为大多数情况是一系列业务要保证要么都成功要么都失败的,所以各个业务方法使用默 认的REQUIRED方式。
- 如果一个特殊的业务方法,和其他业务不关联,给它的方法设置REQUIRES_NEW,这样就能保证其他业务有 异常时也不会被回滚。
10、描述Spring事务的隔离级别?
- int ISOLATION_DEFAULT = -1; 使用数据库默认的隔离级别
- int ISOLATION_READ_UNCOMMITTED = 1;读未提交,A事务可以读到B事务未提交的数据
- int ISOLATION_READ_COMMITTED = 2;读提交,A事务可以读到B事务已提交的数据
- int ISOLATION_REPEATABLE_READ = 4;可重复读,A事务读不到B事务已提交的数据
- int ISOLATION_SERIALIZABLE = 8;串行化
11、Spring事务传播行为REQUIRED和REQUIRES_NEW区别?
- 事务的默认传播属性是REQUIRED,表示当前方法必须运行在事务中,如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务
- REQUIRES_NEW表示当前方法必须运行在它自己的事务中,一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起Suspend。适合用某个业务对象所做的事情不想影响到外层事务的情况。
12、Spring循环依赖?
- Spring Framework体系
- Spring中的Bean是由BeanDefinition(建模的类)构建
Bean复杂的生命周期:Spring容器启动--扫描--BeanDefinition--存入BeanDefinition Map中--遍历--验证--创建Bean--推断最佳构造方法--反射实例化Java对象--初始化Bean--是否暴露--创建x对象--属性回填set--回调--(完成代理--发布事件)
如果直接缓存x,那么拿到的就是x,很难扩展,不直接暴露x,而是暴露ObjectFactory,就能拿到我们想要的x
循环依赖是支持setter单例的
非构造方法注入
x找y,y找x,死循环
三个Map解决循环依赖
一级缓存:用于存放完全初始化好的bean,缺点:无法存放半成品对象
二级缓存:存放原始的bean对象(尚未填充属性),用于解决循环依赖;问题:Spring的AOP
机制代理对象
三级缓存:存放bean工厂对象,用于解决循环依赖(针对动态代理对象)