当前位置: 首页 > news >正文

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框架提供了两种常见的依赖注入方式:

  1. 构造器注入: 通过构造函数注入依赖的对象。

    @Component
    public class Service {private final Database database;@Autowiredpublic Service(Database database) {this.database = database;}public void processData() {database.save();}
    }
    
  2. 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());}
}
  1. @Aspect:标记该类为一个切面类,Spring会自动识别并将它作为AOP配置的一部分。
  2. @Component:使切面类成为Spring容器的一个组件,这样Spring可以自动管理它。
  3. @Before:表示在目标方法执行之前执行logBefore方法。execution(* com.example.service.MyService.*(..))是一个切点表达式,表示我们要在MyService类中的所有方法执行前记录日志。
  4. @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.propertiesapplication.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&#xff1f;了解么&#xff1f; IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09; 1. IOC&#xff08;控制反转&#xff09; 概念 IOC&#xff08;Inversion of Control&#xff09;是面向对象编程中的一个设计原则&#xf…...

HTML5新增多媒体支持

一、引言 在当今数字化时代&#xff0c;丰富的多媒体内容对于网页的吸引力和用户体验至关重要。HTML5 的出现为网页带来了强大的多媒体支持&#xff0c;尤其是在音频和视频方面&#xff0c;为开发者和用户带来了全新的可能性。 二、音频audio标签 2.1 定义与属性详解 <a…...

K8S群集调度二

一、污点(Taint) 和 容忍(Tolerations) 1.1、污点(Taint) 设置在node上是对pod的一种作用 节点的亲和性&#xff0c;是Pod的一种属性&#xff08;偏好或硬性要求&#xff09;&#xff0c;它使Pod被吸引到一类特定的节点 而Taint 则相反&#xff0c;它使节点能够排斥一类特…...

43.第二阶段x86游戏实战2-提取游戏里面的lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…...

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: “/…...

得物多模态大模型在重复商品识别上的应用和架构演进

重复商品治理介绍 根据得物的平台特性&#xff0c;同一个商品在平台上不能出现多个链接&#xff0c;原因是平台需要保证一品一链的特点&#xff0c;以保障商品的集中竞价&#xff0c;所以说一个商品在整个得物平台上只能有一个商详链接&#xff0c;因此我们需要对一品多链的情…...

基于 SSM(Spring + Spring MVC + MyBatis)框架构建电器网上订购系统

基于 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架构建电器网上订购系统可以为用户提供一个方便快捷的购物平台。以下将详细介绍该系统的开发流程&#xff0c;包括需求分析、技术选型、数据库设计、项目结构搭建、主要功能实现以及前端页面设计。 需求分析 …...

应用插件化及其进程关系梳理

插件应用的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提供面向医药批发采、供、销业财一体化&#xff0c;及直接面向消费者的门店终端、全渠道管理、营销管理以及GSP合规管理解决方案&#xff0c;提升企业运营效率和全业务链条的数字化管控、追溯能力。 行业的最新…...

系统架构设计师论文:大数据Lambda架构

论文一:大数据Lambda架构 1简要说明你参与开发的软件项目,以及你所承担的主要工作 2 lamada体系架构将数据流分为批处理层(Batch Layer)、加速层(Speed Layer)、服务层(Serving Layer)。简要叙述这三个层次的用途和特点 3 详细阐述你参与开发的软件项目是如何基于lamada…...

亚信安全新一代WAF:抵御勒索攻击的坚固防线

近年来&#xff0c;勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷&#xff0c;勒索攻击形势愈发严峻&#xff0c;已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今&#xff0c;勒索攻击手段日趋成熟、攻击目标愈发明确&#xff0c;模式…...

Flutter 中的那些设计模式的写法(持续更新)

前言 我们都知道设计模式是相同的&#xff0c;同一种设计模式的理念不会因为语言不同而会有所改变&#xff0c;但是由于语法的差异&#xff0c;设计模式的写法也有所差异&#xff0c;本文会介绍一些flutter中常用设计模式的写法以及使用场景。 常见的设计模式有23种&#xff0…...

【提效工具开发】Python功能模块执行和 SQL 执行 需求整理

需求梳理 背景 当前我们在IDE或MySQL查询工具中只能进行个人使用&#xff0c;缺乏共享功能&#xff0c;且在查询及数据统计上有一定的不便。为了改善这种情况&#xff0c;计划搭建一个Web平台&#xff0c;通过后台交互来提升效率。此平台需要兼容Python工具和SQL工具的管理、执…...

Linux系列-进程的状态

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 操作系统就是计算机领域的哲学&#xff0c;是为了保证在所有情况下都适用&#xff0c;加载到内存叫做新建状态。 并行和并发 计算机同时进行多个任务&#xff0c;在用户感知的…...

SpringBoot项目中常用的一些注解

一、核心注解 SpringBootApplication 作用&#xff1a;标注一个主程序类&#xff0c;表明这是一个Spring Boot应用程序的入口。说明&#xff1a;这是一个复合注解&#xff0c;组合了Configuration、EnableAutoConfiguration和ComponentScan。 EnableAutoConfiguration 作用&…...

【网络】自定义协议——序列化和反序列化

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是序列化和分序列&#xff0c;并且自己能手撕网络版的计算器。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…...

Pytorch如何精准记录函数运行时间

0. 引言 参考Pytorch官方文档对CUDA的描述&#xff0c;GPU的运算是异步执行的。一般来说&#xff0c;异步计算的效果对于调用者来说是不可见的&#xff0c;因为 每个设备按照排队的顺序执行操作Pytorch对于CPU和GPU的同步&#xff0c;GPU间的同步是自动执行的&#xff0c;不需…...

使用 Java 实现邮件发送功能

引言 1. JavaMail API 简介 2. 环境准备 2.1 Maven 依赖 2.2 Gradle 依赖 3. 发送简单文本邮件 4. 发送 HTML 邮件 5. 发送带附件的邮件 6. 注意事项 引言 在现代应用开发中&#xff0c;邮件发送功能是非常常见的需求&#xff0c;例如用户注册验证、密码重置、订单确认…...

html第一个网页

创建你的第一个HTML网页是一个激动人心的步骤。以下是创建一个简单网页的基本步骤和代码示例&#xff1a; 基础结构&#xff1a;所有的HTML文档都应该包含以下基本结构。 <!DOCTYPE html> <html> <head><title>我的第一个网页</title> </he…...

前后端交互接口(三)

前后端交互接口&#xff08;三&#xff09; 前言 前两集我们先做了前后端交互接口的约定以及浅浅的阅读了一些proto代码。那么这一集我们就来看看一些重要的proto代码&#xff0c;之后把protobuffer给引入我们的项目当中&#xff01; gateway.proto 我们来看一眼我们的网关…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...