Spring 核心知识点补充

news2025/6/1 6:48:45

Spring 核心知识点补充

1. IoC(控制反转)
  • 核心思想:将对象的创建和依赖管理交给容器,而非在代码中直接控制
  • 实现方式
    • XML 配置:<bean> 标签定义对象
    • 注解:@Component, @Service, @Repository, @Controller
    • Java 配置:@Configuration + @Bean
  • 容器ApplicationContext 接口(如 ClassPathXmlApplicationContext, AnnotationConfigApplicationContext
2. AOP(面向切面编程)
  • 核心概念
    • 切面(Aspect):横切关注点的模块化(如日志、事务)
    • 连接点(Joinpoint):方法执行点
    • 通知(Advice)
      • @Before:前置通知
      • @After:后置通知
      • @Around:环绕通知
      • @AfterThrowing:异常通知
      • @AfterReturning:返回通知
    • 切点(Pointcut):定义哪些连接点应用通知(如 @Pointcut("execution(* com.service.*.*(..))"
  • 实现原理:动态代理(JDK 动态代理/CGLIB)
3. 标记注解
  • 核心注解

    注解作用
    @Component通用组件标记
    @Service业务逻辑层
    @Repository数据访问层(自动转换持久层异常)
    @ControllerMVC 控制器
    @Configuration声明配置类
    @Bean定义单例 Bean(在配置类中使用)
    @Scope设置作用域(如 prototype, singleton
    @Lazy延迟初始化
    @Primary优先注入的 Bean
4. 依赖注入(DI)
  • 注入方式

    • 构造器注入(推荐):

      @Autowired
      public UserService(UserRepository repo) {
          this.repo = repo;
      }
      
    • Setter 注入

      @Autowired
      public void setRepo(UserRepository repo) {
          this.repo = repo;
      }
      
    • 字段注入(不推荐):

      @Autowired
      private UserRepository repo;
      
  • 其他注解

    • @Qualifier:解决多个同类型 Bean 冲突
    • @Value:注入属性值(如 @Value("${db.url}")
5. 构造方法注入
  • Spring 4.3+ 优化:单构造方法可省略 @Autowired
  • 循环依赖解决方案:通过构造器注入无法解决循环依赖(需用 Setter/字段注入)
6. 三级缓存与循环依赖
  • 缓存级别
    1. 一级缓存singletonObjects(完整 Bean)
    2. 二级缓存earlySingletonObjects(半成品 Bean)
    3. 三级缓存singletonFactories(Bean 工厂)
  • 循环依赖解决流程(以 A→B→A 为例):
    1. 创建 A 实例 → 放入三级缓存
    2. A 注入 B → 创建 B 实例 → 放入三级缓存
    3. B 注入 A → 从三级缓存获取 A 的工厂 → 生成 A 代理对象 → 放入二级缓存
    4. B 初始化完成 → 移入一级缓存
    5. A 完成初始化 → 移入一级缓存
  • 关键点
    • 只适用于 单例作用域singleton
    • 构造器注入无法解决循环依赖
    • 原型作用域(prototype)不支持循环依赖
7. 易遗漏的核心知识点
  • Bean 生命周期

    1. 实例化 → 2. 属性填充 → 3. BeanNameAware → 4. BeanFactoryAware
    2. ApplicationContextAware → 6. 前置处理器 → 7. @PostConstruct
    3. InitializingBean → 9. 自定义 init-method → 10. 后置处理器
    4. 使用 → 12. @PreDestroy → 13. DisposableBean → 14. 自定义 destroy-method
  • 事务管理

    • 注解 @Transactional
    • 传播行为(Propagation.REQUIRED
    • 隔离级别(Isolation.READ_COMMITTED
  • 设计模式应用

    • 工厂模式(BeanFactory
    • 代理模式(AOP)
    • 模板方法(JdbcTemplate
    • 观察者模式(ApplicationEvent 事件机制)
  • 扩展机制

    • BeanPostProcessor:干预 Bean 初始化过程
    • BeanFactoryPostProcessor:修改 Bean 定义(如 PropertySourcesPlaceholderConfigurer
    • ImportSelector:动态加载配置类
  • Spring Boot 关联

    • 自动配置原理:@EnableAutoConfigurationMETA-INF/spring.factories
    • 条件注解:@ConditionalOnClass, @ConditionalOnProperty
8. 最佳实践建议
  1. 避免循环依赖:重构代码(提取公共逻辑到新类)
  2. 优先使用构造器注入:保证依赖不可变,避免 NPE
  3. 谨慎使用 @Autowired:明确依赖关系,推荐 final + 构造器
  4. AOP 切面粒度:避免过度拦截,影响性能

示例:构造器注入解决循环依赖

@Service
public class ServiceA {
 private final ServiceB serviceB;
 public ServiceA(ServiceB serviceB) {
     this.serviceB = serviceB;  // Spring 通过三级缓存解决依赖
 }
}

@Service
public class ServiceB {
 private final ServiceA serviceA;
 public ServiceB(ServiceA serviceA) {
     this.serviceA = serviceA;
 }
}

通过理解这些核心机制,能更高效地解决 Spring 应用中的复杂问题(如循环依赖),并编写可维护性高的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两阶段法目标检测发展脉络

模式识别期末展示大作业&#xff0c;做个记录&#xff0c;希望大家喜欢。 R-CNN Fast R-CNN R-FCN 整个过程可以分解为以下几个步骤&#xff1a; 输入图像 (image) 和初步特征提取 (conv, feature maps)&#xff1a; 首先&#xff0c;输入一张原始图像&#xff0c;经过一系列…

小白的进阶之路系列之六----人工智能从初步到精通pytorch数据集与数据加载器

本文将介绍以下内容: 数据集与数据加载器 数据迁移 如何建立神经网络 数据集与数据加载器 处理数据样本的代码可能会变得混乱且难以维护;理想情况下,我们希望我们的数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyTorch提供了两个数据原语:torch.utils…

NestJS——重构日志、数据库、配置

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

c++数据结构8——二叉树的性质

一、二叉树的基本性质 示图1&#xff1a; 性质1&#xff1a;层节点数上限 在一棵二叉树中&#xff0c;第i层至多有2^{i-1}个节点&#xff08;首层是第1层&#xff09; 这个性质可以通过数学归纳法证明&#xff1a; 第1层&#xff1a;2^{1-1}2^01个节点&#xff08;根节点&am…

Window Server 2019--08 网络负载均衡与Web Farm

本章要点 1、了解网络负载均衡技术 2、掌握Web Farm核心原理 3、掌握如何使用Windows NLB搭建Web Farm环境 网络负载均衡技术将外部计算机发送的连接请求均匀的分配到服务器集群中的每台服务器上&#xff0c;接受到请求的服务器独立地响应客户的请求。 网络负载均衡技术还…

SpringBoot:统一功能处理、拦截器、适配器模式

文章目录 拦截器什么是拦截器&#xff1f;为什么要使用拦截器&#xff1f;拦截器的使用拦截路径执行流程典型应用场景DispatcherServlet源码分析 适配器模式适配器模式定义适配器模式角色适配器模式的实现适配器模式应用场景 统⼀数据返回格式优点 统一处理异常总结 拦截器 什…

AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!

在人工智能技术持续深入行业应用的背景下&#xff0c;越来越多的企业和个人寻求通过自动化技术来提高效率和减少重复性劳动&#xff0c;AI Agent的崛起已经成为了不可忽视的趋势。AI Agent&#xff0c;即人工智能代理&#xff0c;是一种基于先进的人工智能技术&#xff0c;特别…

Onvif协议:IPC客户端开发-IPC相机控制(c语言版)

前言&#xff1a; 本博文主要是借鉴OceanStar大神的博文&#xff0c;在他的博文的基础之上做了一部分修改与简化。 博文链接&#xff1a; Onvif协议&#xff1a;IPC客户端开发之鉴权_onvif鉴权方式-CSDN博客 Onvif协议&#xff1a;IPC客户端开发之PTZ控制_onvif ptz-CSDN博客…

如何最简单、通俗地理解Pytorch?神经网络中的“梯度”是怎么自动求出来的?PyTorch的动态计算图是如何实现即时执行的?

PyTorch是一门科学——现代深度学习工程中的一把锋利利器。它的简洁、优雅、强大,正在让越来越多的AI研究者、开发者深度应用。 1. PyTorch到底是什么?为什么它重要? PyTorch是一个开源的深度学习框架,由Facebook AI Research(FAIR)于2016年发布,它的名字由两个部分组成…

QT+opecv如何更改图片的拍摄路径

如何更改相机拍摄图片的路径 前言&#xff1a;基础夯实&#xff1a;效果展示&#xff1a;实现功能&#xff1a;遇到问题&#xff1a;未解决&#xff1a; 核心代码&#xff1a; 前言&#xff1a; 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题&#xff0c;用户可自己选…

秋招Day11 - JVM - 类加载机制

了解类的加载机制吗&#xff1f; JVM是运行Java字节码&#xff0c;也就是运行.class文件的虚拟机&#xff0c;JVM把.class文件中描述类的数据结构加载到内存中&#xff0c;并对数据进行校验&#xff0c;解析和初始化&#xff0c;最终转化为JVM可以使用的类型&#xff08;Klass…

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

目录 一、源码分析 1.分析闭合 2.分析输出 &#xff08;1&#xff09;查询成功 &#xff08;2&#xff09;查询失败 &#xff08;3&#xff09;SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 &#xff08;1&#xff09;盲注分析 &#xff08;2&#xf…

Vert.x学习笔记-什么是Handler

Vert.x学习笔记 在Vert.x中&#xff0c;Handler是一个核心概念&#xff0c;用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一&#xff0c;通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口&#xff0c;定义如下&#…

【Echarts】象形图

目录 效果代码 效果 代码 <!-- 业务类型 --> <template><div class"ywlx" :style"{ --height: height }"><div class"header_count count_linear_bg"><div>当月业务总量<span class"common_count text_s…

集星云推短视频矩阵系统的定制化与私有化部署方案

在当今数字化营销时代&#xff0c;短视频矩阵系统成为众多企业和机构拓展影响力、实现精准营销的关键工具。集星云推短视频矩阵系统凭借其强大的功能和灵活的定制性&#xff0c;为企业提供了全方位的解决方案。 一、API接口定制&#xff1a;无缝对接自有系统 集星云推短视频矩…

XCTF-web-file_include

解析 <?php highlight_file(__FILE__); // 高亮显示当前PHP文件源代码 include("./check.php"); // 包含检查文件&#xff08;可能包含安全过滤逻辑&#xff09;if(isset($_GET[filename])) { // 检查是否传入filename参数$filename $_GET[f…

5.28 后端面经

为什么golang在并发环境下更有优势 Go语言&#xff08;Golang&#xff09;在并发环境下的优势主要源自其设计哲学和内置的并发机制&#xff0c;这些机制在语言层面提供了高效、简洁且安全的并发编程工具。以下是其核心优势的详细分析&#xff1a; 1. Goroutine&#xff1a;轻量…

CPP中CAS std::chrono 信号量与Any类的手动实现

前言 CAS&#xff08;Compare and Swap&#xff09; 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数&#xff1a;内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时&#xff0c;CAS才会将内存位…

PHP生成pdf方法

1&#xff1a;第一种方法&#xff1a; 主要使用PHP的扩展 【 “spatie/browsershot”: “3.57”】 使用这个扩展生成PDF需要环境安装以下依赖 1.1&#xff1a;NPM【版本&#xff1a;9.2.0】 1.2&#xff1a;NODE【版本&#xff1a;v18.19.1】 1.3&#xff1a;puppeteer【npm in…

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)

写在前面的话&#xff0c;为了保持Sceneform-EQR始终是采用最新的filament&#xff0c;每隔一段时间我都会编译filament&#xff0c;并根据新增内容完善Sceneform-EQR。 现由于更换电脑&#xff0c;环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…