Spring常见面试题

大纲:

1.Spring的IOC和AOP怎么理解
2.Spring项目启动的时候会加载哪些资源,顺序是怎么样的
3.这么多的bean在容器中,Spring是如何区分的?
4.Spring中BeanFactory、FactoryBean和ApplicationContext的区别
5.Spring中bean的作用域有哪些,有什么区别
6.SpringBoot和SpringMVC区别在哪

7.SpringMVC原理
8.Spring的优点


1.Spring的IOC和AOP怎么理解

IOC:控制反转也叫依赖注入。利用了工厂模式。
1.将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。

2.在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好。

3.在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。

spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了,也就是控制权的转让。

spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。

我们一般都不直接用BeanFactory,而是用它的实现类 ApplicationContext ,这个类会自动解析我们配置的applicationContext.xml

IoC,(Inverse of Control)控制反转,其包含两个内容:其一是控制,其二是反转。在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决。这个第三方指的就是Spring的容器。IoC另解,依赖注入
(Dependency Injection),调用类对被调用类的依赖关系由第三方注入,以移除调用类对被调用类的引用。

直白点:

IOC 即控制反转,简单来说就是把原来代码里需要实现的对象创建、依赖反转给容器来帮忙实现,Spring 中管理对象及其依赖关系都是通过 Spring 的 IOC 容器实现的。

IOC 的实现方式有依赖注入和依赖查找,由于依赖查找使用的很少,因此 IOC 也叫做依赖注入。

我们之前在创建一个对象的时候都是直接 new 一个对象实例,而有了 IOC ,对象实例的创建都交给容器去实现即可。

什么是AOP
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性

AOP相关术语:
Aspect:切面,一个关注点的模块化,这个关注点可能会横切多个对象。

Joinpoint:连接点,程序执行过程中的某一行为,即业务层中的所有方法。。

Advice:通知,指切面对于某个连接点所产生的动作,包括前置通知、后置通知、返回后通知、异常通知和环绕通知。

Pointcut:切入点,指被拦截的连接点,切入点一定是连接点,但连接点不一定是切入点。

Proxy:代理,Spring AOP 中有 JDK 动态代理和 CGLib 代理,目标对象实现了接口时采用 JDK 动态代理,反之采用 CGLib 代理。

Target:代理的目标对象,指一个或多个切面所通知的对象。

Weaving :织入,指把增强应用到目标对象来创建代理对象的过程。



Spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的。

2.Spring项目启动的时候会加载哪些资源,顺序是怎么样的


3.这么多的bean在容器中,Spring是如何区分的?

主要是通过以下三种:
1、XML中的name或者是id属性
2、通过注解的方式

(1)@Component组件,没有明确的角色。

(2)@Service在业务逻辑层(Service层)使用。

(3)@Repository在数据访问层(dao层)使用。

(4)@Controller在展现层使用。

3、Java配置

@Bean 注解声明的方法名是放入spring容器的bean的name。

Java配置是通过@Configuration和@Bean来实现的。

@Configuration声明当前类是一个配置类,相当于一个Spring配置的xml文件。

@Bean注解在方法上,声明当前方法的返回值为一个Bean。

4.Spring中BeanFactory、FactoryBean和ApplicationContext的区别

BeanFactory:是一个 Bean 工厂,使用简单工厂模式,是 Spring IoC 容器顶级接口,是用于管理 Bean 的工厂,最核心的功能是通过 getBean() 方法加载 Bean 对象,通常我们不会直接使用该接口,而是使用其子接口 ApplicationContext。
FactoryBean:是一个工厂 Bean,使用了工厂方法模式,实现该接口的类可以自己定义要创建的 Bean 实例,只需要实现它的 getObject() 方法即可。
ApplicationConext:是 BeanFactory 的子接口,扩展了 BeanFactory 的功能(高级 IOC 容器)。

5.Spring中bean的作用域有哪些,有什么区别

通过 scope 属性指定 Bean 的作用范围,包括:
① singleton:单例模式,是默认作用域,不管收到多少 Bean 请求每个容器中只有一个唯一的 Bean 实例。
② prototype:原型模式,和 singleton 相反,每次 Bean 请求都会创建一个新的实例。
③ request:每次 HTTP 请求都会创建一个新的 Bean 并把它放到 request 域中,在请求完成后 Bean 会失效并被垃圾收集器回收。
④ session:和 request 类似,确保每个 session 中有一个 Bean 实例,session 过期后 bean 会随之失效。
⑤ global session:当应用部署在 Portlet 容器时,如果想让所有 Portlet 共用全局存储变量,那么该变量需要存储在 global session 中。

6.SpringBoot和SpringMVC区别在哪

spring boot只是一个配置工具,整合工具,辅助工具.

springmvc是框架,项目中实际运行的代码


Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。

Spring MVC提供了一种轻度耦合的方式来开发web应用。是Spring的一个模块,是一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。

Spring Boot实现了自动配置,降低了项目搭建的复杂度。它主要是为了解决使用Spring框架需要进行大量的配置太麻烦的问题,所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box)。

Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。

对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。


总结:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。


所以,用最简练的语言概括就是:

Spring 是一个“引擎”;

Spring MVC 是基于Spring的一个 MVC 框架;

Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

7.SpringMVC原理

核心构成:
① 前端控制器(DispatcherServlet):主要用于接收客户端发送的 HTTP 请求、响应结果给客户端。
② 处理器映射器(HandlerMapping):根据请求的 URL 来定位到对应的处理器(Handler)。
③ 处理器适配器(HandlerAdapter):在编写处理器(Handler)的时候要按照处理器适配器(HandlerAdapter) 要求的规则去编写,通过适配器可以正确的去执行 Handler。
④ 处理器(Handler):就是我们经常写的 Controller 层代码,例如:UserController。
⑤ 视图解析器(ViewResolver):进行视图的解析,将 ModelAndView 对象解析成真正的视图(View)对象返回给前端控制器。
⑥ 视图(View):View 是一个接口, 它的实现类支持不同的视图类型(JSP,FreeMarker,Thymleaf 等)。
执行流程:
① 首先,用户发送 HTTP 请求给 SpringMVC 前端控制器 DispatcherServlet。
② DispatcherServlet 收到请求后,调用HandlerMapping 处理器映射器,根据请求 URL 去定位到具体的处理器 Handler,并将该处理器对象返回给 DispatcherServlet 。
③ 接下来,DispatcherServlet 调用 HandlerAdapter 处理器适配器,通过处理器适配器调用对应的 Handler 处理器处理请求,并向前端控制器返回一个 ModelAndView 对象。
④ 然后,DispatcherServlet 将 ModelAndView 对象交给 ViewResoler 视图解析器去处理,并返回指定的视图 View 给前端控制器。
⑤ DispatcherServlet 对 View 进行渲染(即将模型数据填充至视图中)。View 是一个接口, 它的实现类支持不同的视图类型(JSP,FreeMarker,Thymleaf 等)。
⑥ DispatcherServlet 将页面响应给用户。

8.spring 的优点?


1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦
2.可以使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各种应用服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部






参考:


#面试题目##Spring#
全部评论
写的蛮全,学习一下😁
点赞 回复
分享
发布于 2021-07-18 23:46
需要加bean的创建过程、几种初始化方式、bean生命周期、循环依赖解决等等
点赞 回复
分享
发布于 2021-07-19 17:32
联想
校招火热招聘中
官网直投

相关推荐

第一次能连续过2面,不容易(已过二面)有些记得不是很清楚,但是大差不差1.== 与equals的区别2.提到了Integer,Integer a = 1,b = 1;a == b结果是什么?3.有用到java里的哪些集合?4.你说用到了ArrayList,哪你是用ArrayList做什么操作的?5.假如你做了一个项目很多人去访问数据,但是你的系统服务器CPU飙升,但是数据库CPU正常,这是怎么回事?怎么去解决?6.你说到HashMap了,你知道他的原理是什么吗7.哪提到了死循环了,哪你是如何判断有死循环的(力扣判断环形链表),哪你咋找到的这个环的入口的(力扣判断环形链表II)8.如果在多线程情况下无法使用HashMap,哪有什么解决方案吗9.为啥不去选择HashTable?ConcurrentHashMap你是怎么用的10.你在你的项目中是如何保证线程安全的11. 说一下对volatile的理解12.Volatile底层原理是什么13.volatile与synchronization的区别是什么?14.如果有任务来了,如果线程池核心线程数满了,任务队列满了,这个任务会有个啥结果?你说会创建空闲线程去执行,哪他一定会被空闲线程去执行吗?15.说一下线程池的拒绝策略16.有用过什么数据库吗?17.为什么去使用MySQL(答的他性能好,又各种的客户端界面,方便,成本低)18.你提到了索引,说一说索引他又有什么失效的场景?19.你是怎么排查的索引失效的?20.假如你有一张表去查询他的数据,响应的时间很长,是什么情况导致的,有什么解决方案(SQL慢查询)21.看你项目里使用的Redis,哪你是如何保证Redis和MySQL的一致性的22.很多人去访问你的项目,多到1秒10w人访问,想你项目中有用户的信息,商户的一些信息,你是如何保证他们的信息安全,怎么保证他们访问的就是自己的数据(答了保证接口安全的一些,jwt令牌,redis存储信息好像都不对ThreadLocal蹭点边让我好好思考)23.如果你有一个实体类,我对实体类有很多操作,但是大部分代码是重复的,如何在添加进数据库之前节省一点操作?(答了使用AOP但是还有一些操作)24.MybatisPlus是怎么用的(说了自己咋定义的实体类,咋使用他的一些方法)25.反问
点赞 评论 收藏
转发
20 161 评论
分享
牛客网
牛客企业服务