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

Java后端每日面试题(day1)

目录

  • JavaWeb三大组件
  • 依赖注入的方式
  • @Autowire和@Resurce有什么区别?
  • Spring Boot的优点
  • Spring IoC是什么?
  • 说说Spring Aop的优点
  • @Component和@Bean的区别
  • 自定义注解时使用的RetentionPolicy枚举类有哪些值?
  • 如何理解Spring的SPI机制?
  • Spring Boot自动装配原理
  • Spring MVC工作原理

JavaWeb三大组件


  1. Servlet:Servlet是JavaWeb应用程序中处理请求和生成响应的基本组件。它是一个Java类,通过实现或继承Servlet接口来处理客户端请求,并生成响应数据。

  2. Listener:监听器用于监听Web应用程序中的事件,并在事件发生时执行相应的逻辑处理。

    使用场景:

    1. 初始化
    2. 释放资源
    3. 日志记录
  3. Filter:过滤器用于在请求和响应的处理过程中对数据进行拦截和处理。一个请求可以经过多个过滤器的处理,每个过滤器可以在请求的处理前后进行操作和拦截。

    使用场景:

    1. 权限验证
    2. 请求转发
    3. 日志记录
    4. 字符编码

总结而言

  • Servlet程序用于处理请求和生成响应数据
  • Listener监听器用于监听特定的Web应用程序事件执行相应逻辑
  • Filter过滤器用于对请求和响应数据进行拦截和处理。

它们各自在Web应用程序开发中具有重要的作用,能够实现灵活的请求处理、事件监听和数据过滤。

依赖注入的方式


在 Spring 中实现依赖注入的常见方式有以下 3 种:

  • 属性注入(Field Injection)
    • @Autowire实现属性注入
    • @Resurce实现属性注入
  • Setter 注入(Setter Injection)
  • 构造方法注入(Constructor Injection)

@Autowire和@Resurce有什么区别?


  1. autowire是Spring提供的;resource是J2EE提供的

  2. resource默认使用name装配,当找不到name时,会按类型装配

  3. AutoWire默认按类型装配,如果要使用名称装配可以用@Qualifier结合使用

Spring Boot的优点


  1. 开箱即用

    通过在pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期

  2. 约定优于配置

    约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需要的配置。

  3. 内置tomcat

Spring IoC是什么?


IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现,IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。

  • 为什么叫控制反转?
    控制:指的是对象创建(实例化、管理)的权力
    反转:控制权交给外部环境(Spring 框架、IoC 容器)

  • Spring IoC的实现机制:工厂模式+反射机制

说说Spring Aop的优点


  • 减少系统的重复代码
  • 降低模块间的耦合度
  • 封装切面逻辑

@Component和@Bean的区别


  • @Component 注解用在类上,表明一个类会作为组件类,并告知Spring要为这个类创建bean,每个类对应一个 Bean。

  • @Bean 注解用在方法上,表示这个方法会返回一个 Bean。

  • @Bean 注解更加灵活,相比@Component注解自定义性更强

自定义注解时使用的RetentionPolicy枚举类有哪些值?


源代码类文件虚拟机
SOURCE✔️
CLASS✔️✔️
RUNTIME✔️✔️✔️

当值设为SOURCE,只有源文件中可以看到注解
当值设为CLASS,可在源文件和编译后的Class文件中可以看到注解
当值设为RUNTIME,不仅在源文件和编译后的Class文件中可以看到注解,JVM还能通过反射机制获取到注解

如何理解Spring的SPI机制?


  • Java SPI

SPI 全称 Service Provider Interface,是 Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件

SPI的作用就是为这些被扩展的API 寻找服务实现。本质是通过基于接口编程+策略模式+配置文件 实现动态加载。可以实现 解耦 (接口和实现分离),提高框架的 可拓展性(第三方可以自己实现,达到插拔式的效果)。

  • Spring SPI

Spring SPI对 Java SPI 进行了封装增强。我们只需要在 META-INF/spring.factories 中配置接口/类/注解名,即可通过服务发现机制,在运行时进行自动加载。

Spring Boot自动装配原理


Spring Boot自动装配如下图所示:
Spring Boot自动装配原理
Springboot项目的启动类需要由 @SpringBootApplication 注解修饰,该注解复合了如下三个注解。

  1. @SpringBootConfiguration。表明Springboot启动类是一个配置类

  2. @ComponentScan。会将指定路径下的被特定注解修饰的类加载为Spring中的Bean,这些特定注解为@Component,@Controller,@Service,@Repository和@Configuration注解;

  3. @EnableAutoConfiguration。用于开启Springboot的自动装配,该注解复合了如下两个核心注解。

    • @AutoConfigurationPackage。用于将启动类所在的包里面的所有组件注册到spring容器。
    • @Import(AutoConfigurationImportSelector.class)
  • 自动装配流程说明(重要)

    1. @Import AutoConfigurationImportSelector 注入到spring容器中
    2. AutoConfigurationImportSelector 通过 SpringFactoriesLoader 从类路径下去读取META-INF/spring.factories文件信息
    3. 此文件中有一个key为org.springframework.boot.autoconfigure.EnableAutoConfiguration,定义了一组需要自动配置的bean

Spring MVC工作原理


Spring MVC 原理如下图所示:
流程

  • 流程说明(重要)
    1. 客户端(浏览器)发送请求, DispatcherServlet拦截请求
    2. DispatcherServlet 根据请求信息调用 HandlerMapping 。HandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。
    3. DispatcherServlet 调用 HandlerAdapter适配器执行 Handler
    4. Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给DispatcherServlet,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
    5. ViewResolver 会根据逻辑 View 查找实际的 View
    6. DispaterServlet 把返回的 Model 传给 View(视图渲染)
    7. View 返回给请求者(浏览器)

相关文章:

  • C++STL函数对象的应用
  • 【单链表】03 设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。
  • 认识不-物联网“六域模型”有哪些有什么作用
  • git上传时出现了main master的问题解决
  • Redis优化之持久化
  • Patch SCN使用说明---惜分飞
  • 深入理解 Linux 内核架构
  • Uniapp 默认demo安装到手机里启动只能看得到底tab无法看到加载内容解决方案
  • C++感受12-Hello Object 派生版
  • C语言pow函数简单介绍
  • Linux 端口
  • IO、零拷贝、多路复用、connection、池化
  • 一文让你彻底搞懂什么是CDN
  • Linux RHEL 8.6在安装PostgreSql时提示缺少en_US.UTF-8
  • 证券交易系统中服务器监控系统功能设计
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • avalon2.2的VM生成过程
  • HomeBrew常规使用教程
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • python_bomb----数据类型总结
  • ReactNative开发常用的三方模块
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQLServer插入数据
  • vagrant 添加本地 box 安装 laravel homestead
  • 产品三维模型在线预览
  • 飞驰在Mesos的涡轮引擎上
  • 坑!为什么View.startAnimation不起作用?
  • 使用common-codec进行md5加密
  • 算法之不定期更新(一)(2018-04-12)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信小程序设置上一页数据
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一文看透浏览器架构
  • 正则表达式小结
  • 你对linux中grep命令知道多少?
  • # 数据结构
  • #window11设置系统变量#
  • (007)XHTML文档之标题——h1~h6
  • (13)DroneCAN 适配器节点(一)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (PADS学习)第二章:原理图绘制 第一部分
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (第61天)多租户架构(CDB/PDB)
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (九)One-Wire总线-DS18B20
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core中Emit的使用
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net 路由处理厉害了
  • .net连接oracle数据库