Spring面试题系列-5

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

为什么要使用AOP?

使用AOP(面向切面编程)的原因可能包括以下几点:

  1. 分离关注点:AOP允许开发者将横切关注点(如日志记录、安全检查、事务管理等)从业务逻辑中分离出来,使得这些关注点的实现可以独立于业务逻辑进行。
  2. 代码重用:通过AOP,横切关注点的实现可以在多个地方重用,避免了重复编写相同功能的代码,提高了代码的复用性。
  3. 动态代理:AOP通常使用动态代理技术在不修改源码的基础上对已有方法进行增强,这样可以在运行时动态地添加或修改行为,增加了程序的灵活性。
  4. 提高可维护性:由于横切关注点的代码被集中管理,当需要修改或更新这些功能时,只需在一个地方进行修改,而不需要在散布于各处的业务逻辑代码中寻找和修改,大大提高了代码的可维护性。
  5. 设计更清晰:使用AOP可以使系统设计更加清晰,因为相关的代码被组织在一起,而不是分散在多个类或对象中。
  6. 减少模块间耦合:通过将横切关注点与业务逻辑分离,可以减少模块之间的耦合度,使得各个模块更加独立,易于理解和测试。
  7. 提升效率:在大型项目中,使用AOP可以节省大量的开发时间,因为开发者不需要手动在每个业务逻辑中添加横切关注点的代码。

综上所述,AOP是一种强大的编程范式,其可以提高代码的重用性、可维护性和清晰性,同时减少模块间的耦合,提高开发效率。是现代软件开发中不可或缺的工具之一。

AOP中的相关术语

AOP(面向切面编程)是一种编程范式,用于将横切关注点从业务逻辑中分离出来,以提高代码的可维护性和重用性。以下是一些与AOP相关的术语及其解释:

  • Joinpoint(连接点):指在程序执行过程中可以被AOP框架拦截的特定点,通常是指方法。
  • Pointcut(切入点):定义需要对哪些连接点进行拦截,是选择连接点的一种方式。
  • Advice(通知/增强):定义了在连接点被拦截后要执行的动作,包括前置、后置、异常、最终和环绕通知。
  • Introduction(引介):一种特殊类型的通知,可以在不修改类代码的情况下,为类动态添加方法或字段。
  • Target(目标对象):AOP代理的目标对象,即被AOP增强的原始对象。
  • Weaving(织入):将切面应用到目标对象上,创建出被通知(增强)的对象的过程。Spring采用动态代理织入,而AspectJ提供编译期和类加载期织入。
  • Proxy(代理):经过AOP织入增强后生成的对象。
  • Aspect(切面):包含切入点和通知的模块化关注点,它定义了在哪些点执行什么样的增强逻辑。

这些术语共同构成了AOP的核心概念,它们使得AOP能够通过声明式的方式实现横切关注点的模块化,从而在不改变原有业务逻辑代码的基础上,增加额外的行为或功能。

Spring选择那种方式代理?

Spring主要使用两种方式进行AOP代理:JDK动态代理和CGLIB代理
首先,当目标对象实现了一个或多个接口时,Spring AOP会使用JDK动态代理。这是因为JDK动态代理要求目标对象必须实现接口,它通过反射机制在运行时动态地创建一个代理类,该代理类实现了与目标对象相同的接口,并在调用接口方法时提供预先定义的增强逻辑。
其次,如果目标对象没有实现任何接口,或者需要代理的是final类,Spring AOP将使用CGLIB代理。CGLIB是一个第三方库,它可以在内存中动态创建新的类,这些类继承自目标类并实现了所需的增强功能。从Spring 4.3版本开始,CGLIB已经包含在Spring框架中,因此不需要额外导入。
总的来说,这两种代理方式都允许在不修改原有代码的基础上,为目标对象添加额外的行为或功能。代理技术是实现AOP的核心和关键技术,它使得可以在运行时对目标对象的特定方法进行增强处理,如日志记录、安全检查等横切关注点的处理。通过这种方式,Spring AOP能够提高代码的重用性和可维护性,同时减少了模块间的耦合度。

Spring引入外部配置文件的方式

Spring框架提供了多种方式来引入外部配置文件,这些方式包括但不限于命令行参数、环境变量以及使用注解等。具体来看:

  1. 命令行参数:可以通过命令行参数指定一个配置文件,这会使得默认的application.propertiesapplication.yml文件失效,即指定的配置文件将替换默认文件。
  2. 环境变量:Spring Boot 支持通过环境变量来进行配置,这是一种在不同环境下使用同一套应用程序代码的常用方法。
  3. **@PropertySource **:可以使用@PropertySource注解在类路径下指定一个或多个属性文件。
  4. spring.config.import:通过设置spring.config.import属性,可以导入classpath下任意目录的文件作为配置文件。
  5. **@ImportResource **:使用@ImportResource注解可以直接加载Spring的XML配置文件。
  6. 全注解方式:Spring还提供了全注解的方式来加载配置,这种方式不需要显式的配置文件,而是通过注解来指定配置信息。

以上这些方式为开发者提供了灵活的配置选择,可以根据实际项目的需要和开发环境来选择最合适的配置方式。

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

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

相关文章

Python教程:(Sweetviz)仅三行代码就能实现数据可视化

weetviz 的主要功能 自动化报告生成 Sweetviz 能够自动分析数据集的特征和属性,并生成详细的 EDA 报告。用户无需手动编写复杂的代码,只需简单调用 Sweetviz 函数即可生成完整的报告。 多种可视化图表 Sweetviz 提供了多种可视化图表,包括直…

Hive常用函数_16个时间日期处理

在Hive中,常用的时间处理函数包括但不限于以下几种: 1. current_date(): 返回当前日期,不包含时间部分 SELECT current_date(); -- Output: 2024-09-152. current_timestamp(): 返回当前时间戳,包含日期和时间部分 SELECT curr…

【Docker】Windows中打包dockerfile镜像导入到Linux

【Docker】Windows中打包dockerfile镜像导入到Linux 大家好 我是寸铁👊 总结了一篇【Docker】Windows中打包dockerfile镜像导入到Linux✨ 喜欢的小伙伴可以点点关注 💝 前言 今天遇到一个新需求,如何将Windows中打包好的dockerfile镜像给迁移…

Autodesk Maya 2025---智能建模与动画创新,重塑创意工作流程

Autodesk Maya 2025是一款顶尖的三维动画软件,广泛应用于影视广告、角色动画、电影特技等领域。新版本在功能上进行了全面升级,新增了对Apple芯片的支持,建模、绑定和角色动画等方面的功能也更加出色。 在功能特色方面,Maya 2025…

equals()和hashcode()的区别【大白话Java面试题】

equals()和hashcode()的区别 大白话 1.equals():反应的是对象或变量具体的值,及两个对象包含的具体的值(可能是对象的引用,也可能是值类型的值) 2.hashcode():计算两个对象的哈希值,并返回哈希码&#xff…

逆向分析之antibot

现在太卷了,没资源,很难接到好活,今天群里看到个单子,分析了下能做,结果忙活了一小会,幸好问了下,人家同时有多个人再做,直接就拒绝再继续了。就这次忘了收定金了,所以原…

数据可视化之多表显示

多表显示subplot(),subplots() # 使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图# 导入库,和调用中文import matplotlib.pyplot as pltimport numpy as np# 作用:解决坐标轴为负时 负号显示为方框的问题# axes:坐标轴# Unicod…

使用python实现i茅台自动预约

使用python实现i茅台自动预约[仅限于学习,不可商用] 运行: 直接运行 imtApi.py 打包:切换到imt脚本目录,执行打包命令: pyinstaller --onefile imtApi.py这个应用程序可以帮助你进行茅台自动化配置。以下是一些使用说明: 平台注册账号(可用i茅台)不用登录,你可以进行…

Linux的VirtualBox中USB设备无法选择USB3.0怎么办?

在VirtualBox中,如果遇到USB设备无法选择 USB 3.0 的问题,可以尝试按照以下步骤来解决: 确保VirtualBox版本支持USB 3.0:首先,你需要确认你的VirtualBox版本是否支持USB 3.0。一些较旧的版本可能不支持,因此…

一篇搞定AVL树+旋转【附图详解旋转思想】

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

【Effective Web】页面优化

页面优化 页面渲染流程 JavaScript 》 Style 》 Layout 》 Paint 》 Composite 首先js做了一些逻辑,触发了样式变化,style计算好这些变化后,把影响的dom元素进行重新布局(layout),再画到画布中(Paint&am…

半导体工艺技术

完整内容点击:【半导体工艺技术】

将jupyter notebook文件导出为pdf(简单有效)

1.打开jupyter notebook笔记: 2.点击file->print Preview 3.在新打开的页面右键打印 4.另存为PDF 5.保存即可 6.pdf效果 (可能有少部分图片显示不了) 网上也有其他方法,比如将其转换为.tex再转为PDF等,但个人觉…

面试前端八股文十问十答第四期

面试前端八股文十问十答第四期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)var、let 和 const 的区别&am…

ubuntu 中安装docker

1 资源地址 进入ubuntu官网下载Ubuntu23.04的版本的镜像 2 安装ubuntu 这里选择再Vmware上安装Ubuntu23.04.6 创建一个虚拟机,下一步下一步 注意虚拟机配置网络桥接,CD/DVD选择本地的镜像地址 开启此虚拟机,下一步下一步等待镜像安装。 3…

spring boot的小数位丢失.00 或者.0

1、背景 在使用spring boot时,前端的界面展示的数据是2 ,在数据库中存储的是小数。但是导出Excel的时候数据是 2.00 。奇了怪了为啥会不一样,数据都是一样的没有做过处理。 2、排查问题 经过层层的debug 发现数据库返回的数据是2.00&#x…

数据可视化-ECharts Html项目实战(8)

在之前的文章中,我们学习了如何设置散点图涟漪效果与仪表盘动态指针效果。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢 今天的文章,会…

【c++】类和对象(六)深入了解隐式类型转换

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来到初始化列表,隐式类型转换以及explicit的内容 目录 1.初始化列表1.1构造函数体赋值1.2初始化列表1.2.1隐式类型转换与复制初始化 1.3e…

python基础——文件操作【文件编码、文件的打开与关闭操作、文件读写操作】

📝前言: 这篇文章主要讲解一下python中对于文件的基础操作: 1,文件编码 2,文件的打开与关闭操作 3,文件读写操作 🎬个人简介:努力学习ing 📋个人专栏:C语言入…

04 | Swoole 源码分析之 epoll 多路复用模块

首发原文链接:Swoole 源码分析之 epoll 多路复用模块 大家好,我是码农先森。 引言 在传统的IO模型中,每个IO操作都需要创建一个单独的线程或进程来处理,这样的操作会导致系统资源的大量消耗和管理开销。 而IO多路复用技术通过…