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

spring的注入方式都有什么区别

目录

1. 构造器注入(Constructor Injection)

2. Setter 注入(Setter Injection)

3. 字段注入(Field Injection)

4. 接口注入(Interface Injection)

主要区别对比

最佳实践

总结

1. 构造器注入(Constructor Injection)

  • 方式:通过构造方法完成依赖注入。
  • 配置
    • XML:使用 <constructor-arg> 标签。
    • Java 注解:使用 @Autowired 或隐式构造器(Spring 4.3+)。
  • 示例

    java

    @RequiredArgsConstructor
    public class UserService {private final UserRepository userRepository;// 构造器注入(Spring 4.3+ 可省略 @Autowired)/*@Autowiredpublic UserService(UserRepository userRepository) {this.userRepository = userRepository;}*/
    }
    
  • 特点
    • 不可变依赖:依赖对象在创建后不可变(final 字段)。
    • 强制依赖:对象创建时必须提供所有依赖,避免空指针异常。
    • 防止循环依赖:Spring 会在启动时检测并报错。
  • 适用场景
    • 强制依赖的场景(如核心业务组件)。
    • 不可变对象(如使用 final 字段)。

2. Setter 注入(Setter Injection)

  • 方式:通过公共的 Setter 方法完成依赖注入。
  • 配置
    • XML:使用 <property> 标签。
    • Java 注解:使用 @Autowired 或 @Inject
  • 示例

    java

    public class UserService {private UserRepository userRepository;// Setter 注入@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
    }
    
  • 特点
    • 可选依赖:依赖可以在对象创建后通过 Setter 方法设置。
    • 灵活性高:适合动态修改依赖(如配置参数)。
    • 可能存在空指针风险:需确保使用前依赖已注入。
  • 适用场景
    • 可选依赖的场景(如配置参数)。
    • 需要动态修改依赖的场景。

3. 字段注入(Field Injection)

  • 方式:通过反射直接注入私有字段。
  • 配置:使用 @Autowired@Resource 或 @Inject 注解。
  • 示例

    java

    public class UserService {@Autowiredprivate UserRepository userRepository;
    }
    
  • 特点
    • 代码简洁:无需构造器或 Setter 方法。
    • 依赖隐藏:依赖关系不明确(如无法从构造器看出)。
    • 仅适用于 Spring 容器:不利于单元测试(需使用反射注入)。
  • 适用场景
    • 简单组件(如工具类、控制器)。
    • 快速开发或遗留代码。

4. 接口注入(Interface Injection)

  • 方式:通过实现特定接口来声明依赖。
  • 特点
    • 侵入性强:组件需实现 Spring 特定接口(如 ApplicationContextAware)。
    • 已过时:现代 Spring 项目很少使用。
  • 示例

    java

    public class MyComponent implements ApplicationContextAware {private ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext context) {this.context = context;}
    }
    

主要区别对比

特性构造器注入Setter 注入字段注入
依赖强制性强制(必须提供)可选(可后设置)强制(运行时注入)
不可变性支持(final 字段)不支持不支持
循环依赖检测启动时检测运行时可能出错运行时可能出错
单元测试难度低(可手动创建)中(需调用 Setter)高(需反射或 Mock)
依赖可见性明确(构造器参数)较明确(Setter 方法)隐藏(字段注解)
适用场景核心组件、不可变依赖可选依赖、动态配置简单组件、快速开发

最佳实践

  1. 优先使用构造器注入

    • 确保依赖不可变且强制注入。
    • 符合单一职责原则和依赖倒置原则。
  2. 使用 Setter 注入处理可选依赖

    • 例如配置参数、可替换的组件。
  3. 谨慎使用字段注入

    • 仅在无法使用构造器或 Setter 时(如框架限制)使用。
    • 避免在需要测试的组件中使用。
  4. 避免接口注入

    • 耦合度高,不符合现代开发实践。

总结

构造器注入和 Setter 注入是最常用的方式,选择时需根据依赖的性质(强制 / 可选、可变 / 不可变)和组件的设计目标来决定。字段注入虽然简洁,但存在测试困难和依赖隐藏的问题,应谨慎使用。

http://www.xdnf.cn/news/7815.html

相关文章:

  • 网页表格转换为markdown
  • 仅修改文件名会导致文件的MD5值发生变化吗?
  • 制造业ERP系统选型与实施避坑探讨
  • java加强 -网络编程
  • iframe加载或者切换时候,短暂的白屏频闪问题解决
  • Oracle Enqueue Names
  • MySQL中的重要常见知识点(入门到入土!)
  • QT中信号和事件的区别
  • Panasonic松下焊接机器人节气
  • Web3 领域中的一些专业术语
  • Nginx负载均衡配置详解
  • 14、自动配置【源码分析】-初始加载自动配置类
  • 双活数据中心解决方案
  • KubeVirt虚拟机热迁移
  • 第六章 Freertos智能小车循迹模块
  • 【Oracle 专栏】清理用户及表空间
  • STM32 I2C硬件读写
  • MLXJAX框架学习
  • 时源TS4RPSA2-3-3导电硅胶
  • 【已解决】docker search --limit 1 centos Error response from daemon
  • React中使用 Ant Design Charts 图表
  • 31-35【动手学深度学习】深度学习硬件
  • Spark Core 源码关键环节的深度解析
  • [Vue]跨组件传值
  • PCB 横截面几何形状
  • 几种超声波芯片的特点和对比
  • 【东枫科技】usrp rfnoc 开发环境搭建
  • 学习python day4
  • 101个α因子#11
  • 基于python的机器学习(八)—— 评估算法(一)