网站开发与开发,推广软件工具,动漫网站建设意义,衡阳seo优化服务1.什么是IOC和AOP#xff1f;了解么#xff1f;
IOC#xff08;控制反转#xff09;和AOP#xff08;面向切面编程#xff09;
1. IOC#xff08;控制反转#xff09;
概念 IOC#xff08;Inversion of Control#xff09;是面向对象编程中的一个设计原则#xf…1.什么是IOC和AOP了解么
IOC控制反转和AOP面向切面编程
1. IOC控制反转
概念 IOCInversion 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面向切面编程 概念 AOPAspect-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 BootSpring AOP默认已启用无需额外配置。如果是传统的Spring项目确保在applicationContext.xml中启用AOP支持
!-- 启用AOP支持 --
aop:aspectj-autoproxy /!-- 配置切面 --
bean idloggingAspect classcom.example.aspect.LoggingAspect /4测试。。。
在Spring中IOC和AOP通常是一起使用的。IOC负责管理对象的创建与依赖注入而AOP则提供了一种机制用于在不改变业务逻辑的前提下增加额外的功能如日志、事务管理等 2.SpringBoot常用注解有哪些
RestControllerController 和 ResponseBody 的组合注解
RestController
public class UserController {GetMapping(/users)public ListUser 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博客