1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hellopliu-transactionalDemo

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

transactionalDemo

Введение

Маленький пример использования вручную написанного аннотации @Transactional

Архитектура программного обеспечения

Полностью аннотированная реализация, без использования XML файлов Вставка данных с помощью JdbcTemplate #### Понимание вручную написанной аннотации транзакции

  1. Определение аннотации транзакции
  2. Упаковка ручной транзакции
  3. Сканирование пакета - определение AOP для транзакций
  4. При перехвате метода, используя рефлексию, проверьте, добавлена ли аннотация транзакции к методу, если да, то откройте транзакцию #### Инструкции по установке
  5. Перед запуском метода main в mainTest.java, обязательно измените информацию о источнике данных в TxConfig.java
  6. t_users.sql содержит структуру тестовой таблицы, база данных MySQL
  7. Запустите mainTest ### Понимание вручную написанной аннотации транзакции:
  1. Определение аннотации транзакции
  2. Упаковка ручной транзакции
  3. Сканирование пакета - определение AOP для транзакций
  4. При перехвате метода, используя рефлексию, проверьте, добавлена ли аннотация транзакции к методу, если да, то откройте транзакцию ### 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. Упаковка ручной транзакции

/**
* Вручную написанная аннотация транзакции:
*  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 )

Вы можете оставить комментарий после Вход в систему

Введение

Пример использования аннотации `@Transactional` для обозначения транзакционности операций ```java import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class TransactionalDemoService { @Transactional public void updateData(int id, String newData) { // ло... Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/hellopliu-transactionalDemo.git
git@api.gitlife.ru:oschina-mirror/hellopliu-transactionalDemo.git
oschina-mirror
hellopliu-transactionalDemo
hellopliu-transactionalDemo
master