Java[面试题]-真实面试
1.什么是IOC和AOP?了解么?
IOC(控制反转)和AOP(面向切面编程)
1. IOC(控制反转)
概念
IOC(Inversion of Control)是面向对象编程中的一个设计原则,意味着控制的反转或转移。简单来说,IOC把对象的创建和依赖关系的管理交给容器,而不是由程序员手动管理。通过IOC,程序中的组件之间变得松耦合,组件可以独立测试和维护。
public class Service {private Database database;public Service() {this.database = new Database(); // 这里硬编码了依赖}public void processData() {database.save();}
}
传统的创建对象,是我们自己手动来创建的,这样来说就是高耦合(每次都创建对象,麻烦)
通过 IOC,我们将依赖的对象(如 Database)从 Service 类中分离出来,由外部容器(比如 Spring 容器)来管理。这样,Service 类就可以聚焦于业务逻辑,容器负责对象的创建和注入
Spring框架提供了两种常见的依赖注入方式:
-
构造器注入: 通过构造函数注入依赖的对象。
@Component public class Service {private final Database database;@Autowiredpublic Service(Database database) {this.database = database;}public void processData() {database.save();} } -
Setter注入: 通过setter方法注入依赖的对象。
@Component public class Service {private Database database;@Autowiredpublic void setDatabase(Database database) {this.database = database;}public void processData() {database.save();} }
在开发过程中呢一般结合注解,不会手动去创建对象,太麻烦
优势
- 松耦合:减少了类之间的耦合,增加了灵活性。
- 易于测试:可以轻松模拟依赖,便于单元测试。
- 可扩展性:容器可以动态注入不同的实现类,使得程序更容易扩展。
2. AOP(面向切面编程)
概念
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在将横切关注点(cross-cutting concerns)从业务逻辑中分离出来。横切关注点指的是那些与核心业务逻辑无关,但又需要在多个地方执行的功能,如日志、性能监控、安全控制、事务管理等。
核心概念
- 切面(Aspect):表示横切关注点的模块化。它可以定义在多个类中应用的逻辑(如日志记录、事务管理等)。
- 连接点(Join Point):是程序执行的一个点,通常是方法调用。AOP可以在这些点上执行特定的动作。
- 通知(Advice):是横切逻辑的具体实现。通知可以在切入点前(before)、后(after)或方法执行抛出异常时(around)执行。
- 切入点(Pointcut):是AOP应用到哪些方法的定义。通过切入点表达式来指定切面的作用范围。
- 织入(Weaving):将切面应用到目标对象(或类)上的过程。织入可以发生在编译时、类加载时或运行时。
2.这个核心概念了解就行了,重要的是如何去应用,这时候面试官会问你,你在哪些场景会用到AOP?你是怎么用的呢?
Spring中的AOP实现
Spring AOP是基于代理的,它可以通过动态代理或CGLIB代理来实现。常见的使用场景包括:
- 事务管理:自动处理方法执行前后事务的提交与回滚。
- 日志记录:在方法调用前后自动记录日志。
- 性能监控:监控方法执行的时间。
你可以说,我之前的项目,在写日志的时候用到过。。。。自己去查怎么用的不想全写,写一个日志的吧
(1)创建要执行业务的方法
import org.springframework.stereotype.Service;@Service
public class MyService {public void processData() {System.out.println("吃饭!干饭!");}public void saveData() {System.out.println("睡觉!");}
}
(2)定义日志切面(Aspect)
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {// 记录方法调用前的日志@Before("execution(* com.example.service.MyService.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}// 记录方法调用后的日志@After("execution(* com.example.service.MyService.*(..))")public void logAfter(JoinPoint joinPoint) {System.out.println("After method: " + joinPoint.getSignature().getName());}
}
@Aspect:标记该类为一个切面类,Spring会自动识别并将它作为AOP配置的一部分。@Component:使切面类成为Spring容器的一个组件,这样Spring可以自动管理它。@Before:表示在目标方法执行之前执行logBefore方法。execution(* com.example.service.MyService.*(..))是一个切点表达式,表示我们要在MyService类中的所有方法执行前记录日志。@After:表示在目标方法执行之后执行logAfter方法。
JoinPoint 是AOP框架中的一个重要对象,表示方法执行的连接点,它可以获取方法的签名、参数等信息。
(3)配置Spring AOP
如果你使用的是Spring Boot,Spring AOP默认已启用,无需额外配置。如果是传统的Spring项目,确保在applicationContext.xml中启用AOP支持:
<!-- 启用AOP支持 -->
<aop:aspectj-autoproxy /><!-- 配置切面 -->
<bean id="loggingAspect" class="com.example.aspect.LoggingAspect" />
(4)测试。。。
在Spring中,IOC和AOP通常是一起使用的。IOC负责管理对象的创建与依赖注入,而AOP则提供了一种机制,用于在不改变业务逻辑的前提下,增加额外的功能(如日志、事务管理等)
2.SpringBoot常用注解有哪些?
@RestController(@Controller 和 @ResponseBody 的组合注解)
@RestController
public class UserController {@GetMapping("/users")public List<User> getUsers() {return userService.getAllUsers();}@PostMapping("/users")public void createUser(@RequestBody User user) {userService.createUser(user);}
}
@Autowired、. @Component / @Service / @Controller
@Value
- 用途:用于注入来自
application.properties或application.yml文件中的配置值。可以注入字符串、数字、布尔值等基本类型的数据。@Value("${server.port}") private String serverPort;
@Transactional
- 用途:声明方法或类的事务管理,确保在方法执行过程中发生的所有数据库操作要么全部成功,要么全部失败回滚。
@CrossOrigin
- 用途:用于启用跨域支持,允许其他域名的客户端访问本应用程序。通常用于 REST API 服务中。
@EnableScheduling
- 用途:用于启用 Spring 的任务调度功能,可以让 Spring Boot 应用程序支持定时任务。
@EnableScheduling
public class SchedulerConfig {@Scheduled(fixedRate = 5000)public void task() {System.out.println("This task runs every 5 seconds");}
}
3.什么情况下事务会失效?
(1)访问权限问题:private修饰方法这样会导致事务失效,spring 要求被代理方法必须是public的。
(2)方法用 final 修饰
(3)方法内部调用:有时候我们需要在某个 Service 类的某个方法中,调用另外一个事务方法
具体查看
spring 事务失效的 12 种场景_spring 截获duplicatekeyexception 不抛异常-CSDN博客
相关文章:
Java[面试题]-真实面试
1.什么是IOC和AOP?了解么? IOC(控制反转)和AOP(面向切面编程) 1. IOC(控制反转) 概念 IOC(Inversion of Control)是面向对象编程中的一个设计原则…...
HTML5新增多媒体支持
一、引言 在当今数字化时代,丰富的多媒体内容对于网页的吸引力和用户体验至关重要。HTML5 的出现为网页带来了强大的多媒体支持,尤其是在音频和视频方面,为开发者和用户带来了全新的可能性。 二、音频audio标签 2.1 定义与属性详解 <a…...
K8S群集调度二
一、污点(Taint) 和 容忍(Tolerations) 1.1、污点(Taint) 设置在node上是对pod的一种作用 节点的亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点 而Taint 则相反,它使节点能够排斥一类特…...
43.第二阶段x86游戏实战2-提取游戏里面的lua
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…...
debian系统安装qt的时候 显示xcb相关文件缺失
如果是安装之后的问题 我们可以选择使用ldd的命令查看当前依赖的so那些文件确实 ldd /home/yinsir/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so 本人在进行打包的时候 出现则会个报错 ERROR: ldd outputLine: “libxcb-util.so.1 > not found” ERROR: for binary: “/…...
得物多模态大模型在重复商品识别上的应用和架构演进
重复商品治理介绍 根据得物的平台特性,同一个商品在平台上不能出现多个链接,原因是平台需要保证一品一链的特点,以保障商品的集中竞价,所以说一个商品在整个得物平台上只能有一个商详链接,因此我们需要对一品多链的情…...
基于 SSM(Spring + Spring MVC + MyBatis)框架构建电器网上订购系统
基于 SSM(Spring Spring MVC MyBatis)框架构建电器网上订购系统可以为用户提供一个方便快捷的购物平台。以下将详细介绍该系统的开发流程,包括需求分析、技术选型、数据库设计、项目结构搭建、主要功能实现以及前端页面设计。 需求分析 …...
应用插件化及其进程关系梳理
插件应用的AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"coreApp"true"package"com.demo.phone"android:sharedUserId"android.uid.phone"><uses-sdk android:minSdkVersion&q…...
Odoo:免费开源的医药流通行业信息化解决方案
文 / 开源智造Odoo亚太金牌服务 方案概述 开源智造Odoo免费开源ERP提供面向医药批发采、供、销业财一体化,及直接面向消费者的门店终端、全渠道管理、营销管理以及GSP合规管理解决方案,提升企业运营效率和全业务链条的数字化管控、追溯能力。 行业的最新…...
系统架构设计师论文:大数据Lambda架构
论文一:大数据Lambda架构 1简要说明你参与开发的软件项目,以及你所承担的主要工作 2 lamada体系架构将数据流分为批处理层(Batch Layer)、加速层(Speed Layer)、服务层(Serving Layer)。简要叙述这三个层次的用途和特点 3 详细阐述你参与开发的软件项目是如何基于lamada…...
亚信安全新一代WAF:抵御勒索攻击的坚固防线
近年来,勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷,勒索攻击形势愈发严峻,已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今,勒索攻击手段日趋成熟、攻击目标愈发明确,模式…...
Flutter 中的那些设计模式的写法(持续更新)
前言 我们都知道设计模式是相同的,同一种设计模式的理念不会因为语言不同而会有所改变,但是由于语法的差异,设计模式的写法也有所差异,本文会介绍一些flutter中常用设计模式的写法以及使用场景。 常见的设计模式有23种࿰…...
【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
需求梳理 背景 当前我们在IDE或MySQL查询工具中只能进行个人使用,缺乏共享功能,且在查询及数据统计上有一定的不便。为了改善这种情况,计划搭建一个Web平台,通过后台交互来提升效率。此平台需要兼容Python工具和SQL工具的管理、执…...
Linux系列-进程的状态
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 操作系统就是计算机领域的哲学,是为了保证在所有情况下都适用,加载到内存叫做新建状态。 并行和并发 计算机同时进行多个任务,在用户感知的…...
SpringBoot项目中常用的一些注解
一、核心注解 SpringBootApplication 作用:标注一个主程序类,表明这是一个Spring Boot应用程序的入口。说明:这是一个复合注解,组合了Configuration、EnableAutoConfiguration和ComponentScan。 EnableAutoConfiguration 作用&…...
【网络】自定义协议——序列化和反序列化
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是序列化和分序列,并且自己能手撕网络版的计算器。 > 毒鸡汤:有些事情,总是不明白,所以我不…...
Pytorch如何精准记录函数运行时间
0. 引言 参考Pytorch官方文档对CUDA的描述,GPU的运算是异步执行的。一般来说,异步计算的效果对于调用者来说是不可见的,因为 每个设备按照排队的顺序执行操作Pytorch对于CPU和GPU的同步,GPU间的同步是自动执行的,不需…...
使用 Java 实现邮件发送功能
引言 1. JavaMail API 简介 2. 环境准备 2.1 Maven 依赖 2.2 Gradle 依赖 3. 发送简单文本邮件 4. 发送 HTML 邮件 5. 发送带附件的邮件 6. 注意事项 引言 在现代应用开发中,邮件发送功能是非常常见的需求,例如用户注册验证、密码重置、订单确认…...
html第一个网页
创建你的第一个HTML网页是一个激动人心的步骤。以下是创建一个简单网页的基本步骤和代码示例: 基础结构:所有的HTML文档都应该包含以下基本结构。 <!DOCTYPE html> <html> <head><title>我的第一个网页</title> </he…...
前后端交互接口(三)
前后端交互接口(三) 前言 前两集我们先做了前后端交互接口的约定以及浅浅的阅读了一些proto代码。那么这一集我们就来看看一些重要的proto代码,之后把protobuffer给引入我们的项目当中! gateway.proto 我们来看一眼我们的网关…...
使用Taotoken聚合端点一个月,我的API调用延迟与稳定性观察记录
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken聚合端点一个月,我的API调用延迟与稳定性观察记录 1. 项目背景与接入动机 我最近的一个个人项目需要持续…...
氨基酸表活洁面慕斯科普
一、什么是洁面慕斯洁面慕斯是一种预发泡型的洁面产品,和传统膏状、洗面奶不同,它从泵头挤出来就是细腻绵密的泡沫,不需要消费者手动打泡,使用起来更加方便快捷。从成分体系来看,洁面慕斯本质还是表面活性剂清洁产品&a…...
从样本到序列:枸杞DNA条形码鉴定的关键步骤与陷阱规避
一、引言:为何需要PCR鉴定枸杞?枸杞(Lyciumspp.)作为药食同源的重要资源,市场长期存在以土库曼枸杞、白刺等近缘种或伪品冒充高价值宁夏枸杞(L. barbarum)的现象。传统鉴别依赖果实形态和显微特…...
【DC实战】时序约束文件编写:从理论到实践
1. 时序约束文件的重要性 在数字电路设计中,时序约束文件就像是给电路设计的一本"交通规则手册"。想象一下,如果没有红绿灯和限速标志,城市交通会乱成什么样子?时序约束文件的作用就是告诉DC(Design Compile…...
ArduPilot硬件抽象层(HAL)深度解析:如何让你的飞控代码轻松跑在不同芯片上?
ArduPilot硬件抽象层(HAL)深度解析:跨平台飞控开发实战指南 当开发者尝试将ArduPilot移植到一块全新的飞控板时,最常遇到的挑战莫过于如何让同一套控制算法在不同硬件架构上无缝运行。这正是硬件抽象层(HAL)设计的精妙之处——它如同一位技艺高超的翻译官…...
Pixelle-Video全球化架构:智能AI短视频引擎的多语言解决方案
Pixelle-Video全球化架构:智能AI短视频引擎的多语言解决方案 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video Pixelle-Video作…...
远洋边缘计算实战:基于 Linux 的客滚船高并发网络 QoS 调度与隔离策略
摘要:客滚船直连卫星网络面对几百名旅客并发时存在瘫痪与越权风险。本文记录了基于 Linux 构建标准工业级边缘网关多链路 QoS 调度与隔离的实操复盘。导语:在主导一艘国际客滚船的网络重构项目时,我们面临一个典型的高并发调度与合规挑战&…...
告别显示器!用VNC Viewer远程玩转树莓派4B的完整配置指南
无显示器玩转树莓派4B:VNC远程配置全攻略 当你刚拿到树莓派4B时,第一反应可能是找显示器、键盘鼠标来配置它。但现实情况往往是:手边没有多余的显示设备,或者你希望将树莓派作为服务器长期运行,根本不需要连接显示器。…...
智绘低空新图景:黎阳之光以数智技术赋能低空经济高质量发展
在长三角一体化战略纵深推进、新质生产力加速培育的时代浪潮中,低空经济正成为驱动区域经济转型升级的重要引擎。华东师范大学大虹桥低空经济研究院的成立,为行业搭建起“理论实践技术人才”的全链条创新平台;而北京黎阳之光科技有限公司&…...
桌面Z箍缩实验:从等离子体原理到聚变中子探测的DIY实践
1. 项目概述:从“人造太阳”到桌面实验的能源狂想“如何通过聚变制造能源及如何实现”,这个标题背后,是无数工程师和科学家为之奋斗终身的终极能源梦想。它听起来宏大得像是国家实验室的专属课题,但今天我想从一个更接地气的、带有…...
