ホームページ  >  記事  >  Java  >  Java Spring のアノテーションベースの AOP を構成する方法

Java Spring のアノテーションベースの AOP を構成する方法

PHPz
PHPz転載
2023-05-17 17:37:061056ブラウズ

    1 環境セットアップ

    1.1 ステップ 1: 必要なコードと jar パッケージを準備する

    • 短いプロジェクトをコピーする十分です。

    #1.2 ステップ 2: コンテキスト名前空間を構成ファイルにインポートします

    <?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 ステップ 3: リソース使用量のアノテーションを構成します

    • アカウントのビジネス層実装クラス

    • @Service("accountService")
      public class AccountServiceImpl implements IAccountService {
       
          @Autowired
          private IAccountDao accountDao;
      }
    • アカウントの永続化層実装クラス

    • @Repository("accountDao")
      public class AccountDaoImpl implements IAccountDao {
          @Autowired
          private DBAssit dbAssit ;
      }
    1.4 ステップ 4: パッケージを指定する構成ファイルで Spring によってスキャンされる

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

    2 構成ステップ

    2.1 ステップ 1: アノテーションを使用して通知クラスを構成する

      #トランザクション制御クラス
    • @Component("txManager")
      public class TransactionManager {
       
          //定义一个 DBAssit
          @Autowired
          private DBAssit dbAssit ;
      }
    • 2.2 ステップ 2: 通知クラスの @Aspect アノテーションを使用して、通知クラスをアスペクトとして宣言します。

      関数:
    • #現在のクラスをアスペクト クラスとして宣言します。
      • #トランザクション コントロール クラス
    • @Component("txManager")
      @Aspect//表明当前类是一个切面类
      public class TransactionManager {
       
          //定义一个 DBAssit
          @Autowired
          private DBAssit dbAssit ;
      }

      2.3 ステップ 3: アノテーションを使用して拡張メソッドの通知を構成する

    • 2.3.1 @Before

    関数:
    • 現在のメソッドを事前通知として扱います。
      • 属性:
    • 値: エントリ ポイント式を指定するために使用されます。エントリ ポイント式を指定することもできます引用。
      • //开启事务
        @Before("execution(* com.itheima.service.impl.*.*(..))")
        public void beginTransaction() {
         
            try {
                dbAssit.getCurrentConnection().setAutoCommit(false);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        2.3.2 @AfterReturning
    関数:
    • 現在の方法は事後アドバイスとして考えてください。
      • 属性:
    • 値: エントリ ポイント式を指定するために使用されます。エントリ ポイント式を指定することもできます引用
      • //提交事务
        @AfterReturning("execution(* com.itheima.service.impl.*.*(..))")
        public void commit() {
         
            try {
                dbAssit.getCurrentConnection().commit();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        2.3.3 @AfterThrowing
    関数:
    • #現在のメソッドを例外通知とみなします。
      • 属性:
    • 値: エントリ ポイント式を指定するために使用されます。エントリ ポイント式を指定することもできます引用
      • //回滚事务
        @AfterThrowing("execution(* com.itheima.service.impl.*.*(..))")
        public void rollback() {
         
            try {
                dbAssit.getCurrentConnection().rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        2.3.4 @
    関数後:
    • 現在の方法は最終通知であると考えてください。
      • 属性:
    • 値: エントリ ポイント式を指定するために使用されます。エントリ ポイント式を指定することもできますQuote
      • //释放资源
        @After("execution(* com.itheima.service.impl.*.*(..))")
        public void release() {
         
            try {
                dbAssit.releaseConnection();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        2.4 ステップ 4: Spring 構成ファイルで Spring のアノテーション AOP のサポートを有効にする
      • <!-- 开启 spring 对注解 AOP 的支持 -->
        <aop:aspectj-autoproxy/>
      3 サラウンド通知アノテーション構成 @Around

    関数:

    • # 現在のメソッドを周囲の通知として扱います。

      • 属性:

    • 値: エントリ ポイント式を指定するために使用されます。エントリ ポイント式を指定することもできます引用。

      • /**
        * 环绕通知
        * @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 ポイントカット式の注釈 @Pointcut

    関数:

    • エントリ ポイント式を指定します

      • 属性:

    • 値: 指定した式の内容

      • @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 XML を使用しない設定方法

        #

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

    以上がJava Spring のアノテーションベースの AOP を構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。