一、引言

在Spring Boot框架中,有许多常用的注解可用于开发项目。下面是其中一些常见的注解及其功能和属性的说明:

1、@RestController

@RestController 是 Spring Framework 中的一个注解,用于标识一个类是 RESTful 服务的控制器。它结合了 @Controller@ResponseBody 注解的功能,简化了创建 RESTful 服务的代码。

@RestController 的主要作用是将方法返回的对象直接转换为响应体,并通过适当的 HTTP 响应头来补充响应信息。这意味着在使用 @RestController 注解的类中,不需要显式地使用 @ResponseBody 来指定方法的返回值要作为响应体。

以下是 @RestController 注解的常用属性:

1、value指定控制器的 URL 路径。

2、produces指定控制器支持的响应媒体类型。

3、consumes指定控制器支持的请求媒体类型。

下面是一个使用 @RestController 注解的示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable int id) {
        // 根据用户ID查询数据库或其他操作
        User user = userRepository.findById(id);
        return user;
    }
}

上述示例中,UserController 类被标记为 @RestController,表明它是一个 RESTful 服务的控制器。getUserById 方法使用 @GetMapping 注解来处理 GET 请求,并通过 @PathVariable 注解将 URL 中的参数映射到方法的参数中。方法返回一个 User 对象,Spring 将自动转换为 JSON 格式的响应体,并设置适当的 HTTP 响应头。

这样,当发送 GET 请求 /users/123 时,将会触发 getUserById 方法,根据 ID 查询用户信息并将其作为 JSON 数据返回给客户端。

2、@RequestMapping

@RequestMapping 注解是 Spring MVC 框架中用于将请求映射到控制器方法的注解。它可以被应用在类级别或方法级别。

1、当应用在类级别时,它指定了基本的请求路径,该路径会与控制器中的所有方法的请求路径进行匹配。

2、当应用在方法级别时,它指定了具体的请求路径,该路径会与该方法的请求进行匹配。

@RequestMapping 注解有多个属性可以配置:

1、value用于指定请求的路径,可以接受单个字符串值或字符串数组,支持 Ant 风格的路径模式(例如 /users/*)。

2、method用于指定请求的 HTTP 方法,可以接受一个或多个 RequestMethod 枚举值,默认为任意请求方法。

3、params用于指定请求的参数条件,可以接受一个或多个字符串表达式,支持简单的比较操作符(例如 param=value!param 等)。

4、headers用于指定请求的头部条件,可以接受一个或多个字符串表达式,支持简单的比较操作符(例如 header=value!header 等)。

5、consumes用于指定请求的内容类型,可以接受一个或多个字符串值,表示服务器可接受的 MIME 类型。

6、produces用于指定响应的内容类型,可以接受一个或多个字符串值,表示服务器可生成的 MIME 类型。

下面是一个使用 @RequestMapping 注解的示例代码:

@Controller
@RequestMapping("/api/users")
public class UserController {

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        // 根据用户ID查询用户信息
        User user = userService.getUserById(id);
        if (user != null) {
            return ResponseEntity.ok(user);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    @RequestMapping(value = "/create", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Void> createUser(@RequestBody User user) {
        // 创建新用户
        userService.createUser(user);
        return ResponseEntity.created(URI.create("/api/users/" + user.getId())).build();
    }
}

在上述代码中:

1、UserController 类上使用了 @RequestMapping("/api/users") 注解,表示该控制器处理以 /api/users 开头的请求。

2、getUserById 方法使用了 @RequestMapping(value = "/{id}", method = RequestMethod.GET) 注解,表示该方法处理以 /api/users/{id} 形式的 GET 请求。

3、createUser 方法使用了 @RequestMapping(value = "/create", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 注解,表示该方法处理以 /api/users/create 形式的 POST 请求,并且只接受 JSON 类型的请求体。

通过使用 @RequestMapping 注解,我们可以轻松实现请求的映射和路由,使得控制器方法能够根据请求的路径、HTTP 方法、参数条件等进行精确匹配。

3、@GetMapping@PostMapping@PutMapping@DeleteMapping

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping是Spring框架中用于处理HTTP请求的注解。它们可以分别对应GET、POST、PUT和DELETE请求方法。

这些注解可以用在控制器类或方法上,用于定义特定请求方法的处理逻辑。

以下是每个注解的用途和属性: 

@GetMapping:用于处理GET请求。

属性:

1、headers指定请求头的条件,可选。

2、params指定请求参数的条件,可选。

3、value指定URL路径或路径模式,可以包含占位符。

代码示例:

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

    @GetMapping("/hello")
    public String hello() {
        return "Hello, GET!";
    }
}

@PostMapping:用于处理POST请求。

属性同@GetMapping。

代码示例:

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

    @PostMapping("/hello")
    public String hello() {
        return "Hello, POST!";
    }
}

@PutMapping:用于处理PUT请求。

属性同@GetMapping。

代码示例:

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

    @PutMapping("/hello")
    public String hello() {
        return "Hello, PUT!";
    }
}

@DeleteMapping:用于处理DELETE请求。

属性同@GetMapping。

代码示例:

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

    @DeleteMapping("/hello")
    public String hello() {
        return "Hello, DELETE!";
    }
}

注意:上述代码示例中的@RestController@RequestMapping是其他常用的注解,用于定义REST风格的控制器类和路径映射。

通过使用这些HTTP方法对应的注解,我们可以方便地定义处理不同类型请求的方法,并根据请求的具体条件来匹配相应的方法。

4、@PathVariable

@PathVariable注解用于将URL中的变量值绑定到控制器方法的参数上。在Spring MVC中,可以使用该注解来获取RESTful风格的URL中的路径变量。

该注解有以下属性:

1、value指定URL路径中的变量名,可以使用占位符形式(例如,/user/{id})。

2、namevalue属性作用相同,用于指定URL路径中的变量名。

3、required:声明该变量是否是必需的,默认为true,若路径中没有该变量会抛出异常。

4、defaultValue指定当URL路径中的变量未提供时的默认值。

下面是一个示例代码:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        // 根据用户ID查询用户信息,并返回
        return userService.getUserById(id);
    }

    @GetMapping("/{category}/{id}")
    public Product getProduct(@PathVariable String category, @PathVariable("id") int productId) {
        // 根据类别和产品ID获取相应产品信息,并返回
        return productService.getProduct(category, productId);
    }
}

在上述示例中,当客户端发送GET请求到"/users/123"时,getUserById方法的id参数将会被自动绑定为路径变量的值123。类似地,当客户端发送GET请求到"/users/books/456"时,getProduct方法的category参数将会被绑定为"books",productId参数将会被绑定为456。 

5、@RequestParam

@RequestParam注解是Spring框架中常用的注解之一,用于从请求参数中获取值并绑定到方法的参数上。它可以用于处理GET、POST等HTTP请求方法。

属性:

1、value指定要绑定的请求参数的名称。

2、required指定该参数是否是必需的,默认为true。如果设置为true,并且请求中没有提供该参数,则会返回400 Bad Request错误。

3、defaultValue指定该参数的默认值。当请求中未提供该参数时,将使用默认值。

下面是一个简单的示例代码,说明了如何在Spring MVC中使用@RequestParam注解:

@RestController
@RequestMapping("/example")
public class ExampleController {
    
    @GetMapping("/hello")
    public String sayHello(@RequestParam("name") String name) {
        return "Hello, " + name + "!";
    }
}

在上述示例中,我们定义了一个ExampleController,其中有一个GET请求的处理方法sayHello()。该方法使用@RequestParam注解来接收名为"name"的请求参数,并将其绑定到方法的name参数上。然后,它返回一个包含问候消息的字符串。

例如,如果我们向/example/hello?name=John发出GET请求,它将返回字符串"Hello, John!"作为响应。

这种方式可以方便地从请求中获取参数,并在方法内进行处理和使用。

6、@RequestBody

@RequestBody 注解用于将 HTTP 请求的请求体映射到方法的参数上。它可以用在 Spring MVC 和 Spring Boot 中的控制器方法中。

使用 @RequestBody 注解时,Spring 框架会自动将请求体中的数据转换成方法参数所需的对象类型,并将其传递给方法。

下面是一些常见的 @RequestBody 注解属性:

1、required: 指定是否必须提供请求体,默认值为 true。如果设置为 true,而实际请求中没有包含请求体,则会返回 400 BAD REQUEST 响应。如果设置为 false,而实际请求中没有包含请求体,则方法参数将被设置为 null

2、value / name: 指定请求体的名称,例如:@RequestBody("data") 或 @RequestBody(name = "data")

3、defaultValue: 指定当请求体为空时的默认值,例如:@RequestBody(defaultValue = "default")

以下是一个简单的示例代码,演示了如何使用 @RequestBody 注解:

@RestController
public class UserController {

    @PostMapping("/users")
    public ResponseEntity<String> createUser(@RequestBody User user) {
        // 处理接收到的用户数据
        // ...

        return ResponseEntity.ok("User created successfully");
    }
}

public class User {
    private String username;
    private String password;

    // 构造函数、getter 和 setter 方法省略
}

在上述示例中,createUser 方法使用了 @PostMapping 注解表示它处理 POST 请求,并使用 @RequestBody 注解将请求体映射到 User 对象上。当请求到达 /users 路径时,Spring 框架会自动解析请求体,并将其转换为 User 对象,然后传递给 createUser 方法进行处理。

请注意,要使 @RequestBody 注解正常工作,需要确保在 Spring 配置文件中配置了正确的消息转换器(例如:MappingJackson2HttpMessageConverter)以支持请求体数据的转换。

7、@ResponseBody

@ResponseBody注解用于将方法的返回值直接作为HTTP响应体返回给客户端,而不是将其解析为视图页面。它可以用在控制器的方法上。

该注解的属性有以下几种:

1、value:指定要返回的媒体类型,如application/jsonapplication/xml等。默认情况下,根据请求的Accept头来确定响应的媒体类型。

2、produces:与value属性类似,用于指定要返回的媒体类型,但可以通过多个值进行选择。例如:produces = {"application/json", "application/xml"}

3、headers:指定响应的头信息。

下面是一个使用@ResponseBody注解的示例代码:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    
    @GetMapping("/hello")
    @ResponseBody
    public String sayHello() {
        return "Hello, world!";
    }
}

在上述代码中,@RestController注解表示这是一个REST风格的控制器,@GetMapping注解指定了处理GET请求的路径为"/hello"。@ResponseBody注解使得sayHello()方法的返回值直接作为响应体返回给客户端。

当客户端访问/hello路径时,将会得到一个包含字符串"Hello, world!"的响应体。

8、@Autowired

@Autowired注解是Spring框架提供的一个注解,用于自动装配(自动注入)Bean。它可以应用在构造方法、属性或者Setter方法上。

使用@Autowired注解,能够避免手动编写繁琐的依赖注入代码,让Spring容器自动根据类型进行依赖的注入。当使用@Autowired注解时,Spring会扫描容器中已经注册的Bean,并通过类型匹配来自动装配相关的依赖。

@Autowired注解有以下几个常用的属性:

1、required:该属性用于指定被注入的依赖是否是必须的,默认值为true。如果找不到匹配的Bean时,当required=true时,会抛出NoSuchBeanDefinitionException异常;当required=false时,会将属性设置为null。

2、qualifier:当存在多个符合依赖类型的Bean时,可以使用该属性指定需要注入的具体Bean的名称。使用@Qualifier("beanName")来指定Bean的名称。

3、value:该属性与qualifier属性功能相同,可以用来指定Bean的名称。

下面是一个简单的示例代码,演示了如何使用@Autowired注解进行依赖注入:

@Component
public class MyComponent {

    private AnotherComponent anotherComponent;

    @Autowired
    public MyComponent(AnotherComponent anotherComponent) {
        this.anotherComponent = anotherComponent;
    }

    // 省略其他方法

}

在上述代码中,MyComponent类通过构造方法注入AnotherComponent类的实例。使用@Autowired注解标记了构造方法,Spring会自动在容器中查找匹配的AnotherComponent类型的Bean,并将其注入到MyComponent的构造方法中。

需要注意的是,为了让Spring能够扫描和管理这些带有@Autowired注解的类,我们需要在配置文件中配置@ComponentScan注解,指定要扫描的包路径:

@Configuration
@ComponentScan("com.example")
public class AppConfig {
    // 配置其他Bean
}

以上就是@Autowired注解的用处、属性以及一个简单的示例代码。 

9、@Component

@Component 是 Spring 框架中最常见的注解之一。它用于将一个普通的 Java 类标识为 Spring 组件,使其能够被 Spring IoC(依赖注入)容器所管理。通过 @Component 注解,Spring 会自动扫描和加载这些组件,并创建它们的实例。

@Component 注解有几个属性可用于进一步配置组件:

1、value:指定组件的名称。如果没有显式指定,默认情况下将使用类名首字母小写的形式作为组件的名称。

2、scope:指定组件的作用域。默认值是单例模式(Singleton),在整个应用程序生命周期内只创建一个实例。其他可用的选项包括原型模式(Prototype),每次请求都会创建一个新实例;会话模式(Session),在同一会话期间只创建一个实例;请求模式(Request),在每次请求中创建一个新实例。

3、autowire:指定自动装配模式。默认情况下,Spring 不会自动装配该组件的依赖关系。可用的选项包括 byName、byType、constructor 和 no。其中,byName 会根据属性名称进行自动装配,byType 则会根据属性类型进行自动装配。

4、initMethod:指定在创建组件实例后要调用的初始化方法。可以是组件内的任何公共无参方法。

5、destroyMethod:指定在销毁组件实例前要调用的方法。可以是组件内的任何公共无参方法。

下面是一个使用 @Component 注解的示例代码:

import org.springframework.stereotype.Component;

@Component
public class UserService {
    // 类的具体实现...
}

在上述示例中,UserService 类被标记为一个 Spring 组件,并将其作为一个可管理的 bean 注册到 Spring IoC 容器中。可以通过其他注解如 @Autowired@Resource 在其他组件中引用和使用此组件。 

10、@Configuration

@Configuration注解是Spring框架中的一个注解,用于标识一个类作为配置类。配置类通常用于定义和配置Spring应用程序中的Bean。

配置类是Spring Boot应用程序的关键组成部分之一,其目的是通过Java代码而不是XML文件来配置和管理应用程序的Bean。使用@Configuration注解标记的类可以包含一个或多个方法,这些方法在运行时将被Spring容器调用以创建Bean实例。

以下是@Configuration注解的一些常见属性:

1、proxyBeanMethods默认为true。该属性控制是否启用基于CGLIB的代理模式来保证依赖注入的工作。当为true时,Spring容器将生成代理对象来处理对Bean方法的调用。当为false时,Spring容器将返回原始的配置类实例,而不是代理对象。

2、value为配置类提供一个可选的名称。

下面是一个使用@Configuration注解的简单示例:

@Configuration
public class AppConfig {
  
  @Bean
  public UserServiceImpl userService() {
    return new UserServiceImpl();
  }
  
  @Bean
  public UserDAO userDAO() {
    return new UserDAOImpl();
  }
}

在上面的示例中,AppConfig类使用@Configuration注解进行标注,表明它是一个配置类。该类内部包含了两个带有@Bean注解的方法,这些方法负责创建和配置应用程序中的Bean。在运行时,Spring容器将根据这些方法的定义创建并管理相应的Bean实例。

正如上述代码所示,@Configuration注解的使用可以使我们通过Java代码轻松地配置和管理应用程序中的Bean,而无需显式地编写XML文件。

二、结尾

学习这些注解可以帮助你更轻松地开发基于Spring Boot的Web应用程序,处理HTTP请求和响应,进行依赖注入,以及创建可扩展的组件和配置。

08-31 16:40