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

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

相关文章:

  • 2024CCPC辽宁省赛 个人补题 ABCEGJL
  • 分类预测 | Matlab实现PNN概率神经网络多特征分类预测
  • AI大模型技术全景解析:核心原理与关键技术拆解
  • pyomo简介及使用指南
  • Redis 的 key 的过期策略是怎么实现的
  • docker中部署Universal Media Server (UMS)
  • 云里物里电子标签落地香港伊利沙伯医院:打造无纸化诊疗新范式
  • 定时器的两种实现方式
  • AI人工智能——Matplotlib绘制各种数据可视化图表的基础方法
  • Idea 查找引用jar包依赖来源的Maven pom坐标
  • 软考高项-各年选择错题
  • Sentieon文献解读 - 使用 Sentieon ctDNA 分析管道高精度、高效地处理 UMI 数据集
  • React--函数组件和类组件
  • 打卡31天
  • Docker的网络介绍
  • linux 查看java的安装路径
  • java并发-线程池
  • gcc还会有自己的头文件呢?
  • 【信息系统项目管理师】第13章:项目资源管理 - 38个经典题目及详解
  • 使用allure生成自动化测试报告
  • 网站不用域名需要备案吗/注册网站多少钱
  • 郑州做网站天强科技/电脑清理软件十大排名
  • 深圳网站建设服务公司/精准ip地址查询工具