大厂面试为什么常爱问Spring?掌握这12个知识点不再怕面试通不过!

一、什么是spring、为何要用spring及其优势、spring有哪些模块组成 ?

什么是spring
Spring 是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用,可是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,它使得开发者只须要关心业务需求。java

spring优势
spring属于低侵入式设计,代码的污染极低;
spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。
spring对于主流的应用框架提供了集成支持。
spring有哪些模块组成
Spring Core:核心类库,提供IOC服务;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP服务;
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的ORM框架的支持;
Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现。web

二、什么是IOC、DI 及其二者的优势 、 有哪几种注入方式

IOC:
控制反转,把建立对象的控制权利由代码转移到spring的配置文件中。
最直观的表达就是,IOC让对象的建立不用去new了,能够由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去建立对象以及管理对象,并调用对象的方法的。面试

DI:
依赖注入,在程序运行期间,由外部容器动态地将依赖对象注入到组件中。简单定义就是当一个对象须要另外一个对象时,能够把另外一个对象注入到对象中去。spring

优势就是把应用的代码量降到最低,达到松散耦合度。数据库

注入的方式:
构造注入
Set注入
接口注入express

Spring提供如下几种集合的配置元素:
类型用于注入一列值,容许有相同的值。
类型用于注入一组值,不容许有相同的值。
类型用于注入一组键值对,键和值均可觉得任意类型。
类型用于注入一组键值对,键和值都只能为String类型。
编程

三、谈谈对AOP理解?

aop面向切面编程,关键在于代理模式,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的所有方法,而且在特定的切点作了加强处理,并回调原对象的方法。动态代理能够减小系统中的重复代码,下降了模块间的耦合度,同时提升了系统的可维护性。可用于权限认证、日志、事务处理。设计模式

Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:
JDK代理:基于接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 经过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一块儿;接着,Proxy利用 InvocationHandler动态建立一个符合某一接口的的实例, 生成目标类的代理对象。安全

Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHandler);

CGLIB动态代理:若是代理类没有实现 InvocationHandler 接口(或者说是基于父子类的),那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,能够在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加加强代码,从而实现AOP。CGLIB是经过继承的方式作的动态代理,所以若是某个类被标记为final,那么它是没法使用CGLIB作动态代理的.
Enhancer是一个很是重要的类,它容许为非接口类型建立一个JAVA代理,Enhancer动态的建立给定类的子类而且拦截代理类的全部的方法,和JDK动态代理不同的是无论是接口仍是类它都能正常工做在这里插入图片描述sping的动态代理经过代理类为目标对象增长额外功能。
代理本质 = 目标对象+额外功能+代理对象的接口
开发步骤:网络

1,建立原始对象

2,提供额外功能(实现下面的接口)
MethodBeforeAdvice 额外功能须要运行在原始方法以前执行.
AfterReturningAdvice 额外功能须要运行在原始方法以后执行
MethodInterceptor 额外功能须要运行在原始方法以前 后执行
ThrowsAdvice 额外功能运行在原始方法抛出异常的执行

3,配置切入点

**<aop:pointcut  expression="execution(* *(..))"/>**

4,组装切入点和代理功能

<aop:advisor pointcut-ref="pc" advice-ref="代理功能的bean"/>

四、spring事务的实现及其原理

Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是没法提供事务功能的。

(1)Spring事务的种类:
spring支持编程式事务管理和声明式事务管理两种方式:
①编程式事务管理使用TransactionTemplate。
②声明式事务管理创建在AOP之上的。其本质是经过AOP功能,对方法先后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始以前加入一个事务,在执行完目标方法以后根据执行状况提交或者回滚事务。
声明式事务最大的优势就是不须要在业务逻辑代码中掺琐事务管理的代码,只需在配置文件中作相关的事务规则声明或经过@Transactional注解的方式,即可以将事务规则应用到业务逻辑中。
声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就能够得到彻底的事务支持。惟一不足地方是,最细粒度只能做用到方法级别,没法作到像编程式事务那样能够做用到代码块级别。

(2)spring的事务传播行为:

spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。
PROPAGATION_REQUIRED:若是当前没有事务,就建立一个新事务,若是当前存在事务,就加入该事务,该设置是最经常使用的设置。
PROPAGATION_SUPPORTS:支持当前事务,若是当前存在事务,就加入该事务,若是当前不存在事务,就以非事务执行。‘
PROPAGATION_MANDATORY:支持当前事务,若是当前存在事务,就加入该事务,若是当前不存在事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:建立新事务,不管当前存不存在事务,都建立新事务。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,若是当前存在事务,则抛出异常。
PROPAGATION_NESTED:若是当前存在事务,则在嵌套事务内执行。若是当前没有事务,则按REQUIRED属性执行。

(3)Spring中的隔离级别:
ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
ISOLATION_READ_UNCOMMITTED:读未提交,容许另一个事务能够看到这个事务未提交的数据。
ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另外一事务读取,并且能看到该事务对已有记录的更新。解决脏读问题
ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另外一事务读取,可是不能看到该事务对已有记录的更新。行锁
ISOLATION_SERIALIZABLE:一个事务在执行的过程当中彻底看不到其余事务对数据库所作的更新。表锁
(3)只读属性(readOnly)
false应用在查询操做时,提升查询效率, true用于查询,false用于增删改,默认是false
(4)超时属性(timeout)
秒 -1 由数据库决定若是当前事务操做的数据,被别的事务锁住,那么经过超时数据指定最多等待多少秒.
(5)异常属性(±Exception)
默认Spring会对RuntimeException及其子类进行回滚操做
默认Spring会对Exception及其子类进行提交操做
rollback-for=”异常的权限定名” 回滚操做
no-rollback-for=”java.lang.RuntimeException” 提交操做

简单展现
在这里插入图片描述

五、Spring有几种配置方式?

将Spring配置到应用开发中有如下三种方式:
基于XML的配置
基于注解的配置(主流)
基于Java的配置

六、Spring 框架中都用到了哪些设计模式?

工厂模式:BeanFactory就是简单工厂模式的体现,用来建立对象的实例;
单例模式:Bean默认为单例模式。
代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
模板方法:用来解决代码重复的问题。好比. RestTemplate, JmsTemplate, JpaTemplate。
观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都会获得通知被制动更新,如Spring中listener的实现–ApplicationListener。

七、Spring的自动装配 :

在spring中,对象无需本身查找或建立与其关联的其余对象,由容器负责把须要相互协做的对象引用赋予各个对象,使用autowire来配置自动装载模式。
在Spring框架xml配置中共有5种自动装配:
(1)no:默认的方式是不进行自动装配的,经过手工设置ref属性来进行装配bean。
(2)byName:经过bean的名称进行自动装配,若是一个bean的 property 与另外一bean 的name 相同,就进行自动装配。
(3)byType:经过参数的数据类型进行自动装配。
(4)constructor:利用构造函数进行装配,而且构造函数的参数经过byType进行装配。
(5)autodetect:自动探测,若是有构造方法,经过 construct的方式自动装配,不然使用 byType的方式自动装配。

基于注解的方式
使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解以前须要在Spring配置文件进行配置,<context:annotation-config />。在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找须要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:
若是查询结果恰好为一个,就将该bean装配给@Autowired指定的数据;
若是查询的结果不止一个,那么@Autowired会根据名称来查找;
若是上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。
@Autowired可用于:构造函数、成员变量、Setter方法

注:@Autowired和@Resource之间的区别 (1)
@Autowired默认是按照类型装配注入的,默认状况下它要求依赖对象必须存在(能够设置它required属性为false)。 (2)
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。

八、Spring如何处理线程并发问题?

在通常状况下,只有无状态的Bean才能够在多线程环境下共享,在Spring中,绝大部分Bean均可以声明为singleton做用域,由于Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不一样的线程在访问前须要获取锁,没得到锁的线程则须要排队。而ThreadLocal采用了“空间换时间”的方式。
ThreadLocal会为每个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。由于每个线程都拥有本身的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,能够把不安全的变量封装进ThreadLocal。

九、解释Spring支持的几种bean的做用域。

Spring容器中的bean能够分为5个范围:
(1)singleton:默认,每一个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。
(2)prototype:为每个bean请求提供一个实例。
(3)request:为每个网络请求建立一个实例,在请求完成之后,bean会失效并被垃圾回收器回收。
(4)session:与request范围相似,确保每一个session中有一个bean的实例,在session过时后,bean会随之失效。
(5)global-session:全局做用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工做时,它包含不少portlet。若是你想要声明让全部的portlet共用全局的存储变量的话,那么这全局变量须要存储在global-session中。全局做用域与Servlet中的session做用域效果相同。

十、怎样开启注解装配?

注解装配在默认状况下是不开启的,为了使用注解装配,咱们必须在Spring配置文件中配置 context:annotation-config/元素。

十一、spring核心类有哪些?各有什么做用?

BeanFactory:产生一个新的实例,能够实现单例模式
BeanWrapper:提供统一的get及set方法
ApplicationContext:提供框架的实现,包括BeanFactory的全部功能

十二、Spring框架中的单例bean是线程安全的吗?

不,Spring框架中的单例bean不是线程安全的。

结语:

到此这篇关于spring 常见面试题(附答案)的文章就介绍到这了。但愿看完这篇文章对你们从此的面试能起到帮助,那真是太好不过了,在这里我将一些问的比较多面试题进行了整合打包(PDF、文档部分截图)若是有须要的朋友能够点击这里来获取 暗号:qf

在这里插入图片描述
在这里插入图片描述