Maison  >  Article  >  Java  >  Comment configurer l'AOP basé sur les annotations de Java Spring

Comment configurer l'AOP basé sur les annotations de Java Spring

PHPz
PHPzavant
2023-05-17 17:37:061017parcourir

    1 Configuration de l'environnement

    1.1 Première étape : Préparez le code et le package jar nécessaires

    • Copiez simplement le projet dans la section précédente.

    1.2 Étape 2 : Importer l'espace de noms de contexte dans le fichier de configuration

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
     
        <!-- 配置数据库操作对象 -->
        <bean id="dbAssit" class="com.itheima.dbassit.DBAssit">
            <property name="dataSource" ref="dataSource"></property>
            
            <!-- 指定 connection 和线程绑定 -->
            <property name="useCurrentConnection" value="true"></property>
        </bean>
     
        <!-- 配置数据源 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>
            <property name="user" value="root"></property>
            <property name="password" value="1234"></property>
        </bean>
    </beans>

    1.3 Étape 3 : Configurer l'annotation d'utilisation des ressources

    • Classe d'implémentation de la couche métier du compte

    @Service("accountService")
    public class AccountServiceImpl implements IAccountService {
     
        @Autowired
        private IAccountDao accountDao;
    }
    • Classe d'implémentation de la couche de persistance du compte

    @Repository("accountDao")
    public class AccountDaoImpl implements IAccountDao {
        @Autowired
        private DBAssit dbAssit ;
    }

    1.4 Étape 4 : Spécifiez le package à analyser d'ici Spring dans le fichier de configuration

    <!-- 告知 spring,在创建容器时要扫描的包 -->
    <context:component-scan base-package="com.itheima"></context:component-scan>

    2 Étapes de configuration

    2.1 Étape 1 : Configurez la classe de notification à l'aide d'annotations

    • Classe de contrôle des transactions

    @Component("txManager")
    public class TransactionManager {
     
        //定义一个 DBAssit
        @Autowired
        private DBAssit dbAssit ;
    }

    2.2 Étape 2 : Utilisez l'annotation @Aspect sur la classe de notification pour la déclarer comme aspect

    • Fonction :

      • Déclarez la classe actuelle comme classe d'aspect.

    • Classe de contrôle des transactions

    @Component("txManager")
    @Aspect//表明当前类是一个切面类
    public class TransactionManager {
     
        //定义一个 DBAssit
        @Autowired
        private DBAssit dbAssit ;
    }

    2.3 Étape 3 : Utiliser les annotations pour configurer les notifications sur la méthode améliorée

    2.3.1 @Avant
    • Fonction :

      • Regarder la méthode actuelle comme c'est une pré-notification.

    • Attributs :

      • valeur : utilisée pour spécifier l'expression de point de coupe, et vous pouvez également spécifier la référence de l'expression de point de coupe.

    //开启事务
    @Before("execution(* com.itheima.service.impl.*.*(..))")
    public void beginTransaction() {
     
        try {
            dbAssit.getCurrentConnection().setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    2.3.2 @AfterReturning
    • Fonction :

      • Considérer la méthode actuelle comme une post-notification.

    • Attributs :

      • valeur : utilisée pour spécifier l'expression de pointcut, vous pouvez également spécifier la référence de l'expression de pointcut

    //提交事务
    @AfterReturning("execution(* com.itheima.service.impl.*.*(..))")
    public void commit() {
     
        try {
            dbAssit.getCurrentConnection().commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    2.3.3 @AfterThrowing
    • Fonction :

      • Considérez la méthode actuelle comme une notification d'exception.

    • Attribut :

      • valeur : utilisé pour spécifier l'expression de pointcut, vous pouvez également spécifier la référence de l'expression de pointcut

      //回滚事务
      @AfterThrowing("execution(* com.itheima.service.impl.*.*(..))")
      public void rollback() {
       
          try {
              dbAssit.getCurrentConnection().rollback();
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
    2.3.4 @After
    • Fonction :

      • Considérez l'approche actuelle comme un avis final.

    • Attributs :

      • valeur : utilisé pour spécifier l'expression de pointcut, vous pouvez également spécifier la référence de l'expression de pointcut

      //释放资源
      @After("execution(* com.itheima.service.impl.*.*(..))")
      public void release() {
       
          try {
              dbAssit.releaseConnection();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
    2.4 Étape 4 : Activer l'appariement de ressort dans le fichier de configuration de ressort Annotation Prise en charge AOP

    <!-- 开启 spring 对注解 AOP 的支持 -->
    <aop:aspectj-autoproxy/>

    3 Configuration de l'annotation de notification autour @Around

    • Fonction :

      • Traitez la méthode actuelle comme une notification environnante.

    • Attributs :

      • valeur : utilisée pour spécifier l'expression de point de coupe, et vous pouvez également spécifier la référence de l'expression de point de coupe.

      /**
      * 环绕通知
      * @param pjp
      * @return
      */
      @Around("execution(* com.itheima.service.impl.*.*(..))")
      public Object transactionAround(ProceedingJoinPoint pjp) {
       
          //定义返回值
          Object rtValue = null;
       
          try {
          
              //获取方法执行所需的参数
              Object[] args = pjp.getArgs();
          
              //前置通知:开启事务
              beginTransaction();
       
              //执行方法
              rtValue = pjp.proceed(args);
       
              //后置通知:提交事务
              commit();
              }catch(Throwable e) {
       
              //异常通知:回滚事务
              rollback();
              e.printStackTrace();
          }finally {
       
          //最终通知:释放资源
          release();
          }
       
          return rtValue;
      }
    4 Annotation d'expression Pointcut @Pointcut

    • Fonction :

      • Spécifier l'expression de pointcut

    • Attribut :

      • valeur : le contenu de l'expression spécifiée

      @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
      private void pt1() {}
       
          /**
          * 引用方式:
          * 环绕通知
          * @param pjp
          * @return
          */
          @Around("pt1()")//注意:千万别忘了写括号
          public Object transactionAround(ProceedingJoinPoint pjp) {
       
          //定义返回值
          Object rtValue = null;
       
          try {
              //获取方法执行所需的参数
              Object[] args = pjp.getArgs();
       
              //前置通知:开启事务
              beginTransaction();
              
              //执行方法
              rtValue = pjp.proceed(args);
       
              //后置通知:提交事务
              commit();
          }catch(Throwable e) {
       
              //异常通知:回滚事务
              rollback();
              e.printStackTrace();
          }finally {
       
              //最终通知:释放资源
              release();
          }
          
          return rtValue;
      }
    5 Méthode de configuration sans XML

    @Configuration
    @ComponentScan(basePackages="com.itheima")
    @EnableAspectJAutoProxy
    public class SpringConfiguration {
     
    }

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer