Spring 核心知识点补充

发布于:2025-05-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

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 数据访问层(自动转换持久层异常)
    @Controller MVC 控制器
    @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 应用中的复杂问题(如循环依赖),并编写可维护性高的代码。