Springの中のAOP

4870 ワード

1、フロント拡張
MethodBefore Adviceと引き継ぎ、目的の種類の方法の前で実行するためのbefore方法を実現します.
設定ファイルで:
<bean id="a" class="   MethodBeforeAdvice    "/>
       <bean id="b" class="   "/>
       <bean id="c" class="org.springframework.aop.framework.ProxyFactoryBean">
              p:proxyInterfaces="     ,       "
              p:interceptorNames="a"//       
              p:target-ref="b"//     
              p:    
       </bean>
2、後付け強化
AfterReturningAdviceに継承され、目標クラスのメソッド呼び出し後に実行するためのafterReturning方法を実現します.
3、サラウンド強化
MethodInterceptorに継承し、invoke方法を実現し、両者を総合しました.
4、異常ショット強化
ビジネスに最適です.異常時はロールバックします.
Throws Adviceに受け継がれているので、after Throwingを実現する必要があります.
5、媒介強化
種類のextens Delegating Introduction Interceptor implementsが追加されたインターフェースを実現し、インターフェース中の方法を実現します.それはクラスの強化です.
前に紹介した強化は方法の前、後などの情報を織り込むために使われていますが、さらにどのような種類に織り込まれた方法を説明しますか?
6、静的な一般的な方法名とタンメンのマッチング
デフォルトはすべての種類と方法にマッチしますので、普通は自分で書き換える必要があります.種類のextends Static MethodMatttcutAdvisorは、matches(Method method、Class clazz)メソッドを書き換えて、指定された方法名にマッチすることができます.get Class Filter法を書き換えることにより、マッチング規則にいくつかのクラスを限定することができる.7、静的正則表現方法は接面略8、動的接面に適合する.
種類extens DynamicMethMatch Pointcut、matches(Method method、Class clazz、Object[]args)の方法を書き直します.スプリングの中でダイナミックカットの配置をすると組み立てられます.
9、流れうどん
ある方法によって開始された他の方法への呼び出しは、強化されたものに織り込まれ、プロセスの断面を使用して行われてもよい.
10、複合切断面
ある方法によって特定の方法の拡張を開始したい場合
11、誘電面
省略する
12、自動作成代理上のカット配置が面倒で、springは簡単な配置方法を提供しています.
(1)Beanプロファイル名規則に基づく自動代理作成器、BeanNameAutoProxCreator
(2)Advisor整合機構に基づく自動代理作成器、Default Adviso AutoProxyCreator
(3)Aspject J注解ラベルに基づく自動代理作成器、AnnotationAwareAspect JAtoxyCreator
簡単にAOPを配置する方法を紹介します.@AsppectJとschemaに基づいて.
@AsppectJを使うにはJDK 5.0以上、springのasmモジュール、aspectj.weaver、aspectj.tools種類のカバンが必要です.
13、AsppectJに基づく簡単な例
@Aspect
public class PreGreetingAspect{
    @Before("execution(* greetTo(..))")
    public void beforeGreeting(){
        System.out.println("How are you");
    }
}
は、このように、任意のgreet To方法を実行する際に、前置強調を織り込んで、その後、springの構成を示す.
 <beans>
        <aop:aspectj-autoproxy proxy-target-class="true"/>//true   CGLib      
        <bean id="waiter" class="com.xxx.NaiveWaiter"/>//   
        <bean class="PreGreetingAspect     "/>
    </beans>
(1)execution:目標種類の方法を実行する
execution(public**To(.):Toを接尾とするpublic方法
execution(*comp.xx.Waiter.*):Waiterインターフェースに適合するすべての方法
execution(*comp.xx.Waiter+.*):Waiterインターフェースとその実現カテゴリにマッチするすべての方法
execution(*comp.xxx.*):xxxに包まれたあらゆる種類のあらゆる方法
execution(*comp.xxx.*):xxx包、子孫包下のあらゆる種類のあらゆる方法
execution(*.com.*.Dao.find*):プレフィックスはcomの任意のパケットにダオを付ける方法で、プレフィックスはfindです.
execution(*joke):*は任意のタイプを表します.任意のタイプを表し、パラメータの個数は制限されません.
つまり.*はすべての種類を包含することを表します.
(2)@annotation:コメントを指定する目的類のすべての方法
(3)アークス:方法はクラス名を受ける
args(comp.xxx.Waiter):運転時の参参時Waiterタイプ(サブクラスを含む)にマッチする方法は、args(comp.xx.Waiter+)に相当し、execution(*)にも相当します.
(4)@args:方法は一つのクラス名を受け入れ、一つの注釈類の類名を受け入れなければならない.
(5)within:最小粒度はクラスです.
(6)タージ
(7)@within
(8)@target
(9)this
です
また、上記の方法の入力支援のワイルドカードは異なります.
@AsppectJの注釈のほかに、他にも方式があります.
と:&&の変換記号(&&)またはandを使用します.
或:?あるいはor
非:またはnotで、notが表式の先頭にあるときは、先頭にスペースを入れなければなりません.
15、拡張タイプ
@Before
@AfterReturning
@Aound
@After Throwing
@After
@Declare Parts
16、命名の接点
public class TestNamePointcut{
        @Pointcut("within(com.xxx.*)")
        private void inPackage(){}  //private          ,inPackage()     
        
        @Pointcut("execution(* greetTo(..))")
        protected void greetTo(){}
        
        @Pointcut("inPackage() and greetTo()") //    inPackage() greetTo()     ,   public
        public void inPkgGreetTo(){}
    }
public class TestAspect{
        @Before("TestNamePointcut.inPkgGreetTo()")//       public  
        public void pkgGreetTo(){
           //todo ...
        }
    }
17、補強織りの順序
省略する
18、以上のargs()、this()などはクラス名を指定してマッチングします.パラメータ名にマッチすることもできます.
@Before(args(name, num, ..))
public void func(int num, String name)  //     name num       args(String, int)
19、AOPエージェントの中のproxy-target-classパラメータ
コードを変更しないでターゲットオブジェクトを代理するすべての方法を望んでいる場合は、単に自己インターフェースを実現する方法(CGLOIBエージェントを強制的に使用する)ではなく、参照してください.http://www.xuebuyuan.com/993356.html
20、JDK&CGib代理
JDKインターフェースに基づく動的代理要求方法はpublicでなければならないし、staticはクラスのため、public staticインターフェースもだめです.public finalはできます.
CGlibは拡張によって強化されたクラスになり、動的にそのサブクラスを作成する方式で動的エージェントを実現するので、prvate、static、final修飾の方法は全部だめです.