Транзакционный менеджмент с помощью AOP
Транзакционный менеджмент — это одна из ключевых функций, где AOP в Spring используется наиболее активно. С помощью AOP можно автоматически управлять транзакциями, устраняя необходимость вручную начинать, коммитить или откатывать транзакции в бизнес-логике.
1. Транзакционный менеджмент: Основы
Транзакция — это единица работы, которая либо выполняется полностью, либо откатывается при возникновении ошибки. Примером транзакции может быть:
Добавление пользователя в базу данных.
Перевод денег между счетами.
Роль AOP в транзакционном менеджменте
Spring AOP позволяет автоматически обрабатывать транзакции:
Начинать транзакцию перед выполнением метода.
Фиксировать транзакцию после успешного выполнения.
Откатывать транзакцию при возникновении исключения.
Аннотация @Transactional
В Spring для работы с транзакциями используется аннотация @Transactional.
2. Пример использования транзакционного менеджмента
Шаг 1: Добавление зависимостей
Добавьте в pom.xml зависимости для Spring Data JPA и базы данных:
Шаг 2: Настройка базы данных
Добавьте настройки H2 в application.properties:
Шаг 3: Бизнес-логика с транзакциями
Создайте сущность:
Репозиторий для работы с данными:
Сервис с транзакционным методом:
Шаг 4: Проверка
Создайте тестовый контроллер:
#Java #Training #Spring #AOP #AOP_Transaction
Транзакционный менеджмент — это одна из ключевых функций, где AOP в Spring используется наиболее активно. С помощью AOP можно автоматически управлять транзакциями, устраняя необходимость вручную начинать, коммитить или откатывать транзакции в бизнес-логике.
1. Транзакционный менеджмент: Основы
Транзакция — это единица работы, которая либо выполняется полностью, либо откатывается при возникновении ошибки. Примером транзакции может быть:
Добавление пользователя в базу данных.
Перевод денег между счетами.
Роль AOP в транзакционном менеджменте
Spring AOP позволяет автоматически обрабатывать транзакции:
Начинать транзакцию перед выполнением метода.
Фиксировать транзакцию после успешного выполнения.
Откатывать транзакцию при возникновении исключения.
Аннотация @Transactional
В Spring для работы с транзакциями используется аннотация @Transactional.
2. Пример использования транзакционного менеджмента
Шаг 1: Добавление зависимостей
Добавьте в pom.xml зависимости для Spring Data JPA и базы данных:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Шаг 2: Настройка базы данных
Добавьте настройки H2 в application.properties:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
Шаг 3: Бизнес-логика с транзакциями
Создайте сущность:
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private double balance;
// Getters and Setters
}
Репозиторий для работы с данными:
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {}
Сервис с транзакционным методом:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Transactional
public void transferMoney(Long fromUserId, Long toUserId, double amount) {
User fromUser = userRepository.findById(fromUserId)
.orElseThrow(() -> new RuntimeException("User not found"));
User toUser = userRepository.findById(toUserId)
.orElseThrow(() -> new RuntimeException("User not found"));
fromUser.setBalance(fromUser.getBalance() - amount);
toUser.setBalance(toUser.getBalance() + amount);
userRepository.save(fromUser);
userRepository.save(toUser);
if (amount > 1000) {
throw new RuntimeException("Transfer limit exceeded!");
}
}
}
Шаг 4: Проверка
Создайте тестовый контроллер:
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping("/transfer")
public void transferMoney(@RequestParam Long fromUserId, @RequestParam Long toUserId, @RequestParam double amount) {
userService.transferMoney(fromUserId, toUserId, amount);
}
}
Теперь, если перевести более 1000 единиц, метод выбросит исключение, а все изменения в базе данных будут откатаны.
#Java #Training #Spring #AOP #AOP_Transaction
👍2
Все аннотации AOP и их использование
1. @Aspect
Обозначает класс как аспект.
2. @Pointcut
Определяет срез, на который будет ссылаться Advice.
3. @Before
Совет, выполняющийся перед методом.
4. @After
Совет, выполняющийся после метода, независимо от его результата.
5. @AfterReturning
Совет, выполняющийся после успешного выполнения метода.
6. @AfterThrowing
Совет, выполняющийся при выбросе исключения.
7. @Around
Оборачивает метод, позволяя контролировать его выполнение.
8. @EnableAspectJAutoProxy
Включает поддержку AOP в приложении.
#Java #Training #Spring #AOP #AOP_Annotations
1. @Aspect
Обозначает класс как аспект.
@Aspect
@Component
public class LoggingAspect {
// Pointcut и Advice
}
2. @Pointcut
Определяет срез, на который будет ссылаться Advice.
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}
3. @Before
Совет, выполняющийся перед методом.
@Before("serviceLayer()")
public void logBefore() {
System.out.println("Before method");
}
4. @After
Совет, выполняющийся после метода, независимо от его результата.
@After("serviceLayer()")
public void logAfter() {
System.out.println("After method");
}
5. @AfterReturning
Совет, выполняющийся после успешного выполнения метода.
@AfterReturning(pointcut = "serviceLayer()", returning = "result")
public void logAfterReturning(Object result) {
System.out.println("Method returned: " + result);
}
6. @AfterThrowing
Совет, выполняющийся при выбросе исключения.
@AfterThrowing(pointcut = "serviceLayer()", throwing = "ex")
public void logAfterThrowing(Exception ex) {
System.out.println("Exception thrown: " + ex.getMessage());
}
7. @Around
Оборачивает метод, позволяя контролировать его выполнение.
@Around("serviceLayer()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Before method");
Object result = joinPoint.proceed();
System.out.println("After method");
return result;
}
8. @EnableAspectJAutoProxy
Включает поддержку AOP в приложении.
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {}
#Java #Training #Spring #AOP #AOP_Annotations
👍2