Маленький пример использования вручную написанного аннотации @Transactional
Полностью аннотированная реализация, без использования XML файлов Вставка данных с помощью JdbcTemplate #### Понимание вручную написанной аннотации транзакции
- Определение аннотации транзакции
- Упаковка ручной транзакции
- Сканирование пакета - определение AOP для транзакций
- При перехвате метода, используя рефлексию, проверьте, добавлена ли аннотация транзакции к методу, если да, то откройте транзакцию ### 1. Определение аннотации транзакции
/**
* Вручную написанная аннотация транзакции:
* 1. Определение аннотации транзакции
*
``` * @Target указывает область применения аннотации: аннотация может быть использована для пакетов, типов (классы, интерфейсы, перечисления, аннотации), членов типов (методы, конструкторы, члены переменных, значения перечисления), параметров методов и локальных переменных (например, переменных цикла, параметров catch). Использование target в объявлении аннотации может сделать более ясным ее применение.
* 1. CONSTRUCTOR: для описания конструктора
* 2. FIELD: для описания поля
* 3. LOCAL_VARIABLE: для описания локальной переменной
* 4. METHOD: для описания метода
* 5. PACKAGE: для описания пакета
* 6. PARAMETER: для описания параметра
* 7. TYPE: для описания класса, интерфейса (включая аннотации) или enum
*
* @Retention
* Указывает уровень сохранения информации об аннотации, используется для описания жизненного цикла аннотации (то есть: в каком диапазоне действует описываемая аннотация)
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LpTransactional {
}
/**
* Вручную написанная аннотация транзакции:
* 2. Упаковка ручной транзакции
*/
@Component
@Scope("prototype") //множественные экземпляры, потокобезопасный
public class TransactionUtils {
private TransactionStatus transactionStatus;
// Получение менеджера транзакций
@Autowired
private DataSourceTransactionManager dataSourceTransactionManager;
// Открытие транзакции
public TransactionStatus begin() {
transactionStatus =
dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
} return transactionStatus;
}
// Подтверждение транзакции
```markdown
### 3. Пакетное сканирование и перехват с транзакциями
```java
/**
* Ручное определение транзакций:
* 3, пакетное сканирование — определение транзакционного пакетного сканирования AOP
* 4, перехват метода, используя рефлексию для проверки наличия транзакционного аннотирования, если есть, то начинаем транзакцию
*/
@Aspect
@Component
public class LpAopTransaction {
@Autowired
private TransactionUtils transactionUtils;
// Обработка исключений
@AfterThrowing("execution(* com.pliu.service.*.*(..))")
public void afterThrowing() {
System.out.println("---Откат транзакции---");
transactionUtils.rollback();
}
// Оборачивание метода, обработка до и после вызова метода
@Around("execution(* com.pliu.service.*.*(..))")
public void around(ProceedingJoinPoint pjp) throws Throwable {
TransactionStatus transactionStatus = begin(pjp);
// Вызов метода целевого объекта
pjp.proceed();
commit(transactionStatus);
}
/**
* Проверка статуса транзакции и подтверждение транзакции
* @param transactionStatus
*/
private void commit(TransactionStatus transactionStatus) {
if (transactionStatus != null) {
System.out.println("---Подтверждение транзакции---");
transactionUtils.commit(transactionStatus);
}
}
/**
* Проверка наличия аннотации @LpTransactional, если есть, то начинаем транзакцию
* @param pjp
* @return null или статус транзакции transactionStatus
* @throws NoSuchMethodException
*/
private TransactionStatus begin(ProceedingJoinPoint pjp) throws NoSuchMethodException {
// 1, получение метода целевого объекта
LpTransactional lpTransactional = getLpTransactional(pjp);
TransactionStatus transactionStatus = null;
if (lpTransactional != null) {
// 3, если есть, то начинаем транзакцию
System.out.println("---Начало транзакции---");
transactionStatus = transactionUtils.begin();
}
return transactionStatus;
}
/**
* Получение метода целевого объекта, проверка наличия аннотации @LpTransactional
* @param pjp
* @return null или объект LpTransactional
* @throws NoSuchMethodException
*/
}
``````markdown
---
## 4. Конфигурационные и тестовые классы
- Конфигурационный класс
```java
/**
* @Description: Объявление конфигурационного класса для транзакций
* Заметки: Шаги использования декларативных транзакций с использованием аннотаций:
* 1. Импортируйте необходимые зависимости (источник данных, драйвер базы данных, модуль Spring-jdbc).
* 2. Настройте источник данных и JdbcTemplate (инструмент, предоставленный Spring для упрощения работы с базами данных).
* 3. Отметьте метод аннотацией @Transactional, чтобы указать, что данный метод является транзакционным.
* 4. Включите управление транзакциями на основе аннотаций с помощью @EnableTransactionManagement.
* 5. Настройте менеджер транзакций для управления транзакциями.
* @Bean
* public PlatformTransactionManager/DataSourceTransactionManager transactionManager()
* Вышеуказанные 5 шагов.
*/
@EnableAspectJAutoProxy // Включение автоматической настройки AOP-прокси
@EnableTransactionManagement // Управление транзакциями на основе аннотаций
@ComponentScan({"com.pliu"}) // Путь к сканированию пакетов
@Configuration
public class TxConfig {
@Bean
```java
public DataSource dataSource() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// Replace data source with your own
dataSource.setUser("xxxx");
dataSource.setPassword("xxxxxxxx");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://47.98.216.253:3306/pliu?useUnicode=true&characterEncoding=UTF-8");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate() throws Exception {
// Spring has special handling for configuration classes @Configuration, does not recreate the data source object
return new JdbcTemplate(dataSource());
}
// Transaction manager registration
@Bean
## Тестовый класс
``````java
public class mainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TxConfig.class);
UserService userService = (UserService) applicationContext.getBean("userServiceImpl");
userService.add();
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )