Spring Aopベース使用


Springといえば、きっとみなさんはすぐに思いつきますよ.えっと、SpringはBeanオブジェクトの管理、データのパッケージ化、事務管理のためのものではないですか?確かにSpringを使っている時に一番多く使われているのはSpringが提供しているこれらの機能です.実はSpringにはいいものがあります.もしかしたらみんなが普段使っているものが少ないかもしれません.彼の名前はAOPです. 
何のAOPですか?これは何ですか?私はOOPだけ知っています.AOPは誰ですか?おじさんですか?冗談を言って、OOPは対象に向かってプログラミングします.AOPは実は切断面向けのプログラミングと言っています.いずれもプログラミングですから、コードを全部書いたらいいという意味です.
A OPの詳細な紹介については、ここでは多くないといいます.至るところで検索したら出てきます.ここで言いたいのは、通常はAOPを使う目的は、いずれもある方法を実行する前に、または実行後にコードを追加で実行したいですが、すでに書いてある業務コードを修正するようなものではありません.
はい、AOPを始める前に、まずAOPに関するいくつかの名詞を調べてみます.もちろん初めてAOPを使うなら、これらの名詞を飛ばしてみてもいいです.まず下記の例を全部入力して、効果を見てから、振り返ってこれらの名詞を理解してみてください.
1.Asppectカッティング:パパイヤ、偶然ですよ.AOPはカッター向けにプログラミングします.Asppectはカッターです.それはAsppect向けにプログラミングしているのではないですか?もちろん理解してもいいです.私たちのコードを書くのはAspectでいいです.Asppectはポイントのモジュール化に注目しています.一つのAsppectは複数の対象を切ります.誰を切りたいのですか?
2.JointPoint接続点:これはプログラム実行中のある行為を表しています.彼を業務の中のある具体的な方法に位置づけています.つまり、私達はこの方法の実行前に、または実行後に追加的にコードを実行したいです.今注目しているこの方法はJointPointです.
3.Advice通知:通知とは、ある接続点に対して発生する動作であり、ここでの動作は私たちが追加的に実行するコードに相当します.
4.PointCut切り込みポイント:これはPointCutが表現式であることを覚えている限り、この表現の役割は通知(Advice)と接続点(JointPoint)を関連付けることで、AdviceがJointPointに作用すればOKです.
OK、話は多くなくて、コードをつけました.(もうたくさん話しました.)この例を仮定して、コア機能を実現したいです.プレイ()といいます.この機能を起動すると、小覇王ゲーム機をプレイできます.
この機能はもう書きましたが、今は小覇王を遊ぶ前に、周りの環境を確認してみたいです.小覇王を遊ぶには適しているかどうか、なぜ検査しますか?えっと、よく聞きました.もし私が小覇王を遊ぶつもりだったら.
中の一つのゲームは電気というオオカミです.(もちろん小覇王の中にはこの電気と狼などのゲームがないです.あれば小覇王は没落しないと思います.ハハ、分かります.)ホールの広さの中で、気兼ねなく遊べると思いますか?とにかく遊ぶ前に環境をチェックして、遊んでから戦場を片付けて、電源を入れて、4合1、3合1のカードやティッシュなどを整理したいです.しかし、もう書いたプレイコードの中では変えたくないです.
どうすればいいですか?とりあえずAspectを書きます.
public class AspectForPlay {

    public void doBefore(JoinPoint joinPoint) {
        System.out.println("        :" + joinPoint.getTarget().getClass().getName()
                + "." + joinPoint.getSignature().getName());
    }

    public void doAfter(JoinPoint joinPoint) {
        System.out.println("        :" + joinPoint.getTarget().getClass().getName()
                + "." + joinPoint.getSignature().getName());
    }

    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("    ,  Happing:" + start);

        Object proceed = pjp.proceed();

        System.out.println("    ,    :" + (System.currentTimeMillis() - start));
        return proceed;
    }
}
もちろん、コア論理プレイ()機能もあります.まず、プレイのインターフェイスをお願いします.
public interface PlayXbwService {

    public void play();
}
またこのインターフェースを実現して、私達の遊ぶ内容を展示します.
public class PlayXbwServiceImple implements PlayXbwService {


    @Override
    public void play() {
        System.out.println("playing:       ");
    }
}
もちろんです.最後にSpringの配置ファイルがあります.
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    <bean id="xbwService" class="com.andy.springaop.PlayXbwServiceImple"></bean>
    <bean id="aspectBean" class="com.andy.springaop.AspectForPlay" ></bean>
    <aop:config>
        <aop:aspect id="playAspect" ref="aspectBean">
            <aop:pointcut id="playPointCut" expression="execution(* com.andy.springaop.*.*(..))"></aop:pointcut>
            <aop:before method="doBefore" pointcut-ref="playPointCut"></aop:before>
            <aop:after method="doAfter" pointcut-ref="playPointCut"></aop:after>
            <aop:around method="doAround" pointcut-ref="playPointCut"></aop:around>
            <aop:after-throwing method="doThrowing" pointcut-ref="playPointCut"></aop:after-throwing>
        </aop:aspect>
    </aop:config>
</beans>
はAOPの構成を見ることができます.主に「aop:config」のラベルの中で実現されます.次に、クラスを書いて、クラスを書いてみましょう.
public class AspectTest {

    ClassPathXmlApplicationContext ctx;

    @Before
    public void prepare() {
        ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    }

    @Test
    public void testPlayXbw() {
        PlayXbwService service = (PlayXbwService) ctx.getBean("xbwService");
        service.play();
    }
}
OKです.このテストクラスを実行した後、結果は以下の通りです.
        :com.andy.springaop.PlayXbwServiceImple.play
    ,  Happing:1401286273603
playing:       
        :com.andy.springaop.PlayXbwServiceImple.play
    ,    :2
どうですか?私達のプレーの前後に、いくつかの追加の処理が挿入されていますか? これらの処理は私達のAsppectForPlay種類で作成した方法です.
Aspectクラスで三つの方法を作成しました.doAfter、doBefore、doAsound、それぞれ対応しているのは「後置通知」、「前置通知」、「折り返し通知」です.
Adviceに通知するのもこの数種類だけではなく、以下は全部の通知タイプです.
1.後置通知(After Advice):後置通知は接続ポイントの実行後に追加的に実行する操作を表しています.Springでは、私達はを使って彼を配置します.
2.フロント通知(Before Advice):フロント通知は接続ポイントの実行前に追加的に行われる操作を示しています.Springでは、私達はで彼を配置します.
3.サラウンド通知(Aound Advice):接続点の実行前後に、追加的に実行される操作を表します.また、サラウンド通知は接続点の実行を制御できます.コードの中のようです.Object proced=pjp.proced()がないと接続点が動かなくなります.Springでは、で彼を配置します.
4.返却後通知(after return advice):接続点が正常に実行された後、追加実行される操作を示します.正常に実行されたことに注意してください.Springでは、で彼を配置します.
5.異常通知(after throwingg advice):プログラムに異常が発生した後、追加的に実行する操作を示しています.Springでは、を使って彼を配置します.
例のプログラムでは、前の3つの通知だけを書いて、後の2つの読者に自分で試してみてください.また、プログラム例のAdviceでは、JointPointオブジェクトがパラメータとして表示されます.もちろん、サラウンド通知はProceeding JointPointオブジェクトです.このjointPointは接続点が含まれている情報や代理オブジェクトの情報に役立ちます.もちろんです.私たちはadviceを書く時、このパラメータをやめてもいいです.
また、PointCutについては、彼が接続通知と接続点の表現であることを前に述べましたが、この表現の書き方は以下の通りです.
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) 
modifiers-pattern:方法の権限はprvate publicなどです.
ret-type-pattern:方法戻り値タイプはvoid Stringなどです.
declring-type-pattern:方法のあるカバンはcomp.andy.springgaopなどです.
name-pattern:方法名はプレイなどです.
throws-pattern:異常タイプはIOExceptionなどです.
OKです.ここまでのSpring AOPの基礎使用はほぼ同じです.またSpringは注釈式のAop配置にも対応しています.このようにSpringの配置ファイルの中では、もうを配置しなくてもいいです.
配置はもう終わりです.もちろん注意に基づいているので、Springの注釈スキャン機能を起動します.   
はい、以下に注釈に基づくAsppectファイルの例を添付します.
@Aspect
public class AspectForPlay {

    @Before("execution(* com.andy.springaop.*.*(..))")
    public void doBefore(JoinPoint joinPoint) {
        System.out.println("        :" + joinPoint.getTarget().getClass().getName()
                + "." + joinPoint.getSignature().getName());
    }

    @After("execution(* com.andy.springaop.*.*(..))")
    public void doAfter(JoinPoint joinPoint) {
        System.out.println("        :" + joinPoint.getTarget().getClass().getName()
                + "." + joinPoint.getSignature().getName());
    }

    @Around("execution(* com.andy.springaop.*.*(..))")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("    ,  Happing:" + start);

        Object proceed = pjp.proceed();

        System.out.println("    ,    :" + (System.currentTimeMillis() - start));
        return proceed;
    }
}
最後に、私達は例の中で見て、使うAOPはインターフェースに基づくので、あの種類の情況に基づいて、AOPは使うことができますか? 
基本インターフェースとクラスに基づいているだけで、Springで使われている動的エージェントは違っています.