Spring 依赖注入(Dependency Injection)

server/2024/10/19 2:20:00/

先说结论: 实际开发时尽量选择 构造器注入 而不是 字段注入。 设值注入 和 方法注入 适用的场景较少,较特殊。
原因:
● 官方推荐使用!
● 代码更简洁:配合 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)

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

举个例子:

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

二、设值注入(Setter Injection)

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

举个例子:
使用 Spring Security ,默认内存用户认证的信息可以配置spring.security.user.name=customUserName就是通过 Setter 注入。源码如下:

java">@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)

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

举个例子:

java">@RestController
public class WarningTaskController {// 不推荐使用// 如果依赖非常多,代码会很臃肿@Autowiredprivate final WarningTaskService taskService;}

四、方法注入(Method Injection)

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

举个例子:

java">@RestController
public class WarningTaskController {private WarningTaskService taskService;// 不推荐 如果对象是可变的@Autowiredpublic void configure(WarningTaskService taskService) {this.taskService = taskService;}// 其他业务逻辑...
}

http://www.ppmy.cn/server/130446.html

相关文章

mybatisplus整合springboot3出错(springboot多模块开发)

1.mybatisplus版本太低或者maven导入没用如下的 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency>2.maven导入冲突了&#xf…

CSDN 的 GIt 是没东西吗

虽然说吧 CSDN 的博客也就那样&#xff0c;记得去年的时候 CSDN 出了一个 Git 代码库&#xff0c;被骂得要死&#xff0c;基本上是从外面搬了一堆代码回来。 这回 CSDN 又玩了个新东西&#xff0c;干脆你可以把你的博客文章同步到你在 CSDN 开的代码库上了。 如何同步 在 CS…

使用GPG学习非对称加密 信任公钥

非对称加密需要公钥和私钥&#xff1a; 你的公钥的作用&#xff1a;别人用来给你发加密的信息&#xff06;别人验证你的签名&#xff0c;即加密&验证&#xff08;别人来做&#xff09; 你的私钥的作用&#xff1a;你用来创建签名&#xff06;解密别人发给你的信息的&#x…

QD1-P16 HTML 按钮标签(button)

本节学习 HTML 常用标签&#xff1a;button ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p16 ‍ ​<button>​ 标签在 HTML 中用于创建按钮&#xff0c;它是一个交互式元素&#xff0c;通常用于提交表单或触发某个脚本。以下是 <button>​ 标签的一些基本…

《网络安全:数字时代的坚实护盾》

《网络安全&#xff1a;数字时代的坚实护盾》 在当今高度数字化的时代&#xff0c;网络安全的重要性如同空气对于生命一般不可或缺。它不仅关乎个人的隐私与财产安全&#xff0c;更对企业的生存发展和国家的稳定繁荣起着至关重要的作用。 对于个人而言&#xff0c;网络安全是保…

标杆案例 | “1+N+X”破局中小企业数字化难题,蓝卓助力瓯宝安防实现透明生产

在数字化转型的浪潮中&#xff0c;中小企业正逐渐成为变革的主力军。 然而&#xff0c;量大面广的中小企业却普遍存在“缺资金&#xff0c;不愿做”“缺人才&#xff0c;不敢做”“缺样本&#xff0c;不会做”现象&#xff0c;亟需一条“低成本”“低门槛”“轻量化”“可复制…

Linux系列-常见的指令(二)

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” mv 剪切文件&#xff0c;目录 重命名 比如说&#xff0c;我们在最开始创建一个新的文件hello.txt 然后我们将这个文件改一个名字&#xff0c;改成world.txt 所以&#xff0c;…

wordpress父分类和归档页调用子分类名称和链接

在WordPress中&#xff0c;要在父分类和归档页调用子分类的名称和链接&#xff0c;可以使用以下方法&#xff1a; 使用get_categories()函数获取子分类&#xff1a; <?php $parent_category_id 1; // 替换为父分类的ID $args array(parent > $parent_category_id,or…