此注解是 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 自动配置了合适的事务管理器。
此注解是 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 实现。
此注解是是 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 注解。
此注解是 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。这两个属性的值将会从配置文件中进行绑定。