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.rhkb.cn/news/223888.html

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

相关文章

3.[BUUCTF HCTF 2018]WarmUp1

1.看题目提示分析题目内容 盲猜一波~ &#xff1a; 是关于PHP代码审计的 2.打开链接&#xff0c;分析题目 给你提示了我们访问source.php来看一下 大boss出现&#xff0c;开始详细手撕~ 3.手撕PHP代码&#xff08;代码审计&#xff09; 本人是小白&#xff0c;所以第一步&…

解读SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC

SPP与SPPF 一、SPP的应用的背景 在卷积神经网络中我们经常看到固定输入的设计&#xff0c;但是如果我们输入的不能是固定尺寸的该怎么办呢&#xff1f; 通常来说&#xff0c;我们有以下几种方法&#xff1a; &#xff08;1&#xff09;对输入进行resize操作&#xff0c;让他们…

案例144:基于微信小程序的自修室预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Unity手机移动设备重力感应

Unity手机移动设备重力感应 一、引入二、介绍三、测试成果X Y轴Z轴横屏的手机&#xff0c;如下图竖屏的手机&#xff0c;如下图 一、引入 大家对重力感应应该都不陌生&#xff0c;之前玩过的王者荣耀的资源更新界面就是使用了重力感应的概念&#xff0c;根据手机的晃动来给实体…

Latex生成的PDF中加入书签/Navigation/导航

本文参考&#xff1a;【Latex学习】在生成pdf中加入书签/目录/提纲_latex 书签-CSDN博客 &#xff08;这篇文章写的真的太棒了&#xff01;非常推荐&#xff09; 题外话&#xff0c;我的碎碎念&#xff0c;这也是我如何提高搜索能力的办法&#xff1a;想在Latex生成的PDF中加入…

2023美团机器人研究院学术年会成功举办

2023年12月19日&#xff0c;深圳市美团机器人研究院学术年会在清华大学深圳国际研究生院成功落下帷幕。会议回顾了研究院成立一年来的进展和成果&#xff0c;并邀请了各界专家共同讨论机器人技术的未来发展趋势。此外&#xff0c;年会期间还举办了首届低空经济智能飞行管理挑战…

【网络安全/CTF】unseping 江苏工匠杯

该题考察序列化反序列化及Linux命令执行相关知识。 题目 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($thi…

安洵杯 re + 其他部分题解

第11&#xff0c;比较小丑&#xff0c;差了一步队伍wp应该会发吧&#xff0c;不知道&#xff0c;我先放点跟我有关系的 Re mobilego so的check看了一会比较南崩&#xff0c;但是看flag的密文形式很像简单位置替换所以直接输编码表&#xff0c;jeb动调然后得到替换表解密就行…

CnosDB:深入了解时序数据处理函数

CnosDB 是一个专注于时序数据处理的数据库&#xff0c;旨在解决时序数据存储与分析问题&#xff0c;为用户提供高效的时序数据管理与查询便利。为了实现这一目标&#xff0c;CnosDB 实现了一系列专用函数&#xff0c;快来和CC一起来看看吧&#xff01; CnosDB&#xff1a;深入了…

PHP下载安装以及基本配置

目录 引言 官网 下载 配置 1. 鼠标右键“此电脑”>“属性” 2. 打开高级系统设置 3. 打开环境变量 4. 双击系统变量中的path 5. 新建新的path 6. 将刚刚安装的位置加入环境变量 7. 检查是否安装成功 引言 PHP&#xff08;"PHP: Hypertext Preprocessor"…

Python-基于fastapi实现SSE流式返回(类似GPT)

最近在做大模型对话相关功能&#xff0c;需要将对话内容流式返回给前端页面&#xff08;类似GPT的效果&#xff09;。下面直接说下如何实现&#xff1a; 1.首先导入fastapi和sse流式返回所需要的包 from fastapi import APIRouter, Response, status from sse_starlette.sse …

指针的含义

我们还取前面图片解释的道理&#xff1a; pa表示的意思就是这个地址&#xff0c;并不会显示出10这个数字 *pa就是指针&#xff0c;最后指向了a10&#xff0c;所以他最后程序输出是10 &pa这个含义就是取pa的地址&#xff0c;那么pa是一个虚拟的地址&#xff0c;只是简单的…

鸿蒙开发语言介绍--ArkTS

1.编程语言介绍 ArkTS是HarmonyOS主力应用开发语言。它在TypeScript (简称TS)的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 2.TypeScript简介 自行补充TypeScript知识吧。h…

AndroidStudio无法新建aidl文件解决办法

我用的 AS 版本是 Android Studio Giraffe | 2022.3.1 Build #AI-223.8836.35.2231.10406996, built on June 29, 2023 右键新建 aidl 文件&#xff0c; 提示 (AIDL File)Requires setting the buildFeatures.aidl to true in the build file 解决办法 修改 app 的 build.…

python画图【03】泰坦尼克号数据分析

导包 import numpy as np import pandas as pdimport matplotlib import matplotlib.pyplot as plt %matplotlib inlineplt.rcParams[font.sans-serif] "Microsoft YaHei"import seaborn as sns加载数据集 titanic sns.load_dataset("titanic")titanic…

分布式事务2PC二阶段提交详解

文章目录 概述和概念执行过程和工作流程特点优劣势应用场景总结demo代码样例 概述和概念 二阶段提交&#xff08;2PC&#xff09;是一种用于确保在分布式系统中的所有节点在进行事务提交时保持一致性的算法 二阶段提交&#xff08;Two-Phase Commit&#xff0c;2PC&#xff09…

【c++】string类的使用

目录 一、标准库中的string类 1、简单介绍string类 2、string类的常用接口注意事项 2.1、string类对象的常用构造 2.2、string类对象的容量操作 2.3、string类对象的访问及遍历操作 2.4、string类对象的修改操作 二、string类的模拟实现 一、标准库中的string类 1、简…

听GPT 讲Rust源代码--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代码中&#xff0c;suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目录下&#xff0c;用于实现Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

备份至关重要!如何解决iCloud的上次备份无法完成的问题

将iPhone和iPad备份到iCloud对于在设备发生故障或丢失时确保数据安全至关重要。但iOS用户有时会收到一条令人不安的消息&#xff0c;“上次备份无法完成。”下面我们来看看可能导致此问题的原因&#xff0c;如何解决此问题&#xff0c;并使你的iCloud备份再次顺利运行。 这些故…

rk3588 之启动

目录 uboot版本配置修改编译 linux版本配置修改编译 启动sd卡启动制作spi 烧录 参考 uboot 版本 v2024.01-rc2 https://github.com/u-boot/u-boot https://github.com/rockchip-linux/rkbin 配置修改 使用这两个配置即可&#xff1a; orangepi-5-plus-rk3588_defconfig r…