开篇介绍
大家好,我是Java最全面试题库
的提裤姐,今天这篇是JavaEE面试题系列的第三篇,主要总结了Spring
相关的问题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
谈谈你对 Spring 的理解?
Spring 是一个开源框架,为简化企业级应用开发而生。Spring 可以是使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。Spring 是一个 IOC 和 AOP 容器框架。
Spring 容器的主要核心是:
控制反转(IOC)
,传统的 java 开发模式中,当需要一个对象时,我们会自己使用 new 或者 getInstance 等直接或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用 spring 提供的对象就可以了,这是控制反转的思想。依赖注入(DI)
,spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注入的思想。面向切面编程(AOP)
,在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等。公用操作处理的过程就是面向切面编程的思想。AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类采用CGLIB 方式实现动态代理。
Spring 中的设计模式有哪些?
工厂模式:
BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
单例模式:
Bean默认为单例模式。
代理模式:
Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
模板方法:
用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
观察者模式:
定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现ApplicationListener。
Spring 的常用注解?
@Required:该注解应用于设值方法
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired 搭配使用,用于消除特定 bean 自动装配的歧义
Spring bean 的生命周期?
bean 定义
:在配置文件里面用来进行定义。 bean 初始化
:有两种方式初始化:
①在配置文件中通过指定 init-method 属性来完成
②实现 org.springframwork.beans.factory.InitializingBean 接口
bean 调用
:有三种方式可以得到 bean 实例,并进行调用bean 销毁
:销毁有两种方式
①使用配置文件指定的 destroy-method 属性
②实现 org.springframwork.bean.factory.DisposeableBean 接口
Spring 管理事务的方式?
编程式事务
,在代码中硬编码。声明式事务
,在配置文件中配置
声明式事务又分为:
①基于XML的声明式事务
②基于注解的声明式事务
Spring的事务传播行为有哪些?
1、PROPAGATION_REQUIRED
:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
2、PROPAGATION_SUPPORTS
:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
3、PROPAGATION_MANDATORY
:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
4、PROPAGATION_REQUIRES_NEW
:创建新事务,无论当前存不存在事务,都创建新事务。
5、PROPAGATION_NOT_SUPPORTED
:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6、PROPAGATION_NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常。
7、PROPAGATION_NESTED
:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
Spring事务的隔离级别?
1、ISOLATION_DEFAULT
:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
2、ISOLATION_READ_UNCOMMITTED
:读未提交,允许另外一个事务可以看到这个事务未提交的数据。
3、ISOLATION_READ_COMMITTED
:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。
4、ISOLATION_REPEATABLE_READ
:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。
5、ISOLATION_SERIALIZABLE
:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。
Spring 的通知是什么?有哪几种类型?
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架触发的代码段。
Spring 切面可以应用五种类型的通知:
before
:前置通知,在一个方法执行前被调用。after
: 在方法执行之后调用的通知,无论方法执行是否成功。after-returning
: 仅当方法成功完成后执行的通知。after-throwing
: 在方法抛出异常退出时执行的通知。around
: 在方法执行之前和之后调用的通知。
什么是 Spring IOC?IOC的优点是什么?
IOC :控制反转
,Spring IOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。
优点:
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合
得以实现。IOC 容器支持加载服务时的饿汉式初始化和懒加载。
BeanFactory 与 AppliacationContext 有什么区别?
BeanFactory
基础类型的 IOC 容器,提供完成的 IOC 服务支持。如果没有特殊指定,默认采用延迟初始化策略。相对来说,容器启动初期速度较快,所需资源有限。
ApplicationContext
ApplicationContext 是在 BeanFactory 的基础上构建,是相对比较高级的容器实现,除了 BeanFactory 的所有支持外,ApplicationContext 还提供了事件发布、国际化支持等功能。ApplicationContext 管理的对象,在容器启动后默认全部初始化并且绑定完成。
Spring 支持的几种 bean 的作用域?
Spring 框架支持以下五种 bean 的作用域:
singleton : bean 在每个 Spring ioc 容器中只有一个实例。
prototype:一个 bean 的定义可以有多个实例。
request:每次 http 请求都会创建一个 bean,该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。
session : 在一个HTTP Session中 , 一个bean定义对应一个实例。 该作用域仅在基于web 的Spring ApplicationContext 情形下有效。
global-session:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的Spring ApplicationContext 情形下有效。
缺省的 Spring bean 的作用域是 Singleton。
Spring 框架中的单例 bean 是线程安全的吗?
不是线程安全的。
当存在共享变量时,大家都能去调用,此时就存在线程安全问题。
什么是 bean 的自动装配?有哪些方式自动装配?
自动装配:
无须在 Spring 配置文件中描述 javaBean 之间的依赖关系(如配置
、
)。IOC 容器会自动建立 javabean 之间的关联关系。
五种自动装配的方式:
no
:默认的方式是不进行自动装配,通过显式设置ref 属性
来进行装配。byName
:通过参数名自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,
之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
byType
:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,
之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。
constructor
:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类
型,将会抛出异常。
autodetect
:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。
什么是spring 的 AOP?
AOP:全称 Aspect Oriented Programming,即:面向切面编程。
AOP是OOP(Object Oriented Programming,面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
AOP 技术利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用"横切"技术,AOP 把软件系统分为两个部分:核心关注点和横切关注点。
业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。
横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。
AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
AOP 核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组 API 提供横切功能。比如,一个日志模块可以被称作日志的 AOP 切面。根据需求的不同,一个应用程序可以有若干切面。在 Spring AOP 中,切面通过带有@Aspect 注解的类实现。
经典应用:事务管理、性能监视、安全检查、缓存 、日志等
AOP的实现方式?
aop底层采用代理
机制进行实现。
- 接口 + 实现类:spring采用 jdk 的动态代理Proxy。
- 实现类:spring 采用 cglib字节码增强。
AOP中有哪些概念?
①Joinpoint
( 连接点):被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。
②Pointcut
( 切入点):要对哪些 Joinpoint 进行拦截,即被增强的连接点。
③Advice
( 通知/ 增强):拦截到 Joinpoint 之后所要做的事情,及增强代码。
④Introduction
(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
⑤Target
(目标对象):目标类,需要被代理的类
⑥Weaving
(织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
⑦Proxy
(代理):代理类,一个类被 AOP 织入增强后,就产生一个结果代理类。
⑧Aspect
( 切面):是切入点和通知(引介)的结合。
在Spring中怎么定义类的作用域?
当定义一个scope
属性来定义。
当 Spring 要在需要的时候每次生产一个新的 bean 实例,bean 的 scope 属性被指定为 prototype。
一个 bean 每次使用的时候必须返回同一个实例,这个 bean 的 scope 属性被指定为 singleton。