@RequiredArgsConstructor和@Authwired
我们在java后端书写接口时,对service层成员变量的注入和使用有以下两种实现方式:
1) @RequiredArgsConstructor
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/users")
public List<User> getUsers(@RequestParam String query) {
return userService.searchUsers(query);
}
}
2) @Autowired
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUsers(@RequestParam String query) {
return userService.searchUsers(query);
}
}
看完代码,估计大家能看出个大概,不知道有没有人会觉得当成员变量不为final时,就使用@Authwired;为final时,就用@RequiredArgsConstructor,其实不然,我们看下面的代码:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/users")
public List<User> getUsers(@RequestParam String query) {
return userService.searchUsers(query);
}
}
当成员变量为 final 时,可以使用 @Autowired 注解来进行注入,但是需要结合构造函数注入的方式来实现。
接下来,我们具体看看这两个注解的区别:
- 生成构造函数的方式:
● @RequiredArgsConstructor:这是 Lombok 提供的注解,它会在编译时根据类中被声明为 final 或 @NonNull 的字段生成一个构造函数。生成的构造函数用于初始化这些字段,并将它们标记为必需参数。这样,在创建对象时,这些字段必须被传入构造函数中。
● @Autowired:这是 Spring 框架提供的注解,它用于自动注入依赖项。通过在构造函数、字段或方法上使用 @Autowired 注解,Spring 框架会自动解析依赖项并进行注入。 - 适用范围:
● @RequiredArgsConstructor:由于是 Lombok 提供的注解,它可以在任何环境中使用,而不依赖于特定的框架或库。
● @Autowired:这是 Spring 框架提供的注解,用于在 Spring 环境中实现依赖注入。它需要依赖于 Spring 框架,并且用于在 Spring 应用程序中自动解析和注入依赖项。 - 字段修饰符要求:
● @RequiredArgsConstructor:该注解可以与 private final 或 @NonNull 修饰的字段一起使用,生成的构造函数会将这些字段标记为必需参数。
● @Autowired:该注解可以与非 final 字段一起使用,并且在运行时自动注入相关的依赖项。
这下,想必你就能清楚的知道他俩的区别了。其实对于成员变量是否为final,主要根据自己的业务需求,看变量在运行时是否需要变化,当然大部分情况下都是final。如果不是final,那只能用@Authwired注解,如果是final,那肯定是@RequiredArgsConstructor更方便,不然用到的service多了,你的构造函数得写多少个参数。而且,@RequiredArgsConstructor还可以用于实体层。
@RequiredArgsConstructor和@Authwired的更多相关文章
- Lombok(1.14.8) - @NoArgsConstructor, @RequiredArgsConstructor & @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor,提供一个无参的构造方法. package com.huey.hello.bean; import java.util.Dat ...
- 还在使用@Autowrired注入?不妨试试@RequiredArgsConstructor
一.前言 小编最近在项目里看到有的同事大神用到了Lombok中的一个@RequiredArgsConstructor,带着好奇发现这个东西就是简化了一些@Autowired注解,想想如果一个Servi ...
- SpringBoot - Lombok使用详解3(@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor)
五.Lombok 注解详解(3) 5,@NoArgsConstructor 注解在类上,为类提供一个无参的构造方法. 注意: 当类中有 final 字段没有被初始化时,编译器会报错,此时可用 @NoA ...
- 注解:@RequiredArgsConstructor、 @Validated、 @Valid、 @Lazy
1. lombok注解:@RequiredArgsConstructor Spring 依赖注入方式 1.通过 @Autowire.@Resource 等注解注入, 2.通过构造器的方式进行依赖注入. ...
- Spring 注解中@Resource 和 @Authwired 的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...
- Lombok简化Java代码
导包:import lombok.Data; Lombok简化Java代码: 在Lombok中,生成构造方法的annotation一共有三个:@NoArgsConstructor, @Required ...
- Spring之IoC总结帖
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...
- 使用Lombok简化你的代码
一.安装 eclipse 下载:https://projectlombok.org/ 双击安装即可. 重启eclipse/myeclipse 如果有报错,clean一下项目 ...
随机推荐
- Application of Permutation and Combination
Reference https://www.shuxuele.com/combinatorics/combinations-permutations.html Online Tool https:// ...
- JDBC详解(韩顺平教程)
JDBC 一.原理示意图 二.前提步骤 IDEA导入MySQL的jdbc驱动,并操作数据库 - 打点 - 博客园 (cnblogs.com) 三.JDBC编写步骤: 用法1: package Hsp. ...
- GPU技术在大规模计算和并行计算中的应用和挑战
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 GPU 技术在大规模计算和并行计算中的应用和挑战 随着计算机硬件的不断发展和计算能力的提高 ...
- APP中Web容器的核心实现
现在的业务型APP中,采用纯原生开发策略的已经很少了,大部分都使用的混合开发.如原生,H5,ReactNative,Flutter,Weex它们之间任意的组合就构成了混合开发. 其中原生+H5是出 ...
- 记一次 .NET 某医院预约平台 非托管泄露分析
一:背景 1. 讲故事 前几天有位朋友找到我,说他的程序有内存泄露,让我帮忙排查一下,截图如下: 说实话看到 32bit, 1.5G 这些关键词之后,职业敏感告诉我,他这个可能是虚拟地址紧张所致,不管 ...
- Navicat 连接Oracle ORA-28547: connection to server failed, probable Oracle Net admin error
Navicat 连接 Oracle 报 ORA-03135: connection lost contact ORA-28547: connection to server failed, proba ...
- Thread 和 ThreadPool 简单梳理(C#)【并发编程系列】
〇.前言 对于 Thread 和 ThreadPool 已经是元老级别的类了.Thread 是 C# 语言对线程对象的封装,它从 .NET 1.0 版本就有了,然后 ThreadPool 是 .Net ...
- vue基本操作[上] 续更----让世界感知你的存在
Vue引用js文件的多种方式 1.vue-cli webpack全局引入jquery (1)首先 npm install jquery --save (--save 的意思是将模块安装到项目目录下,并 ...
- Django: django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "game-detail".
错误原因:在序列化时,使用了参数`url`,但在`urls.py`文件中,没有使用命名 # urls.py from django.urls import path from RESTSerializ ...
- peewee模块更改数据-sqlite
更改数据 from playhouse.migrate import *# SQLite example: my_db = SqliteDatabase('my_database.db') migra ...