Spring依赖注入方式(Dependency Injection)
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;
}
// 其他业务逻辑...
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Apache DolphinScheduler实现自动化打包单机/集群部署详解
这篇文章主要为大家介绍了Apache DolphinScheduler实现自动化打包单机/集群部署详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-09-09
InterProcessMutex实现zookeeper分布式锁原理
本文主要介绍了InterProcessMutex实现zookeeper分布式锁原理,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2022-03-03
java中double转化为BigDecimal精度缺失的实例
下面小编就为大家带来一篇java中double转化为BigDecimal精度缺失的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-03-03
idea SpringBoot+Gradle环境配置到项目打包
Gradle是一个基于Java应用的项目自动化构建工具,本文介绍了在IDEA中创建Spring Boot Gradle项目,项目配置包括init.gradle和settings.gradle,感兴趣的可以了解一下2024-11-11


最新评论