Spring Boot 常用注解
@SpringBootApplication
@SpringBootApplication 是启动类上的注解,它组合了3个其他的注解。
-
@SpringBootConfiguration:将该类声明为配置类,这个注解实际上是@Configuration注解的特殊形式。
-
@EnableAutoConfiguration:启用Spring Boot的自动配置,这个注解会告诉SpringBoot自动配置它认为我们会用到的组件。
-
@ComponentScan:启用组件扫描。这样我们能够通过像@Component、@Controller、@Service这样的注解声明其他类,Spring会自动发现它们并将它们注册为Spring应用上下文中的组件。
@JsonFormat
时间注解 @JsonFormat 用在对象属性上,即 bean 层,或者 model 层,使其返回的时间满足指定格式,示例如下:
public class Salary {
...
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createDate;
...
}
@Transactional
注解 @Transactional 用于事务管理,常用在 service 层,使用了注解 @Transactional 的方法,如果发生 unchecked exception,就会发生 rollback 。
@Conditional
条件注解 @Conditional 是 Spring 4.0 引入的新特性
示例:
@Conditional(JdbcTemplateCondition.class)
public MyService myService() {
...
}
在这个例子里,只有当 JdbcTemplateCondition 类的条件成立时,才会创建 MyService 这个 Bean。
下表列出了 Spring Boot 提供的条件化注解。
@PathVariable
@PathVariable 是 spring3.0 的一个新功能:接收请求路径中占位符的值。
语法:
@PathVariable("xxx")
通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
示例:
@GetMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String name){
return userService.selectUser(name);
}
@CrossOrigin
注解 @CrossOrigin 用于跨域访问支持,@CrossOrigin 有 2 个参数:
- origins: 允许可访问的域列表
- maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。
使用示例如下:
// 允许来自百度站点的访问
@CrossOrigin(origins = "http://baidu.com", maxAge = 3600)
// 允许来自任何站点的访问
@CrossOrigin(origins = "*")
@RequestBody 和 @ResponseBody
@ResponseBody 是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP 响应体中,一般在异步获取数据时使用(也就是AJAX),在使用 @RequestMapping 后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。
@RequestBody 是作用在形参列表上,用于将前台发送过来固定格式的数据(xml 格式或者 json等)封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
只使用 @ResponseBody 的示例:
@RequestMapping("/login.do")
@ResponseBody
public Object login(String name, String password, HttpSession session) {
user = userService.checkLogin(name, password);
session.setAttribute("user", user);
return new JsonResult(user);
}
既使用 @ResponseBody 又使用 @RequestBody 的示例:
@RequestMapping("/login.do")
@ResponseBody
public Object login(@RequestBody User loginUuser, HttpSession session) {
user = userService.checkLogin(loginUser);
session.setAttribute("user", user);
return new JsonResult(user);
}
@Data
@Data 注解就是由 Lombok 提供的,它会告诉Lombok生成所有缺失的方法,同时还会生成所有以final属性作为参数的构造器。
即,@Data 在运行时动态生成 getter 和 setter 方法
通过使用 Lombok,我们能够让代码简洁明了。
@Slf4j
如果不想每次都写
private final Logger logger = LoggerFactory.getLogger(当前类名.class);
可以用注解@Slf4j,该注解来自于 lombok 依赖,用法如下:
@Controller
@Slf4j
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/current")
public String orderForm(Model model){
model.addAttribute("order", new Order());
return "orderForm";
}
@PostMapping
public String processOrder(Order order){
// 使用 log.info() 打印日志
log.info("Order submitted:" + order);
return "redirect:/";
}
}
@NoArgsConstructor、@AllArgsContructor、@RequiredArgsConstructor
这三个注解,都来自于 Lombok 依赖,其中:
-
@NoArgsConstructor : 生成一个无参数的构造方法,如果由于存在final字段而无法编写此类构造函数,将生成错误消息。
-
@AllArgsContructor: 会生成一个包含所有参数的构造函数
-
@RequiredArgsConstructor:生成带有必需参数的构造函数,必填参数是final字段和具有约束的字段,例如@NonNull。
@Configuration
在 Java 配置中,我们用一个 java 配置去代替 Spring 中 applicationContext.xml, 这时,就需要使用注解 @Configuration
:
@Configuration
public class JavaConfig{
@Bean
SayHello sayHello(){
return new SayHello();
}
}
使用注解 @Configuration
表示这个类是一个配置类,它的作用相当于 applicationContext.xml 。
然后定义方法,方法返回对象,方法上添加@Bean 注解,表示将这个方法的返回值注入到 Spring 容器中。也就是说,@Bean 对应的方法,就相当于 applicationContext.xml 中的 bean 节点。
@Service
如果希望将一个类自动注册到 Spring 容器中,那么可以给这个类添加一个注解 @Service .
和 @Service 注解功能类似的注解,一共有四个:
- @Component
- @Repository
- @Service
- @Controller
这四个中,其他三个都是基于 @Component 做出来的,源码基本一致,功能也是一致的。
为什么要区分出来,主要是为了在不同的类上面添加时方便:
- 在 Service 层上,添加注解,使用 @Service
- 在 Dao 层上,添加注解时,使用 @Repository
- 在 Controller 层上,添加注解时,使用 @Controller
- 在其他组件上添加注解时,使用 @Component
@ComponentScan
通过注解 @ComponentScan 指定要扫描的包:
@ComponentScan(basePackages = "com.example.demo")
这表示扫描 com.example.demo 下所有的 Bean。
@Autowired
注解 @Autowired 的作用是对象注入。自动扫描的对象注入有三种方式:
- @Autowired
- @Resources
- @Injected
如果一个对象只有一个实例,则用 @Autowired ,如果一个对象有多个实例,则用 @Resources ,或者 @Autowired + @Qualifier 结合起来使用。
@Profile
@Profile 是条件注解,可以用于多环境切换。
如:
@Bean
@Profile("dev") // 使用开发环境
DataSource devDataSource(){
...
}
@RequestMapping
这个注解用来标记一个请求 URL ,如:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
这里的 @RequestMapping("/hello") 表示当请求地址为 /hello 时,这个方法会被触发。
@RequestMapping 还可以用于请求窄化(给请求添加一个前缀),示例:
@RestController
@RequestMapping("/api")
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
这个时候访问 hello ,地址就应该是:http://localhost:8080/api/hello
.
@GetMapping
@GetMapping用于将 HTTP get 请求映射到特定处理程序的方法注解。具体来说,@GetMapping 是一个组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写。
如下面两行是等价的:
@RequestMapping(method = RequestMethod.GET, value = "/hello2")
@GetMapping("/hello2")
@GetMapping 可以看作是 @RequestMapping 的一个细分,自 Spring 4.3 版本,引入了如下 5 个注解。
- @GetMapping,
- @PostMapping、
- @PutMapping、
- @DeleteMapping
- @PatchMapping,
@RestController
注解 @RestController = @Controller + @ResponseBody,一般用在类上,表示将这个类自动注册到 Spring 容器中,并且该类下的所有方法都会返回 JSON 格式的数据。
@ResponseBody,一般是使用在单独的方法上的,需要哪个方法返回json数据格式,就在哪个方法上使用,具有针对性。
@RequestParam
当服务端的接口变量名和前端不一致时,可以使用注解 @RequestParam 来接解决,等价于 request.getParam,示例:
@ResponseBody
@RequestMapping("login")
public String login(@RequestParam("name") String username,
@RequestParam("password") String password) {
}
这表示用 username 来接收前端传来的 name 参数。
@Param 用于 DAO 层(也就是 Mapper 层),是 mybatis 中的注解。使得 mapper.xml 中的参数与后台的参数对应上,也增强了可读性。示例:
@Mapper
@Repository
public interface UserMapper {
@Select("SELECT * FROM user where username=#{username} and password=#{password}")
User login(@Param("username") String username,@Param("password") String password);
}
@PropertySource
通过注解 @PropertySource 来引入相关配置,进行属性注入。
每一个参数使用 @Value("${xxx.xx}")
形式进行注入。
@Component // 注入到 Spring 容器中
@PropertySource(value = {"classpath:book.properties"}, encoding = "UTF-8") // 自动加载 book.properties 文件
public class Book {
@Value("${book.id}")
private Integer id;
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
...
}
@ConfigurationProperties
@ConfigurationProperties 注解会将 Spring 容器中对应的数据注入到对象对应的属性中,就不用通过 @Value 注解挨个注入了。
@Component // 注入到 Spring 容器中
@PropertySource(value = {"classpath:book.properties"}, encoding = "UTF-8") // 自动加载 book.properties 文件
@ConfigurationProperties(prefix = "book") // 类型安全的属性注入,不再使用 @Value注解 挨个注入
public class Book {
private Integer id;
private String name;
private String author;
...
}
每天学习一点点,每天进步一点点。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· Ai满嘴顺口溜,想考研?浪费我几个小时
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)