Spring常用注解
Spring框架中常用的注解主要包括依赖注入相关、组件声明、配置相关等。这些注解大大简化了Spring应用的开发和配置过程。
依赖注入相关
@Autowired
@Autowired
是 Spring 框架中最常用的注解之一,用于实现自动装配(autowiring)。它可以用于字段、构造函数、方法或者方法参数上,以指示 Spring 容器自动注入依赖。
当只有一个Bean匹配所需类型时,Spring会自动注入它。
如果没有匹配的Bean,或者有多个Bean符合条件,Spring容器会抛出异常。
使用场景
- 字段注入:java
@Service public class UserService { @Autowired private UserDao userDao; // 自动注入UserDao类型的Bean }
- 构造函数注入:java
@Service public class UserService { private UserDao userDao; @Autowired public UserService(UserDao userDao) { this.userDao = userDao; } }
- 方法注入:java
@Service public class UserService { private UserDao userDao; @Autowired public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
- 参数注入:java
@Service public class UserService { public void someMethod(@Autowired UserDao userDao) { // 使用注入的userDao } }
@Qualifier
@Qualifier
注解通常与 @Autowired
一起使用,用于指定注入哪个具体Bean。当存在多个相同类型的 Bean 时,仅使用 @Autowired
将无法区分具体注入哪一个 Bean。这时就需要用到 @Qualifier
注解来进一步指明具体的 Bean 名称。
@Qualifier
的值应该与某个Bean的ID相匹配,否则注入将失败。
使用场景
- 指定Bean名称:java
@Service public class UserService { @Autowired @Qualifier("userDaoImpl") private UserDao userDao; // 明确指定注入名为"userDaoImpl"的Bean }
- 与构造函数注入结合:java
@Service public class UserService { private UserDao userDao; @Autowired public UserService(@Qualifier("userDaoImpl") UserDao userDao) { this.userDao = userDao; } }
@Value
@Value
注解用于注入外部值,这些值可以是硬编码的字符串、系统属性、环境变量、属性文件中的属性等。
使用 ${}
来注入配置文件中的属性。
使用 #{}
来注入SpEL表达式,例如系统属性或者环境变量。
使用场景
- 注入普通字符串:java
@Service public class UserService { @Value("SomeStaticString") private String someValue; }
- 注入配置文件中的属性:java
@Service public class UserService { @Value("${app.name}") private String appName; }
- 注入系统属性:java
@Service public class UserService { @Value("#{systemProperties['os.name']}") private String osName; }
组件声明
@Component
@Component
是Spring框架中最基本的注解之一,用于标识一个类作为Spring容器的Bean。这意味着Spring会在运行时为这个类创建一个实例,并将其注册到容器中,使其能够被其他Bean注入或通过容器直接访问。
特点
- 适用于任何Spring管理的组件。
- 可以单独使用,也可以与其他特定用途的注解结合使用。
- 通常用于定义通用的Bean,不特定于某一层。
示例
@Component
public class UtilityService {
// 这里是类的实现
}
@Service
@Service
是一个用于业务逻辑层的注解,它实际上是@Component
的特化。使用@Service
注解可以更清晰地表明该类属于业务逻辑层。
特点
- 语义上表示业务逻辑。
- 可以被Spring容器识别并管理。
- 通常用于定义服务层的类。
示例
@Service
public class CustomerService {
// 实现客户相关的业务逻辑
}
@Repository
@Repository
注解用于标记数据访问层的组件,即DAO(Data Access Object)类。这个注解也暗示了这些类可能涉及到数据库操作。
特点
- 专门用于数据访问层。
- 可以触发Spring的数据访问异常转换。
- 帮助开发者明确类的作用域。
示例
@Repository
public class CustomerRepository {
// 实现访问数据库的方法
}
@Controller
@Controller
注解用于标记处理HTTP请求的控制器类。在Spring MVC应用程序中,这些类负责接收请求并将响应传递给视图。
特点
- 用于Web层的控制器。
- 通常与@RequestMapping注解结合使用来映射HTTP请求。
- 在Spring MVC中扮演核心角色。
示例
@Controller
public class CustomerController {
// 处理HTTP请求的方法
}
配置相关
@Configuration
@Configuration
是Spring中用于定义配置信息的注解。它允许开发者通过Java代码而不是传统的XML文件来配置Spring容器。配置类可以包含多个@Bean
注解的方法,这些方法负责创建和配置Spring容器中的Bean。
特点:
- 代替了传统的XML配置方式。
- 可以包含多个
@Bean
方法。 - 可以通过
@ComponentScan
注解来扫描其他带有@Component
注解的类。 - 可以通过
@Import
注解导入其他配置类。
示例:
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
@Bean
@Bean
注解用于配置类中的方法上,它指示Spring容器这个方法将返回一个Bean,并且这个Bean应该由Spring容器管理。
特点:
- 用于定义Bean的创建逻辑。
- 返回的Bean默认名称是方法名,可以通过
name
属性自定义。 - 可以通过
initMethod
和destroyMethod
属性指定初始化和销毁方法。
示例:
@Configuration
public class AppConfig {
@Bean(name = "customUserDao")
public UserDao userDao() {
return new UserDaoImpl();
}
}
@DependsOn
@DependsOn
注解用于表示一个Bean的创建依赖于其他一个或多个Bean。在Spring容器中,被依赖的Bean会在依赖它的Bean之前被初始化。
特点:
- 确保Bean的依赖顺序。
- 可以用于解决Bean之间的循环依赖问题。
- 可以指定多个依赖Bean,用逗号分隔。
示例:
查看代码
@Configuration
public class AppConfig {
@Bean
@DependsOn({"userService", "userDao"})
public UserComponent userComponent() {
return new UserComponent();
}
@Bean
public UserService userService() {
return new UserServiceImpl();
}
@Bean
public UserDao userDao() {
return new UserDaoImpl();
}
}
在上述示例中,UserComponent
Bean依赖于userService
和userDao
两个Bean,因此Spring容器会先初始化这两个Bean,然后再创建UserComponent
。
Web相关
@RequestMapping
@RequestMapping
是Spring MVC中的一个核心注解,用于将Web请求映射到控制器的处理方法上。它可以放置在类级别来表示一个控制器中的所有方法共享一个基础路径,也可以放置在方法级别来定义特定的请求路径。
特点
- 可以指定HTTP请求的方法类型,如GET、POST、PUT、DELETE等。
- 可以定义请求的URL路径。
- 可以通过
consumes
和produces
属性指定请求和响应的内容类型。
示例
@Controller
@RequestMapping("/users")
public class UserController {
@RequestMapping(method = RequestMethod.GET, path = "/list")
public String listUsers(Model model) {
// 处理逻辑
return "userList";
}
}
@GetMapping、@PostMapping 等
@GetMapping
、@PostMapping
等是 @RequestMapping
的具体化注解,它们分别对应HTTP的GET和POST方法。这些注解简化了常见的HTTP方法的映射,使得代码更加简洁。
特点
@GetMapping
映射GET请求。@PostMapping
映射POST请求。- 还有其他类似的注解,如
@PutMapping
、@DeleteMapping
等。
示例
查看代码
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/list")
public ResponseEntity<List<User>> getAllUsers() {
// 处理逻辑
return ResponseEntity.ok().body(userList);
}
@PostMapping("/create")
public ResponseEntity<User> createUser(@RequestBody User user) {
// 处理逻辑
return ResponseEntity.ok().body(createdUser);
}
}
@PathVariable
@PathVariable
注解用于将请求URL中的模板变量映射到功能处理方法的参数上。这通常用于RESTful风格的URL,其中URL的一部分代表资源标识符。
特点
- 用于提取URL路径中的变量。
- 变量名需要与URL模板中的变量名相匹配。
示例
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
// 处理逻辑
return ResponseEntity.ok().body(user);
}
}
@RequestParam
@RequestParam
注解用于将请求参数区数据映射到功能处理方法的参数上。这对于获取GET请求或POST请求中的查询参数非常有用。
特点
- 用于提取请求参数的值。
- 可以指定参数是否必需,默认为必需。
- 可以提供默认值。
示例
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/search")
public ResponseEntity<List<User>> searchUsers(@RequestParam String query) {
// 处理逻辑
return ResponseEntity.ok().body(userList);
}
}
@RequestBody
@RequestBody
注解用于将HTTP请求体中的数据绑定到控制器的方法参数上。这个注解通常与@PostMapping
或@PutMapping
一起使用,用于接收客户端发送的JSON或XML等格式的数据。
在Spring框架中,@RequestBody
注解默认使用的JSON转换器是MappingJackson2HttpMessageConverter
。这个转换器依赖于Jackson JSON处理库,它可以将HTTP请求体中的JSON数据自动转换为Java对象,反之亦然。
MappingJackson2HttpMessageConverter
是Spring MVC中HttpMessageConverter
接口的一个实现,用于处理application/json
媒体类型的请求和响应。当Spring MVC接收到一个带有application/json
内容类型的请求时,它会使用MappingJackson2HttpMessageConverter
来解析请求体中的JSON数据,并将其映射到控制器方法中带有@RequestBody
注解的参数上。
特点
- 用于读取和解析HTTP请求体。
- 通常与
@RestController
或@Controller
配合使用。 - 需要与相应的HTTP消息转换器(如
MappingJackson2HttpMessageConverter
)配合工作,以支持不同格式的请求体。
示例
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping("/create")
public ResponseEntity<User> createUser(@RequestBody User user) {
// 处理逻辑,比如保存用户
return ResponseEntity.ok().body(createdUser);
}
}
@ResponseBody
@ResponseBody
注解用于将控制器方法的返回值直接写入HTTP响应体中。这意味着返回值不会被视图解析器处理,而是直接作为响应发送给客户端。
特点
- 用于直接返回数据而不是视图名称。
- 通常与
@RestController
或@Controller
配合使用。 - 需要与相应的HTTP消息转换器配合工作,以支持不同格式的响应体。
示例
查看代码
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/get/{id}")
@ResponseBody
public User getUserById(@PathVariable Long id) {
// 处理逻辑,比如获取用户
return user;
}
}
@RestController
@RestController
注解是@Controller
和@ResponseBody
的组合注解。使用@RestController
注解的类,其所有方法都会默认使用@ResponseBody
注解。
特点
- 用于创建RESTful风格的控制器。
- 适用于返回数据而不是视图的Web服务。
- 简化了控制器类的编写,无需为每个方法单独添加
@ResponseBody
。
示例
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/list")
public List<User> getAllUsers() {
// 处理逻辑,比如获取用户列表
return userList;
}
}
@ControllerAdvice
@ControllerAdvice
注解用于创建全局的异常处理器。使用这个注解的类可以包含用于处理控制器方法抛出的异常的@ExceptionHandler
、@InitBinder
和@ModelAttribute
方法。
特点
- 用于集中处理异常,无需在每个控制器中重复相同的异常处理逻辑。
- 可以跨多个控制器共享异常处理逻辑。
- 可以通过指定
annotations
、basePackages
等属性来限定其作用范围。
示例
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
// 处理异常逻辑
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An error occurred: " + e.getMessage());
}
}
在上述示例中,GlobalExceptionHandler
类使用@ControllerAdvice
注解来定义一个全局的异常处理器,它会处理所有控制器中抛出的Exception
类型的异常。
注解区别
@Configuration
和@Component
的区别
@Configuration
和@Component
都是Spring框架中的注解,用于定义Spring管理的bean,但它们在使用和功能上有所不同:
用途和功能:
@Configuration
: 这个注解用于标记一个类作为配置类,该类可以包含多个@Bean
注解的方法,用于定义Spring容器中的bean。@Configuration
类可以包含对其他@Bean
方法的引用,以设置bean之间的依赖关系。它还支持诸如@ImportResource
、@PropertySource
等注解,用于引入其他配置资源。@Component
: 这个注解是一个通用的注解,用于标记一个类作为Spring容器中的组件。任何被@Component
注解的类都会被Spring容器识别并作为一个bean进行管理。@Component
通常用于定义业务逻辑组件,如服务、存储库或控制器。
配置和依赖管理:
- 使用
@Configuration
,你可以通过调用同一配置类中的其他@Bean
方法来显式地设置bean之间的依赖关系。 - 使用
@Component
,通常不会显式地定义依赖关系,而是通过自动装配(@Autowired
)来注入依赖。
内部结构:
@Configuration
类在运行时会被CGLIB代理,这样Spring就可以在调用配置类中的@Bean
方法时应用额外的处理,例如处理循环依赖。@Component
类不会被CGLIB代理,除非它们也用@Transactional
或其他需要代理的注解标记。
元注解:
@Configuration
实际上是一个@Component
,这意味着任何被@Configuration
标记的类也会自动被识别为一个Spring组件。@Configuration
是@Component
的特化。