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

spring相关

1.spring

Spring是一个开源的轻量级控制反转面向切面编程的容器框架。
轻量级是说它开发使用简单,功能强大
控制反转是指将对象的创建,销毁控制交给 ioc容器,方便解耦合,降低维护难度
面向切面编程是指将相同的逻辑横向抽取出来,可以对一些通用业务如事务,日志进行集中管理

1.spring的bean,懒加载和非懒加载区别

懒加载:需要使用对象的时候才创建,节省资源
非懒加载:也叫迫切加载,容器启动时就创建对象,消耗资源
spring中默认时迫切加载,即在项目启动时,spring会扫描符合条件的所有bean并将其初始化
如果需要懒加载,可以使用@Lazy注释或者xml中配置属性default-lazy-init=“true”

2.spring的依赖注入

1.setter 方式注入,通过反射调用无参构造方法生成对象,再通过对于的setter方法注入配置,支持注解和 xml两种实现方式

2.构造器方式注入,通过反射调用有参构造方法生成对象,支持注解和 xml两种实现方式

注解实现方式:@Autowired,它是默认按类型匹配的、@Resource,它是默认按名字匹配的

3.spring中 单例(默认单例)和多例的区别

如果一个bean是单例模式的,在处理多次请求的时候,在ioc容器中只实例化一个bean,这个对象会被保存在一个 ConcurrentHashMap中,当有请求来的时候,会先从map中查看,如果有就直接使用这个对象,没有才会实例化新的对象。
如果是多例模式的bean,每次请求来的时候,会直接实例化新的bean,没有map缓存的过程。
注:单例模式中,对象的生命周期是ioc容器来管理,但是多例模式是不管的,要么我们自己管理,要么等对象没有引用了,垃圾回收机制来销毁。

4.spring 的 事务机制

1.什么是事务:

事务是一组不可分割的操作序列,这些操作要么全部成功执行,要么全部失败回滚,以此来保证数据的一致性和完整性。

2.事务传播机制

当一个事务方法调用另一个事务方法时,Spring 如何管理这些事务的开启、挂起、合并等操作。

1.PROPAGATION_REQUIRED 默认

当一个事务方法调用另一个使用PROPAGATION_REQUIRED的事务方法时,如果调用者已经开启了事务,被调用方法就加入这个事务;如果调用者没有事务,被调用方法就开启新事务。
2.PROPAGATION_SUPPORTS
当一个事务方法调用另一个使用PROPAGATION_SUPPORTS的事务方法时,如果当前存在事务,被调用方法就加入该事务;如果没有事务,就以非事务方式执行。
3.PROPAGATION_MANDATORY
当一个事务方法调用另一个使用PROPAGATION_MANDATORY的事务方法时,如果当前存在事务,被调用方法就加入该事务;如果没有事务,就抛异常。
4.PROPAGATION_REQUIRES_NEW
当一个事务方法调用另一个使用PROPAGATION_REQUIRES_NEW的事务方法时,不管当前是否有事务,被调用方法都会创建新事务。如果当前有事务,会先挂起当前事务,等新事务执行完,再继续执行原来的事务。
5.PROPAGATION_NOT_SUPPORTED
当一个事务方法调用另一个使用PROPAGATION_NOT_SUPPORTED的事务方法时,以非事务方式执行,如果当前有事务,会挂起当前事务。
6.PROPAGATION_NEVER
当一个事务方法调用另一个使用PROPAGATION_NEVER的事务方法时,以非事务方式执行,如果当前存在事务,就会抛出异常。
7.PROPAGATION_NESTED
当一个事务方法调用另一个使用PROPAGATION_NESTED的事务方法时,如果当前存在事务,就在嵌套事务中执行;如果没有事务,就创建新事务。嵌套事务有自己的保存点,可以独立回滚。

通俗理解:你在餐厅吃饭,如果有朋友在一个大包间里聚餐,你就在这个大包间里再隔出一个小包间自己聚餐(嵌套事务);要是没有朋友在聚餐,你就自己开个包间聚餐(创建新事务)。小包间出问题了(嵌套事务回滚),不影响大包间里其他人吃饭(外部事务可以选择是否继续)。

5.事务失效的场景

1.数据库本身不支持事务:例如 MySQL 的 InnoDB 存储引擎支持事务,而 MyISAM 不支持。

2.在 Spring 中,只有public方法上的事务注解才会生效。因为 Spring AOP 是通过代理模式实现事务管理的,代理机制对非public方法的支持存在限制。

3.当一个类的内部方法调用另一个有事务注解的方法时,事务会失效。这是因为 Spring AOP 是基于代理模式实现的,内部调用不会经过代理对象,从而无法触发事务拦截器:

@Service public class UserService { public void outerMethod() { // 内部调用,事务失效 this.innerMethod(); } @Transactional public void innerMethod() { // 数据库操作 } } // 事务失效

4.@Transactional注解默认只对RuntimeException及其子类和Error进行回滚。如果抛出的异常不是这些类型,事务将不会回滚。

但是可以自己定义即可:

@Transactional(rollbackFor = Exception.class) public void updateProduct() throws Exception { // 数据库操作 } // 这会儿就能识别到该异常

5.事务传播行为配置错误 (PROPAGATION_SUPPORTS)。

6.异常事件被自己try catch掉了。

7.如果数据源配置不正确,如数据库连接信息错误、数据源未正确注入等,会导致事务管理无法正常工作。

6.aop用到的设计模式

体现为拦截器执行链(执行链模式)

客户端调用 → 代理对象 → 拦截器链执行 ↓ [Before Advice 1] → [Before Advice 2] → [Around Advice] ↓ 目标方法执行(Method Invocation) ↓ [After Returning Advice] → [After Advice] → [After Throwing Advice]

  • @BeforeAspectJMethodBeforeAdvice
  • @AfterReturningAspectJAfterReturningAdvice
  • @AroundAspectJAroundAdvice

2. spring boot

Springboot是一个基于spring的框架,对spring做了大量简化,使开发流程更快,更高效,
大量简化maven依赖,管理了大量的基础依赖
基于注解配置(JavaConfig),无需xml配置(xml配置是真的难受)
内嵌Tomcat(没记错是某个依赖提供的),部署流程简单
打包和部署更加灵活,允许独立运行(微服不就是一个个的boot项目嘛)

1.spring-boot-starter-web

该依赖构建了web项目的基本环境,集成了日志,tomcat,springmvcjson支持等

2.BeanFactory 和 ApplicationContext

// 类层次结构(简化) BeanFactory (基础容器) ↑ ListableBeanFactory ↑ HierarchicalBeanFactory ↑ ApplicationContext (高级容器) ↑ ConfigurableApplicationContext ↑ AbstractApplicationContext ↑ ClassPathXmlApplicationContext // 具体实现 FileSystemXmlApplicationContext AnnotationConfigApplicationContext WebApplicationContext

  1. ApplicationContext 是 BeanFactory 的超集,提供更多企业级功能
  2. 延迟加载 vs 迫切加载是最显著的区别,影响启动时间和内存使用
  3. ApplicationContext 通过启动时检测配置错误发现问题
  4. Spring Boot 默认使用 ApplicationContext并进行了优化
  5. 现代应用通常使用 ApplicationContext,除非有特殊资源限制
http://www.jsqmd.com/news/497056/

相关文章:

  • SiameseUIE中文-base实操进阶:自定义Schema支持正则约束与枚举值
  • 如何快速构建实时AI服务:Ludwig与FastAPI集成指南
  • 液相色谱检测服务机构优选盘点 专业第三方检测选择参考 - 时事观察官
  • 想找好的牛肉供应厂家?2026年这些评价不错的别错过,鲜牛肉/牛肉/白牦牛肉/白牦牛/天祝白牦牛肉,牛肉供应厂家哪家好 - 品牌推荐师
  • 算法知识-双指针
  • 基于SAM2的眼动数据跟踪3——python转exe
  • 比迪丽角色生成实战案例:从‘a beautiful girl’到龙珠经典造型复刻
  • 如何将genact假活动生成器集成到自动化脚本:完整指南
  • FireRed-OCR Studio入门指南:OCR结果置信度阈值设定与人工复核策略
  • 嵌入式C开发三大核心架构:从能运行到高可用的实战指南
  • Android开发的定心丸-Android从底层到上层开发技巧经验汇总_上卷_助您不走弯路_快速前行!
  • 比迪丽AI绘画教程:如何用Inpainting修复生成中的局部瑕疵
  • Qwen3-ASR-0.6B内容审核应用:敏感词实时检测与高亮标记
  • FireRed-OCR Studio开源镜像部署:GPU显存优化与量化配置详解
  • OpenClaw官方下载替代:nanobot开源镜像+Qwen3-4B全栈部署教程(含日志排查)
  • 通义千问1.5-1.8B-GPTQ-Int4效果展示:中文逻辑推理、多轮对话与代码生成真实案例
  • Qwen2.5-7B-Instruct法律应用:合同审查要点+修改建议+法条引用
  • IndexTTS-2-LLM真实项目案例:电子书语音转换系统教程
  • Qwen3-Reranker-0.6B应用解析:如何用rerank结果指导LLM生成更精准答案
  • SSTI 刷题记录
  • LiuJuan Z-ImageGPU算力方案:单卡4090支撑多任务并发生成实测
  • 浦语灵笔2.5-7B金融场景:K线图+新闻截图→行情解读→投资建议初稿
  • lite-avatar形象库惊艳案例:客服数字人7×24小时处理300+并发咨询无卡顿
  • Qwen2-VL-2B-Instruct实操手册:Streamlit界面调试信息与Device维度解析
  • [特殊字符] VSCode Copilot 里的大模型,到底是不是“真的”?一篇讲透它背后的控制权
  • DeOldify上色服务灾备方案:模型文件异地备份+服务配置Git版本管理
  • 实时口罩检测-通用模型标注规范说明:COCO格式转换实操
  • YOLO X Layout实战教程:结合PaddleOCR构建端到端文档理解Pipeline
  • AIGlasses_for_navigation代码实例:curl调用/api/config接口完成API Key动态更新
  • RabbitMQ交换机类型全解析:direct/fanout/topic/headers应用场景与代码实现