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

Spring 核心知识点补充

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.lryc.cn/news/2392196.html

相关文章:

  • 两阶段法目标检测发展脉络
  • Flannel 支持的后端
  • 小白的进阶之路系列之六----人工智能从初步到精通pytorch数据集与数据加载器
  • SQL进阶之旅 Day 5: 常用函数与表达式
  • NestJS——重构日志、数据库、配置
  • c++数据结构8——二叉树的性质
  • Window Server 2019--08 网络负载均衡与Web Farm
  • arcgis字段计算器中计算矢量面的每个点坐标
  • SpringBoot:统一功能处理、拦截器、适配器模式
  • AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!
  • GitLab CI流水线权限隔离
  • xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行
  • Onvif协议:IPC客户端开发-IPC相机控制(c语言版)
  • 如何最简单、通俗地理解Pytorch?神经网络中的“梯度”是怎么自动求出来的?PyTorch的动态计算图是如何实现即时执行的?
  • QT+opecv如何更改图片的拍摄路径
  • WebSocket学习总结
  • 秋招Day11 - JVM - 类加载机制
  • Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)
  • PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
  • Vert.x学习笔记-什么是Handler
  • 浏览器游戏的次世代革命:WebAssembly 3.0 实战指南
  • Java设计模式之工厂模式与策略模式简单案例学习
  • 【Echarts】象形图
  • git 本地合并怎么撤回
  • 集星云推短视频矩阵系统的定制化与私有化部署方案
  • npm run build 报错:Some chunks are larger than 500 KB after minification
  • XCTF-web-file_include
  • 5.28 后端面经
  • CPP中CAS std::chrono 信号量与Any类的手动实现
  • PHP生成pdf方法