Spring常用注解详解(三)

发布时间:2023年12月27日

1、@Transactional:

此注解是 Spring Framework 中用于声明事务性方法的注解。当一个方法被标注为 @Transactional 时,Spring 将为该方法开启一个事务,并在方法执行完成后提交事务,或在方法执行过程中发生异常时回滚事务。

基本用法:

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    @Transactional
    public void performTransactionalOperation() {
        // 执行数据库操作,例如插入、更新、删除等
        myRepository.saveData();
    }
}

在上述例子中,performTransactionalOperation 方法被标注为 @Transactional,表示该方法应该在事务中执行。如果方法执行成功,事务将被提交;如果方法执行过程中发生异常,事务将被回滚。

常用属性:

readOnly: 指定事务是否为只读事务,默认值为 false。如果设置为 true,表示该事务只读取数据而不修改数据,可以优化事务处理。
@Transactional(readOnly = true)
public void performReadOnlyTransaction() {
    // 只读事务
}

timeout: 指定事务的超时时间(以秒为单位)。如果事务执行时间超过指定的时间,将被强制回滚。默认值为 -1,表示不设置超时。

@Transactional(timeout = 30)
public void performTransactionWithTimeout() {
    // 事务超时时间为30秒
}

rollbackFor 和 noRollbackFor: 分别指定在哪些异常情况下回滚事务,或者不回滚事务。

@Transactional(rollbackFor = {SQLException.class, MyCustomException.class})
public void performTransactionWithRollbackFor() {
    // 当发生SQLException或MyCustomException异常时回滚事务
}

@Transactional(noRollbackFor = MyNonCriticalException.class)
public void performTransactionWithNoRollbackFor() {
    // 当发生MyNonCriticalException异常时不回滚事务
}

propagation: 指定事务的传播行为,默认值为 Propagation.REQUIRED。常用的传播行为包括 REQUIRED、REQUIRES_NEW、NESTED 等。

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void performTransactionWithNewPropagation() {
    // 使用新的事务
}

注意事项:

@Transactional 注解可以用在类级别或方法级别上。当用在类级别上时,表示该类的所有方法都将受到事务管理。

在 Spring 中,事务是通过 AOP(面向切面编程)实现的,因此 @Transactional 注解实际上是一个标记了事务边界的切面。

如果在方法内部调用另一个标注了 @Transactional 的方法,事务仍然会生效。这是因为 Spring 默认会检查事务的传播行为,确保内部方法调用也处于事务中。

在 Spring Boot 中,通常不需要显式配置事务管理器,因为 Spring Boot 自动配置了合适的事务管理器。

2、@Async:

此注解是 Spring Framework 中用于声明异步方法的注解。通过将 @Async 注解标记在方法上,Spring 将会在调用该方法时,启动一个新的线程来执行方法体,从而实现异步执行。

基本用法:

@Service
public class MyService {

    @Async
    public void performAsyncOperation() {
        // 异步执行的方法体
    }
}

在上述例子中,performAsyncOperation 方法被标注为 @Async,表示该方法应该在一个独立的线程中异步执行。

需要配置:

在配置类上添加 @EnableAsync 注解,启用 Spring 的异步执行功能。
@Configuration
@EnableAsync
public class AppConfig {
    // 配置其他Bean或其他异步相关配置
}
在异步方法所在的类上,确保该类被 Spring 管理,即添加 @Service、@Component 等注解。

异步方法的返回值:

异步方法的返回值类型通常是 void,因为调用者无法直接获取异步方法的返回结果。如果需要获取异步方法的返回结果,可以通过其他手段,例如回调函数、Future 对象等。

@Service
public class MyService {

    @Async
    public Future<String> performAsyncOperationWithResult() {
        // 异步执行的方法体
        // 返回一个Future对象,可以在调用方获取异步方法的执行结果
        return new AsyncResult<>("Async operation completed");
    }
}

在上述例子中,performAsyncOperationWithResult 方法返回了一个 Future 对象,调用者可以通过这个对象获取异步方法的执行结果。

注意事项:

@Async 注解通常用在 @Service、@Component 类中的方法上,以实现异步的业务逻辑。

异步方法通常被设计为无返回值(返回 void),如果需要返回结果,可以使用 Future 或 CompletableFuture。

在使用 @Async 时,确保在配置类上添加 @EnableAsync 注解,以启用异步功能。

异步方法通常不适用于需要获取 HTTP 请求/响应上下文(如 HttpServletRequest、HttpServletResponse)的情况,因为异步线程可能无法访问到这些上下文。

Spring 异步机制基于线程池实现,默认使用 SimpleAsyncTaskExecutor,也可以通过配置文件指定其他的 TaskExecutor 实现。

3、@Scheduled:

此注解是是 Spring Framework 中用于声明定时任务的注解。通过将 @Scheduled 注解标记在方法上,Spring 将会定期执行该方法,从而实现定时任务的功能。

基本用法:

@Service
public class MyScheduledService {

    @Scheduled(fixedRate = 5000) // 每隔5秒执行一次
    public void performScheduledTask() {
        // 定时任务的方法体
    }
}

在上述例子中,performScheduledTask 方法被标注为 @Scheduled(fixedRate = 5000),表示该方法将每隔 5 秒执行一次。

常用属性:

fixedRate: 指定两次任务执行的时间间隔(以毫秒为单位),在上一次任务开始后计时。例如,@Scheduled(fixedRate = 5000) 表示每隔 5 秒执行一次任务。

fixedDelay: 指定两次任务执行的时间间隔(以毫秒为单位),在上一次任务结束后计时。例如,@Scheduled(fixedDelay = 5000) 表示上一次任务结束后,等待 5 秒后再次执行任务。

initialDelay: 指定首次任务执行的延迟时间(以毫秒为单位)。例如,@Scheduled(initialDelay = 10000, fixedRate = 5000) 表示首次任务执行将在 10 秒后,之后每隔 5 秒执行一次。

cron: 使用 Cron 表达式定义定时规则。例如,@Scheduled(cron = "0 0 12 * * ?") 表示每天中午 12 点触发任务。

需要配置:

在配置类上添加 @EnableScheduling 注解,以启用 Spring 的定时任务功能。

@Configuration
@EnableScheduling
public class AppConfig {
    // 其他配置
}

注意事项:

定时任务的方法必须是无参的,且返回值类型为 void。

在使用 @Scheduled 时,确保在配置类上添加 @EnableScheduling 注解,以启用定时任务功能。

定时任务方法的执行时间应尽量短,避免长时间占用线程。

定时任务的触发时间不是精确的,可能会受到任务执行时间的影响,特别是在任务执行时间较长或发生异常时。

如果定时任务需要访问 Spring 托管的 Bean,确保它们被注入正确,可以使用 @Autowired 注解。

4、@ConfigurationProperties:

此注解是 Spring Boot 中用于绑定属性到 Java 类的注解。通过在 Java 类上使用 @ConfigurationProperties 注解,可以将配置文件中的属性值绑定到这个类的字段上,从而方便地在应用中使用这些配置。

基本用法:

@Configuration
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {

    private String name;
    private int version;

    // getters and setters

    @Override
    public String toString() {
        return "MyAppProperties{" +
                "name='" + name + '\'' +
                ", version=" + version +
                '}';
    }
}

在上述例子中,MyAppProperties 类被标注为 @Configuration 和 @ConfigurationProperties(prefix = “myapp”)。这表示该类的属性将会与以 “myapp” 开头的配置属性绑定。

在application.properties或application.yml中配置属性:

properties文件:
# application.properties
myapp.name=MyApp
myapp.version=2

yaml文件:
# application.yml
myapp:
  name: MyApp
  version: 2

在应用中使用配置类:

@Service
public class MyService {

    @Autowired
    private MyAppProperties myAppProperties;

    public void printConfig() {
        System.out.println(myAppProperties);
    }
}

在上述例子中,MyService 类中使用了 @Autowired 注解将 MyAppProperties 注入进来,并在 printConfig 方法中打印了配置属性。

注意事项:

使用 @ConfigurationProperties 时,需要确保在配置类上标注 @Configuration 注解。

需要提供相应的 getter 和 setter 方法,以便属性绑定正常工作。

属性的前缀是可选的,如果不指定 prefix 属性,那么类的所有字段都将与配置文件中的属性进行绑定。

使用 @Value 注解也可以实现属性注入,但 @ConfigurationProperties 更适用于一组相关属性的注入。

支持各种数据类型,包括基本数据类型、集合、嵌套属性等。
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {

    private List<String> servers;
    private Map<String, String> additionalProperties;

    // getters and setters

    @Override
    public String toString() {
        return "MyAppProperties{" +
                "servers=" + servers +
                ", additionalProperties=" + additionalProperties +
                '}';
    }
}
properties文件:

# application.properties
myapp.servers[0]=server1
myapp.servers[1]=server2

myapp.additionalProperties.key1=value1
myapp.additionalProperties.key2=value2
@Service
public class MyService {

    @Autowired
    private MyAppProperties myAppProperties;

    public void printConfig() {
        System.out.println(myAppProperties);
    }
}

在这个例子中,MyAppProperties 类中包含了一个 List 类型的属性 servers 和一个 Map 类型的属性 additionalProperties。这两个属性的值将会从配置文件中进行绑定。

文章来源:https://blog.csdn.net/qq_44444470/article/details/134467379
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。