面试题007-Java-Spring

面试题007-Java-Spring

目录

  • 面试题007-Java-Spring
    • 题目自测
    • 题目答案
      • 1. 简单介绍一下Spring?
      • 2. Spring有哪些模块?
      • 3. 什么是Spring IoC ?
      • 4. 什么是依赖注入?有哪几种方式可以进行依赖注入?
      • 5. 什么是Spring AOP ?
      • 6. 什么是Spring Bean ? 说一下Bean的生命周期?
      • 7. Spring中Bean的作用域有哪些?
      • 8. 什么是Spring中的代理(Proxy)?JDK动态代理和CGLIB代理有什么区别?
      • 9. Spring是怎么解决循环依赖的?
      • 10. 说一下你对Spring MVC的理解?Spring MVC的工作原理?
      • 11. Spring中是如何实现事务管理的?
      • 12. 拦截器和过滤器了解吗?
    • 参考资料

题目自测

  • 1. 简单介绍一下Spring?
  • 2. Spring的核心模块有哪些?
  • 3. 什么是Spring IoC ?
  • 4. 什么是依赖注入?有哪几种方式可以进行依赖注入?
  • 5. 什么是Spring AOP ?
  • 6. 什么是Spring Bean ? 说一下Bean的生命周期?
  • 7. Spring中Bean的作用域有哪些?
  • 8. 什么是Spring中的代理(Proxy)?JDK动态代理和CGLIB代理有什么区别?
  • 9. Spring是怎么解决循环依赖的?
  • 10. 说一下你对Spring MVC的理解?Spring MVC的工作原理?
  • 11. Spring中是如何实现事务管理的?
  • 12. 拦截器和过滤器了解吗?

题目答案

1. 简单介绍一下Spring?

答:Spring一款开源的轻量级的Java应用框架,它的主旨是为了简化Java企业级应用开发。Spring提供的核心功能主要是 IoC 和 AOP。并且它提供了全面的基础设施支持,可以很方便地对数据库进行访问、集成第三方组件(任务、调度、缓存等)。使开发人员能更能专注业务逻辑开发,而无需处理繁琐的底层细节。

Spring官方:Spring makes it easy to create Java enterprise applications. It provides everything you need to embrace the Java language in an enterprise environment.

2. Spring有哪些模块?

答:Spring的模块主要有:

  • Core Container(核心容器):
    • spring-core:Spring框架的核心工具类,如控制反转和依赖注入等。
    • spring-beans:提供Bean的创建、配置和管理功能的支持。
    • spring-context:提供对国际化、事件传播、资源加载等功能的支持。
  • AOP(面向切面):
    • spring-aspects:该模块为与 AspectJ 的集成提供支持。
    • spring-aop:提供了面向切面的编程实现。
  • Data Access/Integration(数据访问/集成):
    • spring-jdbc:提供了对数据库访问的抽象JDBC。
    • spring-orm:提供对 Hibernate、JPA、iBatis 等 ORM 框架的支持。
    • spring-tx:提供了对事物的支持。
  • Web:
    • spring-web:对 Web 功能的实现提供一些最基础的支持。
    • spring-mvc:提供了基于模型-视图-控制器(MVC)设计模式的Web框架。
    • spring-webflux:提供了基于响应式编程模型的Web框架。

3. 什么是Spring IoC ?

答:IoC即控制反转的意思,它是一种创建和获取对象的技术思想,依赖注入(DI)是实现这种技术的一种方式。传统开发过程中,我们需要通过new关键字来创建对象。使用IoC思想开发方式的话,我们不通过new关键字创建对象,而是通过IoC容器来帮我们实例化对象。 通过IoC的方式,可以大大降低对象之间的耦合度。

4. 什么是依赖注入?有哪几种方式可以进行依赖注入?

答:依赖注入是一种设计模式,依赖注入用于实现控制反转一种方式。在依赖注入模式下,依赖对象的创建和管理不再由使用该对象的类负责,而是由外部容器(Spring IoC容器)负责,并在需要的时候将这些依赖对象注入到需要他们的类中。实现依赖注入的方式主要有三种,如下

  • 构造方法注入:通过对象的构造函数来注入依赖。

    public class MyClass {  private MyDependency myDependency;  public MyClass(MyDependency myDependency) {  this.myDependency = myDependency;  }  
    }
    
  • setter方法注入:通过对象的Setter方法来注入依赖。

    public class MyClass {  private MyDependency myDependency;  public void setMyDependency(MyDependency myDependency) {  this.myDependency = myDependency;  }  }
    
  • 接口注入:通过对象实现一个特定的接口来注入依赖。

    public interface DependencyInjector {  void injectDependency(MyClass myClass);  
    }  
    public class MyClass implements DependencyInjector {  private MyDependency myDependency;  @Override  public void injectDependency(MyDependency myDependency) {  this.myDependency = myDependency;  }  
    }
    

5. 什么是Spring AOP ?

答:AOP是面向切面编程的意思,用于将横切关注点与业务逻辑代码分离,横切关注点通常指的是分散在多个类中的公共行为,如日志记录、事物管理、权限管理等。通过把这些横切关注点进行封装成独立的模块形成切面,并在运行时动态地将他们植入到应用程序中的普通业务逻辑中。通过Spring AOP可以实现代码的复用和解耦,从而提高代码的可维护性和可扩展性等。

  • AOP的具体应用-日志记录
    // 日志注解
    @Target({ElementType.PARAMETER,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Log {/*** 描述*/String description() default "";/*** 方法类型 INSERT DELETE UPDATE OTHER*/MethodType methodType() default MethodType.OTHER;
    }// 日志切面
    @Component
    @Aspect
    public class LogAspect {// 切入点,所有被 Log 注解标注的方法@Pointcut("@annotation(com.zouhuu.annotation.Log)")public void webLog() {}/*** 环绕通知*/@Around("webLog()")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {// 省略具体的处理逻辑}// 省略其他代码
    }
    /*** 通过注解实现日志记录*/
    public class MyController() {@Log(description = "method1",methodType = MethodType.INSERT)public CommonResponse<Object> method1() {// 业务逻辑xxService.method1();// 省略具体的业务处理逻辑return CommonResponse.success();}
    }
    

6. 什么是Spring Bean ? 说一下Bean的生命周期?

答:简单来说Spring Bean是指被Spring IoC容器所管理的对象。Spring容器负责Bean的创建、初始化、配置以及销毁。我们可以通过XML文件或注解等方式去定义Bean。Bean可以是任意类型的Java对象,比如数据访问对象DAO、业务服务对象等。
Bean的生命周期可以分为定义、属性设置、初始化、生存、销毁这五个阶段。

  1. Bean的定义阶段:Spring容器会读取Bean配置(XML文件、Java配置类),然后通过Java的反射机制来创建Bean实例。
  2. Bean的属性设置阶段:Spring容器根据配置文件中定义的信息,设置Bean的属性,包括注入其他Bean和属性值等。
  3. Bean的初始化阶段:
    1. 首先会检查Aware接口的相关实现,Aware接口是为了让Bean有和Spring容器交互的能力。
    2. 调用BeanPostProcessor的前置处理方法(postProcessBeforeInitialization)。
    3. 调用Bean的初始化方法(afterPropertiesSet和custom init-method)。
    4. 调用BeanPostProcessor的后置处理方法(postProcessAfterInitialization)。
  4. Bean的生存阶段:经过初始化的Bean可以被应用程序使用。
  5. Bean的销毁阶段:当Bean的生命周期结束时(如Spring容器关闭),那么Spring会调用其destroy()方法,如果有自定义的销毁方法,则调用自定义的销毁方法。

7. Spring中Bean的作用域有哪些?

答:Bean的作用域定义了其生命周期内的可见范围,Spring中Bean的作用域默认都是单例的(Singleton)。

  • 单例 Singleton:Spring容器中每个bean只有唯一一个实例,无论被注入多少次,都是返回的同一个实例。
  • 原型 Prototype:每次获取都会创建一个新的bean。
  • 请求 Request:仅在Web应用中有效,每次HTTP请求都会创建一个新的bean实例,请求结束后销毁。
  • 会话 Session:仅在Web应用中有效,每个HTTP会话创建时都会创建一个新的Bean实例,会话结束后销毁。
  • 应用 Application:仅在Web应用中有效,整个Web应用共享一个Bean实例,类似于Servlet上下文。
  • WebSocket:仅在WebSocket应用中有效。每个WebSocket会话创建时都会创建一个新的Bean实例,结束后销毁。

8. 什么是Spring中的代理(Proxy)?JDK动态代理和CGLIB代理有什么区别?

答:在Spring中代理是一种设计模式,主要用于实现诸如AOP(面向切面编程)这样的功能。代理模式允许在不修改原有对象的前提下,通过创建一个代理对象来包装原始对象,从而增加额外的功能,如日志记录、权限检查、事务管理等。

  • JDK动态代理:基于Java反射机制实现,要求目标类必须实现一个或多个接口。
  • CGLIB代理:是一个字节码生成库,它允许在运行时动态生成类。CGLIB代理用于那些没有实现接口的类。

9. Spring是怎么解决循环依赖的?

答:循环依赖是指两个Bean或多个Bean相互依赖,从而形成循环。如当 Spring 创建 A 之后,发现 A 依赖了 B ,又去创建 B,B 依赖了 A ,又去创建 A。

class A {// 使用了 Bprivate B b;
}
class B {// 使用了 Aprivate A a;
}

为了解决这个问题,Spring引入了三级缓存的机制来解决循环依赖。如果发生循环依赖的话,就去 三级缓存 singletonFactories 中拿到三级缓存中存储的 ObjectFactory 并调用它的 getObject() 方法来获取这个循环依赖对象的前期暴露对象(虽然还没初始化完成,但是可以拿到该对象在堆中的存储地址了),并且将这个前期暴露对象放到二级缓存中,这样在循环依赖时,就不会重复初始化了。

  • 三级缓存:
    • 一级缓存(singletonObjects):已经完全初始化并可供使用的单例Bean的缓存。
    • 二级缓存(earlySingletonObjects):存放早期单例对象bean,已经实例化但尚未初始化完成的bean。
    • 三级缓存(singletonFactories):存放正在创建中的Bean的工厂方法引用,用于创建代理对象。

10. 说一下你对Spring MVC的理解?Spring MVC的工作原理?

答:MVC是一种设计模式,它提供了一种分离业务逻辑,用户界面,控制流程方式。Spring MVC是实现MVC模式的框架,它可以帮我们以更简洁和模块化的方式构建Web应用。它包含三个核心注解,如下所示:

  • 模型(Model):负责应用程序的数据和业务逻辑。
  • 视图(View):负责展示数据,即用户界面。
  • 控制器(Controller):负责处理用户请求,协调模型和视图之间的交互。

Spring MVC的工作原理:

  1. 用户通过浏览器或其他客户端发送HTTP请求。
  2. 请求首先会到达DispatcherServlet(前端控制器),DispatcherServlet根据请求信息调用HandlerMapping,通过HandlerMapping找到对应的处理器,也就是我们Controller。
  3. 找到处理器后,DispatcherServlet会调用HandlerAdapter执行处理器中的方法。
  4. 处理器中的方法执行完成后,会返回一个ModelAndView对象给DispatcherServlet。
  5. DispatcherServlet会根据视图解析器,找到对应的视图。
  6. 视图通过对应的数据进行渲染。
  7. 然后将渲染的结果返回给用户。

11. Spring中是如何实现事务管理的?

答:Spring为事物提供了编程式和声明式两种方式来管理事务。通过事务可以确保数据操作的原子性、一致性、隔离性和持久性(ACID)。在Spring中,主要围绕PlatformTransactionManager(事务管理器接口,用于管理和协调事务的生命周期和执行),TransactionDefinition(事务定义接口,定义事物的传播行为和隔离级别),TransactionStatus(事务状态接口)来管理事务。

  • 编程式事务管理:通过TransactionTemplate或者TransactionManager手动管理事务

    @Service
    public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate PlatformTransactionManager transactionManager;public void createUser(User user) {TransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(def);try {userRepository.save(user);transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);throw e;}}
    }
    
  • 声明式事务管理:主要是通过@Transactional注解的形式

    @Service
    public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void createUser(User user) {userRepository.save(user);}@Transactional(readOnly = true)public User getUser(Long id) {return userRepository.findById(id).orElse(null);}
    }
    

12. 拦截器和过滤器了解吗?

答:拦截器和过滤器都是Java Web开发中常用的技术,用于对请求和响应进行处理。可以用于实现身份验证、日志记录、数据转换等功能。

  • 拦截器:拦截器是Spring中一种基于AOP思想的组件,其生命周期由Spring容器所管理。用于请求到达控制器之前和请求完成之后进行处理。主要用于处理业务逻辑相关的,如权限验证等处理。

    /*** 实现一个拦截器需要实现HandlerInterceptor接口*/
    public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 处理请求前System.out.println("Pre-handle");return true; // 返回false将终止请求处理}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// 处理请求后但在视图渲染之前System.out.println("Post-handle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// 完成请求处理后的清理工作System.out.println("After completion");}
    }/*** 在Spring中注册和配置拦截器*/
    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");}
    }
    
  • 过滤器:属于Servlet规范等一部分,用于在请求到达目标资源(如Servlet、JSP页面)之前和响应返回给客户端之后进行预处理和后处理。主要用于处理通用的,与Servlet规范相关的逻辑,如字符编码设置,安全检查等。

    /*** 实现Filter接口*/
    public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化代码}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 处理请求前System.out.println("Request received at filter");chain.doFilter(request, response);// 处理请求后System.out.println("Response returned at filter");}@Overridepublic void destroy() {// 销毁代码}
    }
    

参考资料

  • JavaGuide
  • 牛客网-Java面试宝典
  • Spring源码解析
  • Spring官方文档
  • ChatGPT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js实现移动蒙版层

移动蒙版层 可在整个页面拖动方块&#xff0c;但方块不能超出页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

阿里巴巴开源自然语音交互框架;在抱抱脸上使用LivePortrait;58种提示技术的工具库

✨ 1: FunAudioLLM FunAudioLLM是一个为人类和大型语言模型&#xff08;LLMs&#xff09;之间自然语音交互打造的语音理解和生成基础框架。 FunAudioLLM 是阿里巴巴集团Tongyi SpeechTeam推出的用于增强人类与大语言模型&#xff08;LLM&#xff09;自然语音交互的框架。该框…

去中心化 RAG 先行者,KIP Protocol 如何保护数据所有权、激活 AI 资产

AI 时代&#xff0c;人人都应实现 KnowledgeFi 的梦想或许并不遥远&#xff0c;KIP Protocol 正在生动践行这一价值理念&#xff0c;带动去中心化数字产权的创建与盈利&#xff0c;面向 CryptoAI 的蓝海市场迈出创新探索的技术步伐&#xff0c;朝着 Web3 行业打造去中心化 AI 的…

python:使用openpyxl模块处理excel

前言 最近在实践excel的处理&#xff0c;在此途中&#xff0c;我彻底抛弃了xlwt xlrd的组合&#xff0c;投入了openpyxl这一模块的怀抱。 并成功实现了excel单元格数据的快速访问、修改、样式保持&#xff0c;以及添加填充色等功能。 至于为什么写这个博客&#xff0c;主要是因…

前端面试题25(css常用的预处理器)

在前端开发领域&#xff0c;CSS预处理器在面试中经常被提及&#xff0c;其中最流行的三种预处理器是Sass、LESS和Stylus。下面分别介绍它们的特点和优势&#xff1a; 1. Sass&#xff08;Syntactically Awesome Style Sheets&#xff09; 优势&#xff1a; 变量&#xff1a;允…

RK3588开发笔记(四):基于定制的RK3588一体主板升级镜像

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140288662 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【机器学习】使用决策树分类器预测汽车安全性的研究与分析

文章目录 一、决策树算法简介决策树的结构分类和回归树 (CART)决策树算法术语决策树算法直觉 二、属性选择度量信息增益熵 基尼指数计算分割基尼指数的步骤 三、决策树算法中的过度拟合避免过度拟合的方法 四、导入库和数据可视化探索性数据分析重命名列名查看数据集的总结信息…

python库(8):re库实现字符串处理

1 re库简介 Python 的re库是一个功能强大的正则表达式模块&#xff0c;它允许用户执行各种复杂的字符串匹配和处理任务。 以下是re库的主要功能&#xff1a; 搜索&#xff1a;re.search() 用于搜索字符串中第一次出现的模式。匹配&#xff1a;re.match() 从字符串的开始位置…

ggplot2绘图点的形状不够用怎么办?

群里有这么一个问题&#xff1a; 请问老师&#xff0c;fviz_pca_ind 做pca&#xff0c;当设置geom.ind “point”&#xff0c;group>6时&#xff0c;就不能显示第7&#xff0c;8组的点&#xff0c;应该如何处理&#xff08;在不设置为文本的情况下&#xff09;&#xff0c;…

go-ext-sm2国密PHP扩展 密文指定排序、识别ans1编码等功能

go-ext-sm2 介绍 基于go-gmsm静态库编写的SM2椭圆曲线公钥密码算法PHP扩展 相较于openssl-ext-sm2编译更方便 增加了密文指定排序、识别ans1编码等功能 特性&#xff1a;非对称加密 git地址&#xff1a;https://gitee.com/state-secret-series/go-ext-sm2.git 软件架构 z…

该让医疗垂类大模型,走出“试题”了

图源&#xff1a;123rf “现阶段&#xff0c;许多医疗垂类大模型就是伪命题&#xff0c;推理能力不行。” 一位观望大模型已久的医疗从业者玄彬&#xff08;化名&#xff09;发出了极为尖锐的批评。 在他看来&#xff0c;目前人工智能是靠scaling law涌现的&#xff0c;模型性…

【Icon】矢量图、小图标、logo、资源网站,免费获取

要获取汽车和轮船的UI小图标、矢量图,可以访问以下一些网站,这些网站提供了丰富的图标和矢量图资源,适用于各种设计需求: 1. Flaticon 网站地址:https://www.flaticon.com/ 特点:Flaticon是一个与FreePik同一家公司的网站,专门为设计师找寻免费素材。它提供了大量高质…

【前端】使用chrom浏览器Network,查看前后台数据传输请求

使用chrom浏览器Network查看前后台数据传输请求 写在最前面查看前后台数据传输请求① 首先&#xff0c;打开开发者工具&#xff08;F12&#xff09;打开控制台&#xff0c;切换到Network面板。Network面板右键界面copy ②清空请求log ctrle两次或者点击clear图标 案例展示&…

鸿蒙开发HarmonyOS NEXT (三) 熟悉ArkTs (上)

一、自定义组件 1、自定义组件 自定义组件&#xff0c;最基础的结构如下&#xff1a; Component struct Header {build() {} } 提取头部标题部分的代码&#xff0c;写成自定义组件。 1、新建ArkTs文件&#xff0c;把Header内容写好。 2、在需要用到的地方&#xff0c;导入…

html——VSCode的使用

快捷键 快速生成标签&#xff1a;标签名tab 保存文件&#xff1a;CtrlS 设置自动保存【文件】→【自动保存】 快速查看网页效果&#xff1a;右击→Open in Default Browser 快捷键&#xff1a;altb 注意&#xff1a;必须安装了open in brows…

转载!abap代码规范

01、在增强里面禁止显式或者隐式提交(ZILOG所在函数如果用在增强里面&#xff0c;不要COMMIT) 02、WAIT、异步RFC&#xff0c;都会触发隐式提交&#xff0c;所以禁止在增强内以及禁止提交的场合使用 03、FOR ALL ENTRIES一定要判断内表是否为空且尽量删除重复&#xff0c;SEL…

软考高级第四版备考--第13天(规划资源管理)Plan Resoure Management

定义&#xff1a;定义如何估算、获取、管理和利用团队以及实物资源的过程。 作用&#xff1a;根据项目类型和复杂程度确定适用与项目资源的管理方法和管理程度 输入&#xff1a;项目章程、项目管理计划&#xff08;质量管理计划、范围基准&#xff09;、项目文件&#xff08;…

域渗透与横向渗透:获取域控制器最高权限的技术与策略

域渗透与横向渗透&#xff1a;获取域控制器最高权限的技术与策略 引言 域控制器是组织网络中的核心组件&#xff0c;负责管理用户账户、安全策略和网络资源访问。横向渗透是攻击者在内网中移动并控制更多系统的过程。获取域控制器的最高权限意味着攻击者可以对整个网络进行操…

windows10下的游戏怎么卸载?

在Windows 10中卸载游戏可以通过多种途径进行&#xff0c;下面是一些常见的方法&#xff1a; 方法一&#xff1a;通过“设置”应用卸载 1. 点击左下角的“开始”按钮&#xff0c;打开“开始”菜单。 2. 选择“设置”图标&#xff08;齿轮形状&#xff09;。 3. 在“设置”窗…

2024年5款最佳免费博客程序——对比和测评

多年来&#xff0c;我试用了许多不同的博客网站&#xff0c;并评估了它们在各种需求上的表现。这篇文章记录了我的发现&#xff08;截至2024年&#xff09;&#xff0c;旨在帮助您为您的项目选择最佳解决方案。 我将介绍五个非常优秀的博客平台&#xff0c;它们让您能够轻松创建…