春のAOPとトランザクション

(1)トランザクションテンプレート

try{
    //1:开启事务
    //2:执行操作
    //3:提交事务
    //4:返回结果
}catch (Exception e){
     //5:回滚操作
}finally {
     //6:释放资源
}

(2)AOP:アスペクト指向プログラミング、宿題:既存のメソッドを強化するために、プログラムの実行期間中にソースコードを変更しないでください

利点:反復コードの削減、開発効率の向上、および便利なメンテナンス

実装方法:動的プロキシテクノロジーを使用する

構成を実装することで実現

選択:インターフェイスまたはaopプログラミングのサブクラスを実装する方法があるかどうか。春に、フレームワークは、ターゲットクラスがインターフェイスを実装するかどうかに応じて、使用する動的プロキシメソッドを決定します。

(3)ジョインポイント:接続ポイント、いわゆる接続ポイントはインターセプトされるポイントを指します。スプリングはメソッドタイプの接続ポイントのみをサポートするため、これらのポイントはメソッドを参照します。

ポイントカット:エントリポイント、いわゆるエントリポイントは、これらの結合ポイントをインターセプトする定義を指します

すべてのエントリポイントは接続ポイントですが、すべての接続ポイントがエントリポイントであるとは限りません

アドバイス:いわゆる通知とは、Joinpointを傍受した後に行うことは通知であることを意味します。通知の種類は、事前通知、事後通知、例外通知、および最終通知です。

invokeメソッド全体がサラウンド通知で実行され、サラウンド通知で明確なエントリポイント呼び出しが行われます。

イントロダクション:イントロダクションは特別な種類の通知です。イントロダクションは、クラスコードを変更せずに、実行時にクラスにいくつかのメソッドまたはフィールドを動的に追加できます。

ターゲット:ターゲットオブジェクト、エージェントのターゲットオブジェクト

ウィービング:ウィービングは、ターゲットオブジェクトに拡張機能を適用して、新しいプロキシオブジェクトを作成するプロセスです。Springは動的プロキシウィービングを使用し、AspectJはコンパイル時ウィービングとクラスローディングウィービングを使用します。

プロキシ:プロキシ、クラスがaopによって織り込まれ、拡張された後、結果のプロキシクラスが生成されます

アスペクト:アスペクトは、エントリポイントと通知の組み合わせです(紹介)

(4)やること

x:開発段階では、プログラマーはコアビジネスコード(開発メインライン)を作成する必要があります。ほとんどのプログラマーはそれを実行し、ビジネス要件に精通している必要があります。

共通コードを抽出して通知します。(開発段階の最後に実行します); aopプログラマーが実行します。

構成ファイルで、エントリポイントと通知の関係、つまりアスペクトを宣言します。行うべきaopプログラマー

xx:実行フェーズはSpringフレームワークによって完了します。Spring Frameworkは、ポイントカットメソッドの実行を監視します。ポイントカットメソッドが監視されると、プロキシメカニズムを使用して、ターゲットオブジェクトのプロキシオブジェクトを動的に作成します。

通知カテゴリに応じて、通知の対応する機能がプロキシオブジェクトの対応する位置に組み込まれ、完全なコードロジック操作が完了します。

(5)13_springXMLベースのAOP

1、把通知bean交给spring管理
2、使用aop:config标签表名开始aop配置
3、使用aop:aspect标签表名配置切面
   id:是给切面提供一个唯一标识
   ref:是指定通知类的bean的id
4、在aop:aspect标签内部使用对应的标签来配置通知的类型
   前置通知:aop:before
               method:用于指定Logger类中那个方法是前置通知
               pointcut:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强
                    切入点表达式写法:关键字:execution(表达式)
                           表达式:访问修饰符  返回值  包名.包名.包名.....类名.方法名(参数列表)
                    标准表达式写法:public void cn.rzpt.service.impl.AccountServiceImpl.saveAccount()
                    服务修饰符可以省略;返回值可以使用通配符,表示任意返回值;
                    包名可以使用通配符,表示任意包,但是有几级包,就需要写几个 *.;包名可以使用..,表示当前包和子包
                    类名和方法名都可以使用通配符来实现通配;
                    参数列表可以直接写数据类型
                        基本数据类型直接写类型名称
                        引用数据类型写包名.类名的方式
                        可以使用通配符表示任意类型,但是必须有参数;可以使用 .. 表示有无参数均可,有参数表示任意类型
                    全通配写法:* *..*.*(..)
                    实际开发中切入点表达式的通常写法:
                       切到业务层实现类下的所有方法
                       写法:* cn.rzpt.service.impl.*.*(..)
<!--前置通知:在切入点方法执行之前执行-->
<!--后置通知:在切入点方法正常执行之后执行-->
<!--异常通知:在切入点方法执行产生异常之后执行-->
<!--最终通知:无论切入点方法是否正常执行,都会在切入点方法之后执行-->

構成ポイントカット式:aop-pointcut

id:式の一意の識別子を指定するために使用されます。式は式の内容を指定するために使用されます

次に、pointcut-refを参照用に使用します

このタグは、現在のアスペクトにのみ使用できるaop:アスペクトタグコンテンツとして記述されます。また、すべてのアスペクトに使用できるaop:アスペクトの外部に書き込むこともでき、順番にaop:アスペクトの前に配置する必要があります。

サラウンド通知を構成します。

問題:サラウンド通知が構成されている場合、ポイントカット方式が実行されず、通知方式が実行されます

分析:動的エージェントのサラウンド通知には、明確なエントリポイントメソッド呼び出しがあります

解決策:SpringフレームワークはインターフェースProceedingJoinPointを提供します。このインターフェイスにはproceed()メソッドがあります。これは、ポイントカットメソッドを明示的に呼び出すのと同じです。このインターフェースは、周囲の通知のメソッドパラメータとして使用できます。プログラムが実行されると、Springフレームワークは

このインターフェースの実装クラスを使用できるように提供します。

Springのサラウンド通知は、Springフレームワークによって提供される方法であり、拡張メソッドがコードで実行されるタイミングを手動で制御します。

(6)SpringアノテーションベースのAOP構成(実行呼び出しシーケンスに問題があります。技術フレームワークの選択には注意が必要ですが、周囲の通知は正しいです)

xml構成方法を使用しないでください。

@Configuration

@ComponentScan(basePackages = "cn.rzpt")

@EnableAspectJAutoProxy

 

@Component( "logger")
@側面
パブリッククラスロガー{..。    
    @Pointcut( "execution(* * .. *。*(..))")
    public void pt1(){}

    @Before( "pt1()")
    public void beforePrintLog()
    ..。
}
<!-Springがコンテナを作成するときにスキャンするパッケージを構成します->
<!-春の経営陣に通知を渡す->
<!-サービス構成->
<!-アスペクトクラスの構成->
<!-アノテーションAOPサポートを有効にするようにスプリングを構成します->
<context:component-scan base-package = "cn.rzpt"> </ context:component-scan>

<aop:aspectj-autoproxy> </ aop:aspectj-autoproxy>
@Service( "accountService")
パブリッククラスAccountServiceImpl 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/sky2line/article/details/109465605