Spring常用注解详解(一)

1、@Value

此注解是 Spring Framework 中用于从外部属性源(例如配置文件、环境变量)中注入值到 Spring Bean 中的注解。通过 @Value 注解,可以将配置信息动态注入到 Bean 的字段、方法参数或构造函数中。

基本用法:

@Component
public class MyBean {

    @Value("${my.property}")
    private String myProperty;

    // 其他类的实现
}

在上述例子中,@Value(“${my.property}”) 注解用于将配置文件(或其他属性源)中名为 “my.property” 的属性值注入到 myProperty 字段中。Spring 将根据配置文件的内容自动完成这个注入。

在方法参数中使用:

@Component
public class MyBean {

    private String myProperty;

    @Autowired
    public MyBean(@Value("${my.property}") String myProperty) {
        this.myProperty = myProperty;
    }

    // 其他类的实现
}

在上述例子中,通过在构造函数参数上使用 @Value 注解,实现了将配置属性注入到构造函数中。这是在使用构造函数注入时的一种常见用法。

默认值和SpEL表达式:

@Component
public class MyBean {

    @Value("${my.property:default-value}")
    private String myProperty;

    // 其他类的实现
}

在上述例子中,通过 @Value(“${my.property:default-value}”) 的形式,可以设置默认值。如果 “my.property” 不存在于属性源中,将使用默认值 “default-value”。

还可以使用 SpEL(Spring Expression Language)表达式:

@Component
public class MyBean {

    @Value("#{systemProperties['user.home']}")
    private String userHome;

    // 其他类的实现
}

在上述例子中,通过 @Value(“#{systemProperties[‘user.home’]}”) 表达式,可以从系统属性中获取 “user.home” 的值。

注意事项:

@Value 注解通常用在字段、构造函数参数、方法参数等位置,用于注入配置值。

@Value 注解支持占位符,如 ${my.property},表示从配置文件中获取名为 "my.property" 的属性值。

可以为 @Value 注解提供默认值,如 ${my.property:default-value}。

@Value 注解还支持 SpEL 表达式,如 #{systemProperties['user.home']}。

在使用 @Value 注解时,需要确保属性源中存在相应的属性,否则可能会导致注入失败或使用默认值。

在 Spring Boot 应用中,通常可以使用 application.properties 或 application.yml 文件中的配置来使用 @Value 注解

2、@RequestMapping

此注解是 Spring Framework 中用于映射 HTTP 请求路径到具体的处理方法(Controller 方法)的注解。它可以用在类级别或方法级别上,用于定义处理请求的路径。

在类级别上使用 @RequestMapping:

@Controller
@RequestMapping("/example")
public class ExampleController {
    // Class-level mapping: "/example"

    @RequestMapping("/hello")
    public String hello() {
        // Method-level mapping: "/example/hello"
        return "hello";
    }

    @RequestMapping("/greet")
    public String greet() {
        // Method-level mapping: "/example/greet"
        return "greet";
    }
}

在上面的例子中,@RequestMapping 注解在类级别上定义了 “/example”,因此所有该类中的处理方法的路径都会以 “/example” 作为前缀。方法级别的 @RequestMapping 注解则定义了具体的路径,例如 “/hello” 和 “/greet”。

在方法级别上使用 @RequestMapping:

@Controller
public class ExampleController {

    @RequestMapping("/hello")
    public String hello() {
        // Method-level mapping: "/hello"
        return "hello";
    }

    @RequestMapping(value = "/greet", method = RequestMethod.GET)
    public String greet() {
        // Method-level mapping: "/greet", only for HTTP GET requests
        return "greet";
    }
}

在方法级别上,@RequestMapping 注解可以指定请求的路径(通过 value 属性)以及请求的方法(通过 method 属性)。在上面的例子中,/hello 和 /greet 是方法的路径,而且 /greet 方法只会处理 HTTP GET 请求。

此外,@RequestMapping 还有很多其他的属性,例如 params、headers 等,用于更细粒度地定义请求映射条件。这样可以根据请求的参数、请求头等条件来匹配到不同的处理方法。

总体来说,@RequestMapping 是一个灵活强大的注解,用于定义处理请求的映射规则,使得开发者可以方便地构建和维护 Web 应用程序的请求映射。在最新版本的 Spring 中,@RequestMapping 已经被 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping 等更具体的注解取代,以提高代码的可读性和简洁性。

他的一些常用属性:

value 或 path: 指定请求路径的字符串数组,可以配置多个路径。例如,@RequestMapping(value = {"/hello", "/greet"})。

method: 指定请求的HTTP方法。默认情况下,支持所有 HTTP 方法。可以通过 RequestMethod 枚举指定具体的方法,例如 RequestMethod.GET、RequestMethod.POST。示例:@RequestMapping(value = "/greet", method = RequestMethod.GET)。

params: 指定请求参数的条件,支持参数的存在与特定值的比较。示例:@RequestMapping(value = "/hello", params = "name=John")。

headers: 指定请求头的条件。示例:@RequestMapping(value = "/greet", headers = "content-type=text/plain")。

consumes: 指定可以接受请求的媒体类型(Content-Type),限制请求的类型。示例:@RequestMapping(value = "/greet", consumes = "application/json")。

produces: 指定返回的媒体类型(Accept),限制响应的类型。示例:@RequestMapping(value = "/greet", produces = "application/json")。

params 和 headers 的组合使用: 可以通过逻辑运算符(AND、OR、NOT)结合 params 和 headers 属性来定义更复杂的条件。示例:@RequestMapping(value = "/hello", params = {"name=John", "age!=25"})。

pathVariables: 用于将 URI 模板变量映射到处理方法的参数。示例:@RequestMapping("/user/{userId}"),在方法参数上使用 @PathVariable 注解。

name: 为请求映射命名,用于唯一标识映射。主要用于基于 Java 配置的 Spring MVC。

3、@RequestParam

注解是 Spring Framework 中用于从请求中获取参数值的注解。它可以用在方法的参数上,用于将请求参数映射到方法的参数上,从而在方法体内使用这些参数值。

基本用法:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @GetMapping("/hello")
    public String hello(@RequestParam String name) {
        // 使用@RequestParam注解从请求中获取名为"name"的参数值
        // 访问路径:/example/hello?name=John
        // 参数值"John"会被注入到name参数中
        System.out.println("Hello, " + name + "!");
        return "hello";
    }
}

在上述例子中,@RequestParam 注解用于标注 name 参数,它指示了要从请求中获取名为 name 的参数值,并将其注入到方法参数 String name 中。如果请求路径是 /example/hello?name=John,那么在方法内部,name 的值将是 “John”。

一些常用的属性:

value 和 name: 用于指定请求参数的名称,两者是等价的。例如,@RequestParam(value = "username") 或 @RequestParam(name = "username")。

defaultValue: 指定参数的默认值,在请求中没有提供该参数时使用默认值。例如,@RequestParam(value = "age", defaultValue = "25")。

required: 指定参数是否是必须的。默认为 true,如果设置为 false,表示请求中可以没有这个参数。例如,@RequestParam(value = "optionalParam", required = false)。

多个参数: 处理多个参数时,可以直接在方法参数列表中添加多个 @RequestParam 注解。示例如下
@GetMapping("/greet")
public String greet(@RequestParam String firstName, @RequestParam String lastName) {
    // 访问路径:/example/greet?firstName=John&lastName=Doe
    // firstName 参数值为 "John",lastName 参数值为 "Doe"
    System.out.println("Hello, " + firstName + " " + lastName + "!");
    return "greet";
}

4、@PathVariable

此注解是 Spring Framework 中用于从 URI 模板中获取变量值的注解。它可以用在方法的参数上,用于将 URI 中的模板变量映射到方法的参数上,从而在方法体内使用这些变量值。

基本用法:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @GetMapping("/user/{userId}")
    public String getUser(@PathVariable Long userId) {
        // 使用@PathVariable注解从URI中获取名为"userId"的变量值
        // 访问路径:/example/user/123
        // 变量值"123"会被注入到userId参数中
        System.out.println("User ID: " + userId);
        return "userDetails";
    }
}

在上述例子中,@PathVariable 注解用于标注 userId 参数,它指示了要从 URI 中获取名为 userId 的变量值,并将其注入到方法参数 Long userId 中。如果请求路径是 /example/user/123,那么在方法内部,userId 的值将是 123。

一些常用的属性:

value 和 name: 用于指定 URI 模板中的变量名称,两者是等价的。例如,@PathVariable(value = "userId") 或 @PathVariable(name = "userId")。

required: 指定变量是否是必须的。默认为 true,如果设置为 false,表示 URI 中可以没有这个变量。例如,@PathVariable(value = "optionalVar", required = false)。

多个变量: 处理多个变量时,可以直接在方法参数列表中添加多个 @PathVariable 注解。
@GetMapping("/user/{userId}/account/{accountId}")
public String getAccount(@PathVariable Long userId, @PathVariable String accountId) {
    // 访问路径:/example/user/123/account/456
    // userId 变量值为 "123",accountId 变量值为 "456"
    System.out.println("User ID: " + userId + ", Account ID: " + accountId);
    return "accountDetails";

5、@ResponseBody

此注解是 Spring Framework 中用于标识方法返回的对象应该被直接写入 HTTP 响应体中的注解。通常用于标识 RESTful 服务中的方法,表示方法返回的对象将作为响应的主体部分,而不是通过视图解析器进行渲染。

基本用法:

@RestController
@RequestMapping("/api")
public class MyRestController {

    @GetMapping("/message")
    @ResponseBody
    public String getMessage() {
        // 返回的字符串将直接作为 HTTP 响应体的内容
        return "Hello, this is a RESTful message!";
    }

    @GetMapping("/user")
    @ResponseBody
    public User getUser() {
        // 返回的 User 对象将被转换为 JSON,并作为 HTTP 响应体的内容
        User user = new User("John", "Doe");
        return user;
    }
}

在上述例子中,@ResponseBody 注解标识了 getMessage() 和 getUser() 方法。这意味着这两个方法的返回值将直接作为 HTTP 响应体的内容,而不会通过视图解析器进行渲染。

注意事项:

返回 JSON 或其他数据格式: 如果方法返回的是对象(如 POJO、List、Map 等),Spring 会使用适当的消息转换器将对象转换为 JSON 或其他指定的数据格式。

常用于 RESTful 服务: @ResponseBody 注解常用于 RESTful 服务中,其中方法的返回值通常是数据,而不是视图。

与 @RestController 结合使用: @RestController 注解是 @Controller 和 @ResponseBody 的组合,通常用于标识 RESTful 控制器。
@RestController
@RequestMapping("/api")
public class MyRestController {

    @GetMapping("/message")
    public String getMessage() {
        // 返回的字符串将直接作为 HTTP 响应体的内容
        return "Hello, this is a RESTful message!";
    }

    @GetMapping("/user")
    public User getUser() {
        // 返回的 User 对象将被转换为 JSON,并作为 HTTP 响应体的内容
        User user = new User("John", "Doe");
        return user;
    }
}

在实际开发中,@ResponseBody 注解通常不需要显式使用,因为@RestController 已经包含了该注解的功能。使用 @RestController 更为简洁,但了解 @ResponseBody 的作用是很有帮助的。

6、@ResponseStatus

此注解是 Spring Framework 中用于指定方法或异常类的 HTTP 响应状态码的注解。它可以用在方法或异常类上,用于定义当方法执行成功时返回的 HTTP 状态码。

在方法上使用 @ResponseStatus:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @GetMapping("/success")
    @ResponseStatus(HttpStatus.OK)
    public String success() {
        // 方法执行成功时,返回 HTTP 状态码为 200 OK
        return "success";
    }
}

在上述例子中,@ResponseStatus 注解被用于标注 success() 方法,表示当该方法执行成功时,应该返回 HTTP 状态码为 200 OK。

在异常类上使用 @ResponseStatus:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {

    public ResourceNotFoundException(String message) {
        super(message);
    }
}

在这个例子中,@ResponseStatus 注解被用于标注自定义异常类 ResourceNotFoundException,表示当该异常被抛出时,应该返回 HTTP 状态码为 404 NOT_FOUND。

注意事项:

在方法上使用: 如果在方法上使用 @ResponseStatus,它将覆盖任何异常上的相同的注解。

在异常类上使用: 如果在异常类上使用 @ResponseStatus,则当该异常被抛出时,会根据注解中指定的状态码返回响应。

使用 @ResponseStatus 的默认值: 如果未指定状态码,默认情况下,@ResponseStatus 使用 HttpStatus.INTERNAL_SERVER_ERROR(即 500 Internal Server Error)作为默认值。
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public class DefaultException extends RuntimeException {
    // ...
}

@ResponseStatus 注解允许开发者明确指定成功或失败时的 HTTP 状态码,以便更精细地控制响应的状态。在处理成功和失败的情况时,使用该注解可以提供清晰的标识,使得代码更易于维护和理解。

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

户伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值