侧边栏壁纸
博主头像
Shawe`Blog博主等级

正确的思维是创造一切的前提。

  • 累计撰写 33 篇文章
  • 累计创建 4 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Spring之常用注解

@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();
}
  • 作用域:

  1. singleton: 默认的作用域,每个 Spring 容器中只存在一个实例。在整个应用程序中,所有对该 bean 的请求都会返回同一个实例。

  2. prototype: 每次请求该 bean 时,Spring 容器都会创建一个新的实例。即每次调用 getBean() 方法都会返回一个新的实例。

  3. request: 每个 HTTP 请求都会创建一个新的 bean 实例,该实例仅在当前 HTTP 请求内有效。适用于 Web 应用程序。

  4. session: 每个 HTTP session 都会创建一个新的 bean 实例,该实例仅在当前 HTTP session 内有效。同样适用于 Web 应用程序。

  5. 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 {
    // 配置类的定义
}

0

评论区