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

spring框架面试题总结

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

spring框架面试题总结

目录

一、spring的概念

1、什么是spring?

2、七大模块是什么?

3、spring中用到了哪些设计模式

二、Bean

1、生命周期(四个)

2、bean的作用域

三、IOC

1、介绍

2、IOC的注入方式

3、IOC容器

四、AOP

1、介绍

2、相关术语

3、实现方式

五、注解

1、介绍

2、重要的注解

3、SpringMVC常用注解

六、Restful

七、jar包依赖冲突


一、spring的概念

1、什么是spring?

一个分层的IOC和AOP容量框架,spring的核心就是控制反转(IOC)和面向切面(AOP)

优点:

  • spring就是一个大工厂,将对象的创建和依赖关系的维护都交给spring管理,这就是IOC
  • 方便集成各种优秀框架,Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis等)的直接支持
  • Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

2、七大模块是什么?
  • Spring Context:继承BeanFactory,提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
  • Spring Core:核心类库,所有功能都依赖于该类库,提供IOC和DI服务;
  • Spring AOP:AOP服务,减弱代码的功能耦合;
  • Spring Web:提供了基本的面向Web的综合特性,提供对常见框架如Struts2的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器;
  • Spring MVC:提供面向Web应用的Model-View-Controller,即MVC实现。
  • Spring DAO:对JDBC的抽象封装,简化了数据访问异常的处理,并能统一管理JDBC事务;
  • Spring ORM:对现有的ORM框架的支持;

3、spring中用到了哪些设计模式
  • 工厂模式: spring中的BeanFactory就是简单工厂模式的体现,根据传入唯一的标识来获得bean对象;
  • 单例模式: 提供了全局的访问点BeanFactory;
  • 代理模式: AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)
  • 装饰器模式: 依赖注入就需要使用BeanWrapper;
  • 观察者模式: spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
  • 策略模式: Bean的实例化的时候决定采用何种方式初始化bean实例(反射或者CGLIB动态字节码生成)

二、Bean

1、生命周期(四个)
  • 实例化bean,由IOC容器创建,
  • 设置对象属性,DI
  • 初始化,执行我们自定义的初始化方法
  • 销毁,destroy()

2、bean的作用域

singleton(单例)、prototype(原型)、request、session、global session

默认是单例,指一个JVM进程中只能创建一个对象,原型作用域中,能创建多个对象

三、IOC

1、介绍

IOC是指将创建对象的权利以及管理bean生命周期的责任交给spring,在创建对象的过程中,spring会对对象的属性进行设置,这个过程是依赖注入(DI)

2、IOC的注入方式

(1)构造器注入

(2)set注入

(3)注解注入

(4)工厂注入(静态工厂、实例工厂)

3、IOC容器

IoC容器负责对象的搭建,初始化一系列工作,被创建或者被管理的对象在IoC容器中统称为Bean

使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean 已经绑定了所以的依赖关系

四、AOP 1、介绍

AOP技术看上去比较神秘,但实际上,它本质就是一个动态代理,让我们把一些常用功能如权限检查、日志、事务等,从每个业务方法中剥离出来

2、相关术语

连接点:被拦截的点

切入点:在拦截到连接点之后做增强的方法,增强分为

  • 前置增强:在连接点前面执行,前置增强不会影响连接点的执行,除非此处抛出异常
  • 后置增强:在连接点正常执行完后执行,无论连接点是否抛出异常,后置增强都会执行
  • 异常增强:在连接点抛出异常后才会执行,会导致连接点不能正常执行结束
  • 最终增强:在连接点执行完成后执行,不管正常执行还是异常抛出,都会执行返回最后的通知内容
  • 环绕增强:围绕在连接点的前后,比如一个方法调用的前后,这种通知是最强大的通知,能在方法调用前后定义一些操作

切面:(也称切面类)是切入点和增强的结合,把增强应用到切入点的过程,通常是一个类,可以在里面定义切入点的增强

3、实现方式

(1)实现接口

  • 切面实现MethodBeforeAdvice,重写增强方法
  • 配置切面切入点和增强
 
    
        
        
        
        
        
     
 

(2)基于Spring容器的自动代理

  • @Aspect注解切面类,写增强方法
  • 开启注解支持
 

五、注解 1、介绍

spring管理着很多bean,这些bean需要在配置文件中配置,太麻烦。而注解的作用在于:用了注解之后,就不需要在xml文件中配置这些了 

但是需要开启注解,配置扫描的包 

2、重要的注解

(1)@Component

用在类上相当于将对象存放到spring容器中

它还有三个重要的子注解

  • @Controller用于标注控制层组件,web层
  • @Service用于标注业务层,service层
  • @Repository用于标注数据访问组件,dao层

它们功能都相同,只是名字不同,方便开发人员理解而已

(2)@Autowired

自动装配,比如说将service层注入到controller层,就可以用这个

Autowired默认先按byType,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常

相关的注解

①@Qualifier

@autowire也可以手动指定byName,通过@Autowired + @Qualifier

②@Resource

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略

(3)@Async

java中使用线程有四种方式

继承Thread类,实现Runnable接口,实现Callable接口(重写call方法,与run()不同,call()有返回值),通过线程池

其实@Async可以看作是第五种方法:

这个注解用于标注某个方法或某个类里面的所有方法都是需要异步处理的。被注解的方法被调用的时候,会在新线程中执行,而调用它的方法会在原来的线程中执行

(4)@Singleton

只要在类上加上这个注解,就可以实现一个单例类,不需要自己手动编写单例实现类。

(5)@SpringBootApplication

包含了很多个注解,可以去看源码,主要介绍一下下面的三个注解

  • @SpringBootConfiguration:核心注解就是@Configuration,标注当前类是个配置类
  • @EnableAutoConfiguration:Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置
  • @ComponentScan:配置扫描包,默认扫描@SpringBootApplication所在类的同级包以及下级所有的包

(6)@PathVariable

是spring3.0的一个新功能:接收请求路径中占位符的值

@PathVariable 注解可以将URL中占位符Q参数绑定到控制器处理方法的入参中;URL 中的{xxx} 占位符可以通过

@PathVariable(“xxx“)绑定到操作方法的入参中。

3、SpringMVC常用注解
  • @Controller和@RestController:是@Controller和@ResponseBody的结合体,两个标注合并起来的作用
  • @RequestMapping:映射请求路径
  • @Resource和@AutoWired:对象注入
  • @RequestBody和@RequestParam:RequestParam注解接收的参数是来自于requestHeader中,即请求头;RequestBody注解接收的参数则是来自于requestBody中,即请求体中。GET请求中,因为没有HttpEntity,所以@RequestBody并不适用,因此,get请求一般用param,post请求用body。注:@RequestBody 是作用于方法的参数中,将请求体以json形式写入某个对象。
  • @ResponseBody:返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。通常用来返回json或者xml数据

Spring MVC新特性,提供了对Restful风格的支持,增加了四种注解

  • @GetMapping,处理get请求
  • @PostMapping,处理post请求
  • @PutMapping,处理put请求
  • @DeleteMapping,处理delete请求

@PostMapping(value = “/user/login”)

等价于

@RequestMapping(value = “/user/login”,method = RequestMethod.POST)

六、Restful

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

客户端发出的数据操作指令都是"动词 + 宾语"的结构。请求方式为动词,请求内容为宾语

eg:localhost:8080/hello/tom

七、jar包依赖冲突

maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题。本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲突的解决办法。

1、冲突的原因

依赖传递

假设我们项目中依赖了A和B两个Jar包。而A和B各自又有以下传递依赖

A -> X -> Z(2.0)

B -> X -> Y -> Z(2.5)

那么Z包就容易出现版本冲突

而maven面对多个版本的jar包,有以下两个原则

  • 最短路径原则
  • 最先声明原则

比如上面的例子,会用2.0版本的Z包,因为路径更短,如果路径长度一样,就会选择最先声明的包

2、查看依赖树

在测试或者生产环境中,看不见依赖树,可以通过命令 mvn dependency:tree -Dverbose来查看

而开发环境中可以通过eclipse或者idea等工具的图形化界面直接找到依赖树

3、解决冲突

  • 手动在pom.xml文件中通过exclusion标签去掉不适用的版本的jar包,包括springboot web启动器中包含的tomcat,都可以用这种方式去掉
  • 借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,然后在对应标红版本的jar包上面点击execlude,就可以将该jar包排除出去
  • 如果很多个依赖都传递了Jar包A,涉及了很多个版本,但是你只想指定一个版本。用排除法一个个去exclude太麻烦,而且exclude在pom文件中也会体现,太多的话,也影响代码整洁和阅读感受。这时候需要用到版本锁定法,何谓版本锁定法?公司的项目一般都会有父级pom,你想指定哪个版本只需要在你项目的父POM中(当然在本工程内也可以)定义。通过version标签

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

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

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