Spring依赖注入方式(Dependency Injection)

 更新时间:2024年10月24日 14:44:40   作者:知楠行易  
在实际开发中,推荐使用构造器注入而非字段注入,原因包括官方推荐、代码简洁、安全性高和易于测试,构造器注入通过在对象创建时注入所有必需的依赖,避免运行时忘记注入的问题,且利用Lombok的@RequiredArgsConstructor可自动生成构造函数

Spring依赖注入(Dependency Injection)

先说结论

  • 实际开发时尽量选择 构造器注入 而不是 字段注入。
  • 设值注入 和 方法注入 适用的场景较少,较特殊。

原因

  • 官方推荐使用!
  • 代码更简洁:配合 Lombok 的 @RequiredArgsConstructor,可以自动生成包含所有 final 字段的构造函数。
  • 更安全:构造器注入确保所有必需的依赖在对象创建时就已经注入,避免了在运行时忘记注入某个依赖导致 NullPointerException 的问题。
  • 更易于测试:使用构造器注入时,可以直接通过构造器传递依赖进行单元测试,而不需要模拟框架的注入机制。

至于 @Resource它是 Java 的 javax.annotation.Resource 注解,个人建议在Spring项目中就不要用了。

两者区别如下:

@Autowired

  • Spring 提供的注解:@Autowired 是 Spring 容器提供的注解,专门用于依赖注入。
  • 默认按类型注入:@Autowired 默认按照类型(type)进行注入。
  • 可指定按名称注入:可以通过 @Qualifier 注解指定按名称注入。

@Resource

  • J2EE 标准注解:@Resource 是 J2EE 标准的一部分,通常用于 EJB 和其他 J2EE 资源的注入。
  • 默认按名称注入:@Resource 默认按照名称(name)进行注入,如果找不到匹配的名称,则按类型(type)注入。
  • 不需要 @Qualifier:@Resource 可以通过 name 属性指定名称,而不需要额外的 @Qualifier 注解。

一、构造器注入(Constructor Injection)

构造器注入通过类的构造方法来传递依赖。

举个例子:

@RestController
@RequiredArgsConstructor
public class WarningTaskController {
    // 注意使用 final 标记不可变
    private final WarningTaskService taskService;
    // 多个依赖可以
}

二、设值注入(Setter Injection)

设值注入通过 setter 方法来注入依赖。

举个例子:

使用 Spring Security ,默认内存用户认证的信息可以配置spring.security.user.name=customUserName就是通过 Setter 注入。

源码如下:

@ConfigurationProperties(prefix = "spring.security")
public class SecurityProperties {
    // 省略一些非必要的代码
	
	private final User user = new User();

	public User getUser() {
		return this.user;
	}


	public static class User {

		private String name = "user";
		private String password = UUID.randomUUID().toString();
		private List<String> roles = new ArrayList<>();

		private boolean passwordGenerated = true;

		public String getName() {
			return this.name;
		}

		public void setName(String name) {
			this.name = name;
		}

		// 省略其他 getter/setter
	}

}

三、字段注入(Field Injection)

字段注入直接通过字段来注入依赖。

举个例子:

@RestController
public class WarningTaskController {

    // 不推荐使用
    // 如果依赖非常多,代码会很臃肿
    @Autowired
    private final WarningTaskService taskService;

}

四、方法注入(Method Injection)

方法注入通过方法参数来注入依赖。

举个例子:

@RestController
public class WarningTaskController {
    private WarningTaskService taskService;

    // 不推荐 如果对象是可变的
    @Autowired
    public void configure(WarningTaskService taskService) {
        this.taskService = taskService;
    }

    // 其他业务逻辑...
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题

    解决SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题

    这篇文章主要介绍了SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题的解决方法,需要的朋友可以参考下
    2018-09-09
  • java 与web服务器链接的实例

    java 与web服务器链接的实例

    这篇文章主要介绍了java 与web服务器链接的实例的相关资料,使用net.Socket类sock.getInetAddress()方法获得与Web服务器连接,需要的朋友可以参考下
    2017-07-07
  • Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持

    Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持

    随着 Spring Framework 5.2.0 成功发布之后,Spring Boot 2.2 也紧跟其后,发布了第一个版本:2.2.0。下面就来一起来看看这个版本都更新了些什么值得我们关注的内容
    2019-10-10
  • 深度剖析java动态静态代理原理源码

    深度剖析java动态静态代理原理源码

    这篇文章主要介绍了深度剖析java动态静态代理原理源码,关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。,需要的朋友可以参考下
    2019-06-06
  • Java21增强对Emoji表情符号处理示例详解

    Java21增强对Emoji表情符号处理示例详解

    这篇文章主要为大家介绍了Java21增强对Emoji表情符号处理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Java中JSON数据操作与处理全面指南

    Java中JSON数据操作与处理全面指南

    JSON(JavaScript Object Notation)是数据交换的轻量级格式,它以易于人类阅读和机器解析的方式组织数据,基于键值对,在Java开发中,处理JSON数据通常涉及使用Jackson、Gson、Fastjson等库,本文给大家介绍JSON数据操作与处理全面指南,感兴趣的朋友一起看看吧
    2024-10-10
  • 在Java中读取和解析JSON文件的示例代码

    在Java中读取和解析JSON文件的示例代码

    我们在日常开发中少不了和JSON数据打交道,JSON是轻量、结构化的数据交换格式,支持跨语言,本文给大家详细介绍了如何在 Java 中读取和解析 JSON 文件,并有详细的代码示例供大家参考,需要的朋友可以参考下
    2025-06-06
  • 在eclipse中使用SVN的实现方法(图文教程)

    在eclipse中使用SVN的实现方法(图文教程)

    这篇文章主要介绍了在eclipse中使用SVN的实现方法(图文教程),文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • javaWeb实现学生信息管理系统

    javaWeb实现学生信息管理系统

    这篇文章主要为大家详细介绍了javaWeb实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 微信小程序 navigator 跳转url传递参数

    微信小程序 navigator 跳转url传递参数

    这篇文章主要介绍了 微信小程序 navigator 跳转url传递参数的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论