栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring面试题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring面试题

1.Spring 启动过程(原理)

WEB项目启动时候,加载web.xml,spring会在web.xml中配置启动监听器和启动参数
web容器启动加载spring容器顺序:
 1.执行web.xml中的contextLoaderListener监听器
 2.初始化ContextLoaderListener中的contextInitialized方法
调用父类的initWebApplicationContextinitWebApplicationContext方法
在initWebApplicationContext中调用了三个方法,创建WebApplicationContext对象
加载context-param中配置的spring配置文件,初始化配置文件中及创建配置文件中的bean

Spring容器启动流程是怎样的 
1.在创建Spring容器,也就是启动Spring时: 
2.首先会进行扫描,扫描得到所有的BeanDefinition对象, 并存在一个Map中 
3.然后筛选出非懒加载的单例BeanDefinition进行创建Bean,对于多例Bean不需要在启动过程中去进行创建,对于多例Bean会在每次获取Bean时 利用BeanDefinition去创建 
4.利用BeanDefinition创建Bean就是Bean的创建生命周期,这期间包括了合并BeanDefinition.推断构造方法、实例化、属性填充、初始化前、初 始化、初始化后等步骤,其中AOP就是发生在初始化后这一步骤中 
5.单例Bean创建完了之后,Spring会发布一个容器启动事件 
6. Spring启动结束 
7.在源码中会更复杂,比如源码中会提供一些模板方法,让子类来实现,比如源码中还涉及到一些BeanFactoryPostProcessor和BeanPostProcessor 的注册,Spring的扫描就是 通过BenaFactoryPostProcessor来实现的,依赖注入就是通过BeanPostProcessor来实现的 
8.在Spring启动过程中还会去处理@lmport等注解 8.在Spring启动过程中还会去处理@lmport等注解

 Spring容器的启动流程是怎么样的(源码)? 
使用AnnotationConfigApplicationContext 来跟踪下启动流程:  
this0;初始化reader和scanner  
scan(basePackages);使用scanner组件扫描basePackage下的所有对象,将配置类的BeanDefinition注册到容器中。  
refresh0;刷新容器, 
prepareRefresh刷新前的预处理  
obtainFreshBeanFactory:获取在容器初始化时创建的BeanFactory  
prepareBeanFactory. BeanFactory的预处理工作,会向容器中添加一些组件。  
postProcessBeanFactory:子类再写该方法, 可以实现在BeanFactory创建并预处理完成后做进一 步的设置。  
invokeBeanFactoryPostProcessors:在BeanFactory初始化之 后执行BeanFactory的后处理器。 
registerBeanPostProcessors:向容器中注册Bean的后处理器, 他的主要作用就是干预Spring初始化Bean的流程,完成  代理、自动注入、循环依赖等这些功能。  
initMessageSource:初始化messagesource组件, 主要用于国际化。  
initApplicationEventMulticaster:初始化事件分发器  
onRefresh:留给子容器, 子类重写的方法,在容器刷新的时候可以自定义一些逻辑。 
registerListeners:注册监听器。  
finishBeanFactoryInitialization:完成BeanFactory的初始化, 主要作用是初始化所有剩下的单例Bean,  
finishRefresh:完成整个容器的初始化,发布BeanFactory容器刷新完成的事件。 
 

2.Spring特点:
1.轻量级:springr 的核心包不到1M大小。而使用spring的核心包所需的资源也很小,所以可以在小型设备中使用
2.非入侵式:
3.容器:Spring提供了容器功能,容器可以管理对象的生命周期、对象与对象间的关系、我们可以通过编写XML来设置对象关系和初始值,这样容器在启动之后,所有的对象都直接可以使用,不用编写任何编码来产生对象。Spring有两种不同的容器:Bean工厂以及应用上下文
Spring工作原理
IoC(Inversion of control): 控制反转  
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系  

Spring还有一个核心就是AOP面向切面编程,可以为某一类对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。

Spring目地就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的

Spring IOC体系结构:
BeanFactory:spring Bean的创建是典型的工厂模式,这一系列的bean工厂,也即IOC容器为开发者管理对象间的依赖关系提供了很多便利和基础服务,在spring中有许多的IOC容器的实现供用户选择和使用,BeanDefinition 保存配置信息,我们自己定义的各个 Bean 其实会转换成一个个 BeanDefinition 存在于 Spring 的 BeanFactory 中。

3.spring的AOP默认使用哪个代理:Spring默认配置创建的代理是JDK动态代理,SpringBoot默认是Cglib,可修改配置

4.spring的单例是否线程安全?
无状态就是不会保存数据,是线程安全的,有状态就是会保存数据,是线程不安全的,那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。

5.IOC容器的初始化:
包括BeanDefinition的Resource定位,载入和注册这三个基本的过程
 

6. Spring 框架中都用到了哪些设计模式?

代理模式,aop用的比较多
模板方法模式:用来解决代码重复的问题
前端控制器模式:spring提供了dispatcherServlet来对请求进行分发
依赖注入模式:贯穿于BeanFactory/applicationContext接口的核心理念
工厂模式:BeanFactory用来创建对象的实例

7.Spring 是如何管理事务的?
  spring的事务声明有两种方式,编程式和声明式。spring主要是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量。

8.Spring IoC容器配置Bean的方式?
  1)基于XML文件进行配置。
  2)基于注解进行配置。
  3)基于Java程序进行配置(Spring 3+)
 

9.Spring MVC的工作原理是怎样的?
1.用户发送请求至前端控制器DispatcherServlet(也叫中央处理器).
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url查找处理请求的Handler
4.Handler执行完成返回ModelAndView在返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。

10.spring事务什么时候会失效?
1.调用标识了事务的方法时不是代理对象调用的,就会失效(注解@Transactional不会起作用),比如一个类里,a方法调用b方法,b方法有@Transactional注解这时候不会生效,因为是普通方法不是代理对象调用的方法。
2.方法不是public的


11.spring bean生命周期
1.解析类得到BeanDefinition
2.如果有多个构造方法,则要推断构造方法 
3.确定好构造方法后,进行实例化得到一个对象 
4.对对象中的加了@Autowired注解的属性进行属性填充 
5.回调Aware方法,比如BeanNameAware, BeanFactoryAware 
6.调用BeanPostProcessor的初始化前的方法 
7.调用初始化方法 
8、调用BeanPostProcessor的初始化后的方法,在这里会进行AOP 
9.如果当前创建的bean是单例的则会把bean放入单例池 
10、使用bean
11. Spring容器关闭时调用DisposableBean中destory0方法  

12. Spring中的事务是如何实现的 
1. Spring事务底层是基于数据库事务和AOP机制的
2.使用了@Transactional注解的Bean, Spring会创建一 个代理对象作为Bean 
3.当调用代理对象的方法时,会先判断该方法上是否加了@Transactiona|注解 
4.如果加了,那么则利用事务管理器创建一个数据库连接 
5.并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一 步 
6.然后执行当前方法,方法中会执行sql 
7.执行完当前方法后,如果没有出现异常就直接提交事务 
8.如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务 (如果配置的新开一个事务那就会新创建一个数据库连接)
9. Spring事务的隔离级别对应的就是数据库的隔离级别 
10. Spring事务的传播机制是Spring事务自己实现的,也是Spring事务中最复杂的 
11. Spring事务的传播机制是基于数据库连接来做的,一个数据库连接-个事务, 如果传播机制配置为需要新开一个事务, 那么实际上就是先建立一 个数据库连接,在此新数据库连接上执行sql 
 

13.spring bean作用域
●singleton: 默认,每个容器中只有一个bean的实例。单例的模式由BeanFactory自身来维护。该对象的生命周期是与Spring IOC容器一致的(但在第一次被注入时才会创建) . 
●prototype: 为每一个bean请求提供一 个实例。在每次注入时都会创建一个新的对象 
●request:  bean被定义为在每个HTTP请求中创建一个单例对象, 也就是说在单个请求中都会复用这一个单例对象。
●session: 与request范围类似, 确保每个session中有一 个bean的实例,在session过期后, bean会随之失效。
●application: bean被定义为在ServletContext的生命周期中复用一个单例对象。
●websocket: bean被定义为在websocket的生命周期中复用一个单例对象。 
global-session:全局作用域,global-session和Portlet应用相关。 当你的应用部署在Portlet容器中工作时, 它包含很多portlet.如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在 global-session中。全局作用域与Servlet中的session作用域效果相同。 全局会话中.全局作用域与Servlet中的会话作用域效果相同。
 

14.Spring事务的实现方式和原理以及隔离级别? 
在使用Spring框架时,可以有两种使用事务的方式,一种是编程式的,一种是 声明式的,@Transactional注解就 是申明式的。
首先,事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行了扩展,以及提供了一些能让程序员更 加方便操作事务的方式。
比如我们可以通过在某个方法上增加@Transactional注解,就可以开启事务,这个方法中所有的sq|都会在一个事 务中执行,统一成功或失败。 
在一个方法.上加了@Transactionali注解后,Spring会基于这个类生成一个代理对象, 会将这个代理对象作为 bean,当在使用这个代理对象的方法时,如果这个方法上存在@Transactional注解,那么代理逻辑会先把事务的 自动提交设置为false,然后再去执行原本的业务逻辑方法,如果执行业务逻辑方法没有出现异常,那么代理逻辑 中就会将事务进行提交,如果执行业务逻辑方法出现了异常,那么则会将事务进行回滚。当然,针对哪些异常回滚事务是可以配置的,可以利用@Transactional注解中的rollbackFor属性进行配置, 默认 情况下会对RuntimeException和Error进行回滚。 
spring事务隔离级别就是数据库的隔离级别:外加一个默认级别 
●read uncommitted (未提交读) 
●read committed (提交读、不可重复读) 
●repeatable read (可重复读) 
● serializable (可串行化) 

15.Spring中对事务定义了不同的传播级别: Propagation 
1、PROPAGATION_REQUIRED:默认传播行为。如果当前没有事务, 就创建一个新事务,如果当前存在事务,就加入到事务中。
2、PROPAGATION_SUPPORTS:如果当前存在事务, 就加入到该事务。如果当前不存在事务,就以非事务方式运行。  
3、PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务。如果当前不存在事务,就抛出异常。 
4、PROPAGATION_ REQUIRES_NEW:无论当前存不存在事务, 都创建新事务进行执行。
5、PROPAGATION_NOT_SUPPORTED:以非事务方式运行。 如果当前存在事务,就将当前事务挂起。 
6、PROPAGATION_ NEVER :以非事务方式运行。 如果当前存在事务,就抛出异常。
7、PROPAGATION_NESTED:如果当前存在事务, 则在嵌套事务内执行;如果当前没有事务,则按REQUEIRED属性执行。
 

16.SpringMVC中的控制器是不是单例模式?如果是,如何保证线程安全?  
控制器是单例模式 单例模式下就会有线程安全问题。 
Spring中保证线程安全的方法  
1、将scop设置成非singleton。 prototype, request.  
2、最好的方式是将控制器设计成无状态模式。在控制器中,不要携带数据。但是可以引用无状态的service和dao.  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/735501.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号