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 我们来看一眼我们的网关…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...

Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
React 样式方案与状态方案初探
React 本身只提供了基础 UI 层开发范式,其他特性的支持需要借助相关社区方案实现。本文将介绍 React 应用体系中样式方案与状态方案的主流选择,帮助开发者根据项目需求做出合适的选择。 1. React 样式方案 1.1. 内联样式 (Inline Styles) 通过 style …...
Kaggle-Predicting Optimal Fertilizers-(多分类+xgboost+同一特征值多样性)
Predicting Optimal Fertilizers 题意: 给出土壤的特性,预测出3种最佳的肥料 数据处理: 1.有数字型和类别型,类别不能随意换成数字,独热编码。cat可以直接处理category类型。 2.构造一些相关土壤特性特征 3.由于la…...