@Autowired
用途:用于自动装配 bean,通过类型匹配来自动装配 Spring bean。
场景:常用于在 Spring 容器中自动装配依赖。
示例用法:
@Service
public class MyService {
@Autowired
private MyRepository repository;
// 使用 repository 对象进行操作
}
@Component
用途:用于指示一个类是 Spring 管理的组件。
场景:通常用于标记业务逻辑层、数据访问层等组件。
示例用法:
@Component
public class MyComponent {
// 类的实现
}
@Controller
用途:用于标记控制器类,处理 HTTP 请求并返回响应。
场景:用于标记 MVC 架构中的控制器。
示例用法:
@Controller
public class MyController {
// 控制器方法
}
@RestController
用途:结合了 @Controller 和 @ResponseBody,用于创建 RESTful Web 服务。
场景:常用于创建 RESTful 风格的控制器,直接返回 JSON 或 XML 格式的数据。
示例用法:
@RestController
public class MyRestController {
// 控制器方法
}
@Service
用途:用于标记服务层组件。
场景:常用于标记服务类,包含业务逻辑。
示例用法:
@Service
public class MyService {
// 服务方法
}
@Repository
用途:用于标记数据访问层组件。
场景:常用于标记 DAO(数据访问对象)或仓储类,用于与数据库交互。
示例用法:
@Repository
public class MyRepository {
// 数据访问方法
}
@Configuration
用途:用于标记配置类,替代 XML 配置文件。
场景:常用于定义 Spring Bean 的创建和装配方式。
示例用法:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
@Bean
用途:用于定义 Spring Bean。
场景:常用于配置类中定义 Bean 的创建方法。
示例用法:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
@Scope
用途:用于定义 Bean 的作用域。
场景:常用于在 @Bean 注解中指定 Bean 的作用域。
示例用法:
@Bean
@Scope("prototype")
public MyService myService() {
return new MyService();
}
作用域:
singleton: 默认的作用域,每个 Spring 容器中只存在一个实例。在整个应用程序中,所有对该 bean 的请求都会返回同一个实例。
prototype: 每次请求该 bean 时,Spring 容器都会创建一个新的实例。即每次调用
getBean()
方法都会返回一个新的实例。request: 每个 HTTP 请求都会创建一个新的 bean 实例,该实例仅在当前 HTTP 请求内有效。适用于 Web 应用程序。
session: 每个 HTTP session 都会创建一个新的 bean 实例,该实例仅在当前 HTTP session 内有效。同样适用于 Web 应用程序。
global session: 用于 portlet 环境,表示在全局 portlet session 中存在一个 bean 实例。
@Value
用途:用于将属性值注入到 Bean 中。
场景:常用于从外部配置文件或环境变量中注入值。
示例用法:
@Value("${my.property}")
private String myProperty;
@Qualifier
用途:用于指定注入的 Bean 的限定符。
场景:当多个 Bean 满足自动装配条件时,可以结合 @Autowired 使用以指定特定的 Bean。
示例用法:
@Autowired
@Qualifier("myBean")
private MyBean bean;
@Lazy
用途:用于延迟加载 Bean。
场景:常用于在需要时才加载的情况下优化性能。
示例用法:
@Bean
@Lazy
public MyService myService() {
return new MyService();
}
@Primary
用途:用于标记首选的 Bean。
场景:当存在多个候选 Bean 时,首选 @Primary 标记的 Bean。
示例用法:
@Bean
@Primary
public MyService primaryService() {
return new MyService();
}
@Conditional
用途:根据指定条件决定是否创建 Bean。
场景:常用于根据环境或配置动态选择创建哪些 Bean。
示例用法:
@Bean
@Conditional(MyCondition.class)
public MyService myService() {
return new MyService();
}
补充:
通过 @Conditional
注解,可以根据应用程序的运行环境、配置信息或者其他条件来动态地控制 bean 的创建或者配置。这样可以根据不同的条件,灵活地选择性地加载不同的 bean 或者配置,从而实现更加灵活和可定制的应用程序。
使用 @Conditional
注解时,需要指定一个实现了 Condition
接口的条件类。Condition
接口定义了一个 matches()
方法,该方法返回一个布尔值,表示是否满足特定的条件。当 matches()
方法返回 true
时,对应的 bean 或者配置会被创建或者生效;当 matches()
方法返回 false
时,则不会创建该 bean 或者生效该配置。
@PostConstruct
用途:在 Bean 初始化之后执行指定方法。
场景:常用于执行一些初始化操作。
示例用法:
@PostConstruct
public void init() {
// 执行初始化操作
}
@PreDestroy
用途:在 Bean 销毁之前执行指定方法。
场景:常用于执行一些清理操作。
示例用法:
@PreDestroy
public void cleanup() {
// 执行清理操作
}
@RequestBody
用途:将 HTTP 请求的 body 部分绑定到方法的参数上。
场景:常用于接收 JSON 或 XML 格式的请求数据。
示例用法:
@PostMapping("/save")
public void saveData(@RequestBody MyData data) {
// 处理接收到的数据
}
@ResponseBody
用途:将方法的返回值直接作为 HTTP 响应的 body 部分返回给客户端。
场景:常用于返回 JSON 或 XML 格式的数据。
示例用法:
@GetMapping("/data")
@ResponseBody
public MyData getData() {
// 返回数据给客户端
return new MyData();
}
@PathVariable
用途:将 URI 模板变量绑定到方法的参数上。
场景:常用于从 URI 中获取参数值。
示例用法:
@GetMapping("/users/{id}")
public void getUserById(@PathVariable Long id) {
// 根据用户ID获取用户信息
}
@ModelAttribute
用途:将请求参数绑定到方法的参数上,并将该参数添加到模型中。
场景:常用于在控制器方法中获取请求参数并在视图中使用。
示例用法:
@GetMapping("/user")
public String getUser(@ModelAttribute("user") User user) {
// 处理用户对象
return "userPage";
}
@Transactional
用途:指定事务管理,用于在方法或类级别上标记事务边界。
场景:常用于管理数据库事务。
示例用法:
@Transactional
public void saveData(Data data) {
// 执行数据库操作
}
补充:
@Transactional
注解提供了一些属性,可以用来定制事务的行为,例如:
readOnly
:指定事务是否为只读,默认为false
。propagation
:指定事务的传播行为,默认为REQUIRED
。isolation
:指定事务的隔离级别,默认为DEFAULT
。timeout
:指定事务的超时时间,默认为-1
,表示没有超时限制。
Spring 提供了多种事务传播行为,通过 Propagation
枚举来表示。以下是常用的事务传播行为:
REQUIRED(默认行为):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是最常用的传播行为。
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW:每次都创建一个新的事务,并且挂起当前事务(如果存在)。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将其挂起。
NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新事务。嵌套事务是外部事务的一部分,它有独立的提交和回滚,但如果外部事务回滚,则嵌套事务也会回滚。
在 Spring 中,可以使用 @Transactional
注解的 isolation
属性来指定事务的隔离级别:
READ_UNCOMMITTED(读未提交):允许一个事务读取另一个事务未提交的数据。这是最低的隔离级别,它可以导致脏读、不可重复读和幻读。
READ_COMMITTED(读已提交)默认:保证一个事务只能读取到已提交的数据。这可以避免脏读,但仍可能发生不可重复读和幻读。
REPEATABLE_READ(可重复读):保证在同一个事务中多次读取同一数据时,其结果是一致的。这可以避免脏读和不可重复读,但仍可能发生幻读。
SERIALIZABLE(串行化):最高的隔离级别,它通过强制事务串行执行来避免脏读、不可重复读和幻读。虽然可以确保数据的完全一致性,但并发性能开销最高。
@ExceptionHandler
用途:定义处理特定异常的方法,常用于全局异常处理或在特定控制器中处理异常。
场景:用于捕获和处理异常。
示例用法:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex) {
// 处理异常并返回自定义错误响应
}
}
@Scheduled
用途:指定定时任务的执行策略。
场景:常用于执行定时任务。
示例用法:
@Scheduled(fixedRate = 5000)
public void executeTask() {
// 定时执行的任务
}
@Async
用途:将方法标记为异步执行。
场景:常用于需要异步执行的方法,例如发送邮件、处理长时间任务等。
示例用法:
@Async
public CompletableFuture<String> asyncMethod() {
// 异步执行的任务
}
@EnableScheduling
用途:启用 Spring 的计划任务支持。
场景:当需要使用 @Scheduled 注解时,需要在配置类上标记此注解。
示例用法:
@Configuration
@EnableScheduling
public class AppConfig {
// 配置类的其他内容
}
@EnableAsync
用途:启用 Spring 的异步方法支持。
场景:当需要使用 @Async 注解时,需要在配置类上标记此注解。
示例用法:
@Configuration
@EnableAsync
public class AppConfig {
// 配置类的其他内容
}
@EnableTransactionManagement
用途:启用 Spring 的注解驱动的事务管理。
场景:当需要使用 @Transactional 注解时,需要在配置类上标记此注解。
示例用法:
@Configuration
@EnableTransactionManagement
public class AppConfig {
// 配置类的其他内容
}
@RequestHeader
用途:将 HTTP 请求头信息绑定到方法的参数上。
场景:常用于获取特定的请求头信息。
示例用法:
@GetMapping("/header")
public void processHeader(@RequestHeader("User-Agent") String userAgent) {
// 处理请求头信息
}
@RequestParam
用途:将 HTTP 请求参数绑定到方法的参数上。
场景:常用于获取 GET 或 POST 请求的参数值。
示例用法:
@GetMapping("/param")
public void processParam(@RequestParam("id") Long id) {
// 处理请求参数
}
@Valid
用途:启用方法参数的验证。
场景:常用于在控制器中验证请求参数或对象。
示例用法:
@PostMapping("/save")
public void saveData(@Valid @RequestBody MyData data) {
// 处理验证通过的数据
}
@ModelAttribute
用途:将方法的返回值添加到模型中,使其在视图中可用。
场景:常用于在控制器中向视图传递数据。
示例用法:
@ModelAttribute("user")
public User getUser() {
return userService.getUserById(userId);
}
@ControllerAdvice
用途:用于定义全局控制器通知。
场景:通常与 @ExceptionHandler 结合使用,统一处理多个控制器中的异常。
示例用法:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception ex) {
// 处理异常并返回适当的响应
}
}
@InitBinder
用途:用于初始化 Web 数据绑定器。
场景:常用于注册自定义的数据绑定器,例如日期格式化器。
示例用法:
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
@Profile
用途:指定 Bean 在特定的 Spring 环境下才会被注册到容器中。
场景:常用于根据环境的不同注册不同的 Bean。
示例用法:
@Configuration
@Profile("dev")
public class DevDataSourceConfig {
// 配置开发环境的数据源
}
@Cacheable
用途:声明可缓存的方法。
场景:常用于提升系统的性能,减少重复计算。
示例用法:
@Cacheable("users")
public User getUserById(Long id) {
// 从数据库中获取用户信息
}
@CacheEvict
用途:声明在方法执行成功后清除缓存。
场景:常用于更新或删除数据后清除相应的缓存。
示例用法:
@CacheEvict(value = "users", key = "#id")
public void deleteUserById(Long id) {
// 删除用户信息
}
@CachePut
用途:声明在方法执行后将结果存入缓存。
场景:常用于新增或更新数据后更新缓存。
示例用法:
@CachePut(value = "users", key = "#user.id")
public User saveUser(User user) {
// 保存用户信息
return user;
}
@Retryable
用途:声明可重试的方法。
场景:常用于处理一些临时性的失败,如网络超时或资源不足。
示例用法:
@Retryable(value = {IOException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))
public void fetchData() {
// 获取数据
}
@EventListener
用途:声明事件监听器。
场景:常用于处理应用内部的事件,如用户登录或订单完成。
示例用法:
@EventListener
public void handleUserLoggedInEvent(UserLoggedInEvent event) {
// 处理用户登录事件
}
@PropertySource
用途:指定外部配置文件的位置。
场景:常用于加载自定义的配置文件。
示例用法:
@Configuration
@PropertySource("classpath:config.properties")
public class AppConfig {
// 配置类的定义
}
评论区