当前位置: 首页 > news >正文

【面试题】——Spring

1.Spring是什么?

Spring是一个开源的Java应用框架,它提供了广泛的基础设施支持,用于构建Java应用程序。极大提高了开发效率。它提供了一种轻量级的编程模型,通过依赖注入(Dependency Injection)和面向切面编程(Aspect-oriented Programming)等技术,使得开发者可以更加方便地开发可扩展、模块化和松耦合的应用程序。

2.为什么需要Spring?

3.说下你对Spring的AOP、IOC的理解?

  • AOP
    AOP的全称是Aspect Orient Programming,即面向切面编程。是对OOP(Object Orient Programming)的一种补充,专门用于处理一些具有横切性质的服务。常常用于日志输出、安全控制、错误处理、权限管理等。
    AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在编译或运行的时候,再将这些代码应用到需要执行的地方。AOP的主要目标是提供一种方式来模块化横切关注点,以降低代码的重复性,提高代码的可维护性和可复用性。

  • IOC(Inversion Of Controll,控制反转)
    是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。对象与对象之间松散耦合,也利于功能的复用。Spring的IOC其实就是一个Map

4.基于java的AOP实现有哪些?

AspectJ、Spring AOP、Cglib、JBoss AOP

5.AOP的原理?

连接点(Join point):指程序运行过程中所执行的方法。在Spring AOP中,一个连接点总代表一个方法的执行。
切面(Aspect):被抽取出来的公共模块,可以用来会横切多个对象。Aspect切面可以看成 Pointcut切点 和 Advice通知 的结合,一个切面可以由多个切点和通知组成。在Spring AOP中,切面可以在类上使用 @AspectJ 注解来实现。
切点(Pointcut):切点用于定义 要对哪些Join point进行拦截。
通知(Advice):指要在连接点(Join Point)上执行的动作,即增强的逻辑,比如权限校验和、日志记录等。通知有各种类型,包括Around、Before、After、After returning、After throwing。
目标对象(Target):包含连接点的对象,也称作被通知(Advice)的对象。 由于Spring AOP是通过动态代理实现的,所以这个对象永远是一个代理对象。
织入(Weaving):通过动态代理,在目标对象(Target)的方法(即连接点Join point)中执行增强逻辑(Advice)的过程。
引入(Introduction):添加额外的方法或者字段到被通知的类。Spring允许引入新的接口(以及对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

6.如何使用Java实现动态代理?

7. Spring AOP和AspectJ AOP有什么区别?

Spring AOP是属于运行时增强,而AspectJ是编译时增强。Spring AOP基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)。
Spring AOP已经集成了AspectJ,AspectJ应该算得上是Java生态系统中最完整的AOP框架了。AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。
如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择AspectJ,它比SpringAOP快很多。

8.SpringAOP通知类型?

  • 前置通知(Before Advice)
  • 后置通知(After Advice)
  • 环绕通知(Around Advice)
  • 返回通知(After Returning Advice)
  • 异常通知(After Throwing Advice)

9. springbean的生命周期

在这里插入图片描述
在这里插入图片描述
Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
Bean实例化后对将Bean的引入和值注入到Bean的属性中
如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

10.什么是SpringMVC?

Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的模块,提供了一个基于MVC(模型-视图-控制器)设计模式的框架,用于开发灵活、可维护和可扩展的Web应用程序。

11.SpringMVC的请求流程![在这里插入在这里插入图片描述

12.SpringMVC的核心组件有哪些?

  • DispatcherServlet(前端控制器): DispatcherServlet是Spring MVC的前端控制器,它接收所有的HTTP请求并负责将请求分派给合适的控制器处理。DispatcherServlet还协调视图的渲染过程。

  • HandlerMapping(处理器映射器): HandlerMapping负责将HTTP请求映射到合适的控制器处理方法上。Spring MVC提供了多种HandlerMapping实现,包括RequestMappingHandlerMapping和BeanNameUrlHandlerMapping等。

  • Controller(控制器): 控制器是Spring MVC中的一个关键组件,它是处理HTTP请求的Java类。控制器包含处理方法,这些方法负责执行具体的业务逻辑,并返回模型数据和视图名称。

  • ModelAndView(模型和视图): ModelAndView是一个封装了模型数据和视图名称的对象。控制器方法通常返回一个ModelAndView,其中包含要传递给视图的数据和要渲染的视图的名称。

  • ViewResolver(视图解析器): 视图解析器负责将逻辑视图名称解析为实际的视图对象。Spring MVC支持多种视图解析器,如InternalResourceViewResolver用于解析JSP视图、ThymeleafViewResolver用于解析Thymeleaf模板等。

  • Interceptor(拦截器): 拦截器允许在请求处理过程中执行预处理和后处理操作。拦截器可以应用于整个应用程序或特定的处理器。它们可以用于实现日志记录、权限检查、国际化等功能。

  • HandlerAdapter(处理器适配器): HandlerAdapter负责将HTTP请求分派给相应的控制器方法,并负责调用控制器方法。不同类型的控制器方法需要不同的适配器来处理,Spring MVC提供了多种适配器。

  • DataBinder(数据绑定): 数据绑定是Spring MVC中的一个核心功能,它将HTTP请求参数绑定到控制器方法的参数上。数据绑定还支持数据验证和类型转换。

  • View(视图): 视图负责渲染模型数据,通常是HTML页面或其他响应内容。Spring MVC支持各种视图类型,包括JSP、Thymeleaf、FreeMarker、JSON视图等。

  • ExceptionResolver(异常解析器): 异常解析器负责捕获和处理应用程序中的异常,并返回适当的错误响应。Spring MVC提供了DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver等异常解析器。

http://www.lryc.cn/news/173972.html

相关文章:

  • 【算法思想-排序】根据另一个数组次序排序 - 力扣 1122 题
  • 毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计
  • 编译原生安卓aosp源码,实现硬改以及定位
  • 找单身狗。一个数组中只有两个数字出现一次,其他数字出现了两次,编写一个函数找出这两个只出现一次的数字
  • Java数据结构技巧
  • easyui disabled 属性设置
  • 使用容器运行Nginx应用及Docker命令
  • fastapi 基本介绍+使用
  • C语言的结构体的认识
  • 只通过在vimrc文件写东西来实现或安装vim的插件
  • 云原生Kubernetes:K8S存储卷
  • “五育”并举育人体系构建的实践研究课题实施方案
  • 小样本目标检测:ECEA: Extensible Co-Existing Attention for Few-Shot Object Detection
  • Android 10.0 系统开启和关闭黑白模式主题功能实现
  • Linux-VI和VIM
  • 【送书】实现可观测性平台的技术要点是什么?
  • AUTOSAR汽车电子嵌入式编程精讲300篇-车载网络 CAN 总线报文异常检测
  • 基于MUSIC算法的二维超声波成像matlab仿真
  • Linux0.11——第三回 做好访问内存的最基础准备工作
  • unity自己对象池的使用
  • el-image 和 el-table冲突层级冲突问题
  • 6年Android开发前10月的总结,写给正在求职的安卓开发
  • ConcurrentHashMap 的并发度是什么?
  • Redis 面霸篇:从高频问题透视核心原理
  • 【100天精通Python】Day69:Python可视化_实战:导航定位中预测轨迹和实际轨迹的3D动画,示例+代码
  • MySQL中对varchar类型的列进行统计分析
  • mysql索引最左前缀法则、使用场景
  • LeetCode75-06:移动零
  • C/C++统计满足条件的4位数个数 2023年5月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
  • python+nodejs+php+springboot+vue 校园安全车辆人员出入安全管理系统