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 我们来看一眼我们的网关…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...