Java开发框架和中间件面试题(1)

1.什么是Spring框架?    

    Spring是一种轻量级框架,旨在提高开发人员的开发效率以及系统的可维护性。

    我们一般说的Spring框架就是Spring Framework,它是很多模块的集合,使用这些模块可以很方便的协助我们进行开发。这些模块是核心容器、数据访问/集成、web、aop(面向切面编程)、工具、消息和测试模块。比如core container中的core组件是Spring所有组件的核心,beans组件和context组件是实现IOC和DI的基础,AOP组件用来实现面向切面编程。

   Spring官网列出的Spring的六个特征:

    核心技术:依赖注入(DI)、AOP、事件(Events)、资源、i18n、验证、数据绑定、类型转换、SPEL。

   测试:模拟对象、TestContext框架、Spring MVC测试、WebTestClient。

    数据访问:事务、DAO支持、JDBC、ORM、编组XML。

Web支持:Spring MVC 和Spring Web Flux Web框架。

集成:远程处理、JMS、JCA、JMX、电子邮件、任务、调度、缓存。

语言:Kotlin,Groovy,动态语言。

2.列举一些重要的Spring模块?

下面对应的是Spring 4.X的版本,目前最新的5.X版本中Web模块的Portlet组件已经被废弃掉,同时增加了用于异常响应的Web Flux组件。

   Spring Core:基础,可以说Spring其他所有的功能都依赖于该类库。主要提供IOC和DI功能。

  Spring Aspects:该模块为与Aspects的集成提供支持。

  Spring AOP:面向切面编程。

  Spring  JDBC:Java数据库连接。

Spring JMS:Java消息服务。

 Spring ORM:用于支持Hibernate等ORM工具。

Spring Web:为创建Web应用程序提供支持。

Spring Test:提供了对Junit和TestNG测试的支持。

3.什么事IOC?如何实现的?

IOC(控制反转)是一种设计思想,就是将本来在程序中手动创建对象的控制权,交给IOC容器来管理,并由IOC容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何创建出来的。

Spring 中的 IOC的实现原理就是工厂模式加反射机制。

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

    Spring AOP 是属于运行时增强,而AspectJ是编译时增强。Spring  Aop 基于代理,而AspectJ基于字节码操作。

   Spring AOP  已经集成了Aspect J ,Aspect J 应该算得上是Java 生态系统中最完整的AOP框架了。Aspect J相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单。

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择Aspect  J ,它比Spring AOP快很多。

5.Spring中的bean的作用域有哪些?

1.singleton:唯一bean实例,Spring  中的bean默认都是单例的。

2.prototype:每次请求都会创建一个新的bean实例。

3.request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP  request内有效。

4.session:每一次Http请求都会产生一个新的bean,该bean仅在当前Http Session内有效。

5.global  session:全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5中已经没有了。

6.Spring 中的单例bean的线程安全问题了解吗?

   大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。

  有两种常见的解决方案:

1.在bean对象中尽量避免定义可变的成员变量(不太现实)。

2.在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在TheadLocal中(推荐的一种方式)。

7.Spring中的bean生命周期?

   bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:

   bean自身的方法:这个包括类Bean本身调用的方法和通过配置文件中<bean>的初始化方法和销毁方法指定的方法。

bean 级生命周期接口方法:这个包括了BeanNameAware,BeanFactoryAware,ApplicationContextAware,

当然也包括initializingBean和DisposableBean这些接口的方法(可以被@PostConstructe和@PreDestroy注解替代)

容器级生命周期接口方法:这个包括类InstantiationAwareBeanPostProcessor和BeanPostProcessor这两个接口实现,一般称它们的实现类为后处理器。

工厂后处理器接口方法:

这个包括了AspectJWeavingEnabler,ConfigurationClassPostProcessor,

CustomAutowireCofigure等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级别的。在应用上下文装配配置文件之后立即调用。

具体而言,流程如下:

1.如果BeanFactoryPostProcessor和Bean 关联,则调用postProcessBeanFactory方法(即首先尝试从bean工厂中获取bean)。

2.如果InstantiationAwareBeanPostProcessor和Bean关联,则调用postProcessBeforeInstantiation方法。

3.根据配置情况调用Bean构造方法实例化Bean。

4.利用依赖注入完成Bean中所有属性值的配置注入。

5.如果InstantiationAwareBeanPostProcessor和Bean关联,则调用postProcessAfterInstantiation方法和post ProcessProperties.

调用xxAware接口:

第一类Aware接口

如果Bean实现了BeanNameAware接口,则Spring调用Bean的set BeanName()方法传入当前Bean的ID值。

如果Bean实现了BeanFactoryAware接口,则Spring调用set BeanFactory()方法传入当前工厂实例的引用。

第二类Aware接口

  如果Bean实现了EnvironmentAware接口,则Spring调用setEnvironment()方法传入当前Environment实例的引用。

 如果Bean实现了EmbeddedValueResolverAware接口,则Spring调用setEmbeddedValueResolver()方法传入当前StringValueResolver实例的引用。

  如果Bean实现了ApplicationContextAware接口,则Spring调用setApplicationContext()方法传入当前的ApplicationContext实例的引用。

6.如果BeanPostProcessor和Bean关联,则Spring将调用该接口的预初始化方法。

postProcessBeforeInititiazation()对bean进行加工操作,此处非常重要,Spring 的Aop就是利用它实现的。

7.如果Bean实现了initializingBean接口,则Spring将调用afterPropertiesSet()方法。(或者执行@PostConstruct注解的方法)

8.如果在配置文件中通过init method属性指定了初始化方法,则调用该初始化方法。

9.如果BeanPostProcessor和Bean关联,则Spring将调用该接口的初始化方法。

postProcessAfterInitialization().此时,Bean已经可以被应用系统使用了。

10,如果在<bean>中指定了该Bean的作用范围为scope=“singleton”,则将该Bean放入SpringIoc的缓存池中,将触发Spring对该Bean的生命周期管理,如果在<bean>中指定了该Bean的作用范围为scope=“prototype”,则将该Bean交给调用者,,调用者管理该Bean的生命周期,Spring不再管理该Bean。

11.如果Bean实现了DisposableBean接口,则Spring会调用destroy()方法将Spring中的Bean销毁;(或者有执行@PreDestroy注解的方法)

如果在配置文件中通过destroy  method属性指定了Bean的销毁方法,则Spring将调用该方法对Bean进行销毁。

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

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

相关文章

安卓手机如何打开ics文件?ics格式文件用什么软件打开?

什么是ics格式文件&#xff1f;Ics格式文件是什么呢&#xff1f;其实ics格式文件是一种用于保存和交换日历信息的标准格式&#xff0c;它通常可以保存事件的名称、时间等信息&#xff0c;有不少日历、待办软件在导出数据的时候&#xff0c;都是以ics文件导出的。 有不少网友目…

求职方略-倒金字塔型自我介绍

第一步,开头第一句话提纲挈领,点出你的主要“卖点” 自我介绍的第一句话很重要,要有足够的吸引力,有足够的信息量,还要有足够的说服力,能产生先声夺人的效果。 一般的自我介绍喜欢按照时间线索依次介绍自己的经历,例如:“我大学毕业后就进入一家大公司的研发中心,工…

java.lang.IllegalStateException: Duplicate key

序言 最近监控扫描出我们项目的某些异常信息&#xff0c;报错java.lang.IllegalStateException: Duplicate key xxx&#xff0c;看到异常来自stream流&#xff0c;然后定位看了一下是某位同事的代码使用stream流把List转Map集合出现重复的key异常信息。List集合A对象来源于某个…

C# WPF上位机开发(QT vs WPF)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 最近经常收到朋友们的私信&#xff0c;他们对C# WPF开发很感兴趣&#xff0c;但是呢&#xff0c;正当准备学习的时候&#xff0c;又有人告诉他们应…

Linux编程环境和软件设施安装

目录 一、Linux编程环境安装 1.yum安装 2. vim安装&#xff08;文本编辑工具&#xff09; 3. lrzsz安装&#xff08;文件上传下载工具&#xff09; &#xff08;1) 搜索lrzsz安装包 &#xff08;2) 在线安装lrzsz &#xff08;3) 测试 二、Linux软件安装 1. 软件安装方…

Ubuntu 常用命令之 history 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 history命令在Ubuntu系统中用于显示用户执行过的命令列表。这个命令在bash shell中非常有用&#xff0c;特别是当你需要记住你之前执行过的命令时。 history命令的参数如下 -c&#xff1a;清除历史记录。-d offset&#xff1a;删…

Python如何生成随机图形验证码

python生成随机图形验证码 使用python生成随机图片验证码,需要使用pillow模块 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL import Image #定义使用Image类实例化一个长为400px,宽为400px,基于RGB的(255,255,255)颜色的图片 img1Ima…

win11下配置visual studio 2022+PCL1.13.1

第一部分&#xff1a;visual studio2022 安装 vs官网网址如下&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 第一步&#xff1a;我们打开官网链接&#xff0c;按如下操作点击下载免费版本的exe文件 第二步&#xff1a;打开下载目录下的安装文件进行安装&#…

SQL 多字段条件查询

SQL 多字段条件查询 一个数据库表&#xff0c;几十个字段&#xff0c;查找任意字段里包含北京的记录&#xff0c;在 mysql 里这句 sql 应该是这样&#xff1a; SELECT * FROM table WHERE concat(field1,field2,field3……fieldn) like ‘% 北京 %’ 反正是少不了将几十个字…

【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering

原文链接&#xff1a;https://arxiv.org/abs/2308.04079 1. 引言 网孔和点是最常见的3D场景表达&#xff0c;因其是显式的且适合基于GPU/CUDA的快速栅格化。神经辐射场&#xff08;NeRF&#xff09;则建立连续的场景表达便于优化&#xff0c;但渲染时的随机采样耗时且引入噪声…

Win11安装ise14.7~不需要虚拟机了~

之前一直无法在win11上安装ise14.7&#xff0c;网上搜索也无果&#xff0c;所有一直vmware虚拟机使用。直到最近看了水木上jesce的回复&#xff0c;试了下果然可以直接安装使用的。 步骤如下即可&#xff1a; 安装时切勿勾选最后一项&#xff0c;Enable WebTalk to send softwa…

Python (十五)pandas(三)

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

【vtkWidgetRepresentation】第十六期 vtkContourRepresentation(三)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkContourLineInterpolator接口的源码剖析和实例应用,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 …

Collecting package metadata (current_repodata.json): failed(解决方案)

如果有重装过anaconda&#xff0c;在C盘的用户目录下&#xff0c;会有一个名叫.condarc的文件会自动生成。 当使用conda install和conda create命令会出现下面的问题&#xff1a;Collecting package metadata (current_repodata.json): failed 解决方案&#xff1a; 1.打开Anac…

深圳鼎信|配电网故障定位与预警装置_高效_快速

电能是我们生活和生产的一种主要能源。在电能供应过程中&#xff0c;配电网是电网的末端环节&#xff0c;但在能源转型的背景下&#xff0c;配电网逐渐成为电网发展的前沿阵地&#xff0c;将来也会越来越重要。 我国疆土辽阔&#xff0c;不同地区配电网的结构各具特色。总的来说…

openGauss学习笔记-169 openGauss 数据库运维-备份与恢复-导入数据-更新表中数据-使用DML命令更新表

文章目录 openGauss学习笔记-169 openGauss 数据库运维-备份与恢复-导入数据-更新表中数据-使用DML命令更新表169.1 操作步骤 openGauss学习笔记-169 openGauss 数据库运维-备份与恢复-导入数据-更新表中数据-使用DML命令更新表 openGauss支持标准的数据库操作语言&#xff08…

我的应用我做主:扩展线程池

自定义线程创建&#xff1a;ThreadFactory 线程池中的线程是从哪里来的呢&#xff1f; ThreadPoolExecutor(int corePoolSize,//指定了线程池种的线程数量 int maximumPoolSize,//指定了线程池中的最大线程数量。 long keepAliveTime,// 当线程池数量超过了corePoolSize&#x…

信息收集 - 谷歌hack

搜索引擎 FOFA网络空间测绘:https://fofa.info/ FOFA(FOcus on Assets)是一个网络空间搜索引擎,可以帮助用户快速定位和收集特定目标的信息。 ZoomEye:https://www.zoomeye.org ZoomEye 是一个网络空间搜索引擎,可以用于发现和收集特定目标的网络设备、Web应用程序、开放…

【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 思路 1、继承关系 2、运行时类型检查 结语 我的其他博客 前言 在Java编程中&#xff0c;强制类型转换是一个常见的操作&#xf…

操作系统 day15(信号量)

信号量机制 之前学习了这些解决进程互斥的方案 *但它们都无法实现“让权等待”&#xff0c;于是Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法----信号量机制 总结&#xff1a;一个信号量对应一种资源。信号量的值这种资源的剩余数量&#xff08;信号量的值如果小于…