当前位置:   article > 正文

每日五道java面试题之spring篇(一)

每日五道java面试题之spring篇(一)

在这里插入图片描述

第一题.Spring是什么?

轻量级的开源的J2EE框架。它是⼀个容器框架,⽤来装javabean(java对象),中间层框架(万能胶)
可以起⼀个连接作⽤,⽐如说把Struts和hibernate粘合在⼀起运⽤,可以让我们的企业开发更快、更简
洁,Spring是⼀个轻量级的控制反转(IoC)和⾯向切⾯(AOP)的容器框架:
● 从⼤⼩与开销两⽅⾯⽽⾔Spring都是轻量级的。
● 通过控制反转(IoC)的技术达到松耦合的⽬的
● 提供了⾯向切⾯编程的丰富⽀持,允许通过分离应⽤的业务逻辑与系统级服务进⾏内聚性的开发
● 包含并管理应⽤对象(Bean)的配置和⽣命周期,这个意义上是⼀个容器。
● 将简单的组件配置、组合成为复杂的应⽤,这个意义上是⼀个框架

第二题 谈谈你对AOP的理解?

系统是由许多不同的组件所组成的,每⼀个组件各负责⼀块特定功能。除了实现⾃身核⼼功能之外,这
些组件还经常承担着额外的职责。例如⽇志、事务管理和安全这样的核⼼服务经常融⼊到⾃身具有核⼼
业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为它们会跨越系统的多个组件。

当我们需要为分散的对象引⼊公共⾏为的时候,OOP则显得⽆能为⼒。也就是说,OOP允许你定义从上
到下的关系,但并不适合定义从左到右的关系。例如⽇志功能。

⽇志代码往往⽔平地散布在所有对象层次中,⽽与它所散布到的对象的核⼼功能毫⽆关系。

在OOP设计中,它导致了⼤量代码的重复,⽽不利于各个模块的重⽤。

AOP:将程序中的交叉业务逻辑(⽐如安全,⽇志,事务等),封装成⼀个切⾯,然后注⼊到⽬标对象
(具体业务逻辑)中去。AOP可以对某个对象或某些对象的功能进⾏增强,⽐如对象中的⽅法进⾏增
强,可以在执⾏某个⽅法之前额外的做⼀些事情,在某个⽅法执⾏之后额外的做⼀些事情

第三题 谈谈你对IOC的理解?

容器概念、控制反转、依赖注⼊

ioc容器:实际上就是个map(key,value),⾥⾯存的是各种对象(在xml⾥配置的bean节点、
@repository、@service、@controller、@component),在项⽬启动的时候会读取配置⽂件⾥⾯的
bean节点,根据全限定类名使⽤反射创建对象放到map⾥、扫描到打上上述注解的类还是通过反射创建
对象放到map⾥。

这个时候map⾥就有各种对象了,接下来我们在代码⾥需要⽤到⾥⾯的对象时,再通过DI注⼊
(autowired、resource等注解,xml⾥bean节点内的ref属性,项⽬启动的时候会读取xml节点ref属性
根据id注⼊,也会扫描这些注解,根据类型或id注⼊;id就是对象名)

控制反转:

没有引⼊IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运⾏到某⼀点的时候,⾃⼰必须
主动去创建对象B或者使⽤已经创建的对象B。⽆论是创建还是使⽤对象B,控制权都在⾃⼰⼿上。

引⼊IOC容器之后,对象A与对象B之间失去了直接联系,当对象A运⾏到需要对象B的时候,IOC容器会
主动创建⼀个对象B注⼊到对象A需要的地⽅。

通过前后的对⽐,不难看出来:对象A获得依赖对象B的过程,由主动⾏为变为了被动⾏为,控制权颠倒
过来了,这就是“控制反转”这个名称的由来。

全部对象的控制权全部上缴给“第三⽅”IOC容器,所以,IOC容器成了整个系统的关键核⼼,它起到了
⼀种类似“粘合剂”的作⽤,把系统中的所有对象粘合在⼀起发挥作⽤,如果没有这个“粘合剂”,对象与
对象之间会彼此失去联系,这就是有⼈把IOC容器⽐喻成“粘合剂”的由来。

依赖注⼊:

“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由⾃身管理变为了由IOC容器
主动注⼊。依赖注⼊是实现IOC的⽅法,就是由IOC容器在运⾏期间,动态地将某种依赖关系注⼊到对象
之中。

第四题. 解释下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作⽤域效果相同。

第五题 Spring事务的实现⽅式和原理以及隔离级别?

在使⽤Spring框架时,可以有两种使⽤事务的⽅式,⼀种是编程式的,⼀种是申明式的,
@Transactional注解就是申明式的。

⾸先,事务这个概念是数据库层⾯的,Spring只是基于数据库中的事务进⾏了扩展,以及提供了⼀些能
让程序员更加⽅便操作事务的⽅式。

⽐如我们可以通过在某个⽅法上增加@Transactional注解,就可以开启事务,这个⽅法中所有的sql都
会在⼀个事务中执⾏,统⼀成功或失败。

在⼀个⽅法上加了@Transactional注解后,Spring会基于这个类⽣成⼀个代理对象,会将这个代理对象
作为bean,当在使⽤这个代理对象的⽅法时,如果这个⽅法上存在@Transactional注解,那么代理逻辑
会先把事务的⾃动提交设置为false,然后再去执⾏原本的业务逻辑⽅法,如果执⾏业务逻辑⽅法没有出
现异常,那么代理逻辑中就会将事务进⾏提交,如果执⾏业务逻辑⽅法出现了异常,那么则会将事务进
⾏回滚。

当然,针对哪些异常回滚事务是可以配置的,可以利⽤@Transactional注解中的rollbackFor属性进⾏配
置,默认情况下会对RuntimeException和Error进⾏回滚。

spring事务隔离级别就是数据库的隔离级别:外加⼀个默认级别
●read uncommitted(未提交读)
●read committed(提交读、不可重复读)
●repeatable read(可重复读)
●serializable(可串⾏化)

数据库的配置隔离级别是Read Commited,⽽Spring配置的隔离级别是Repeatable Read,请问这
时隔离级别是以哪⼀个为准?

以Spring配置的为准,如果spring设置的隔离级别数据库不⽀持,效果取决于数据库

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/140517
推荐阅读
相关标签
  

闽ICP备14008679号