SpringAOPで切り込みポイントの高級使用

4263 ワード

前のSpringAOPの使用点の作成通知
SpringAOPでのカットポイントの高級使用
一、制御フローを使ってポイント(Control FlowePointcut)に切り込みます.
制御流の切り口は何ですか?下のコードを見てください.
class Cat {
    public void talk() {
        System.out.println("I am a cat");
    }

    public void play() {
        System.out.println("I am palying");
    }
}

class BlackCat {
    public void sleep(Cat cat) {
        cat.play();
        System.out.println("I am a blackCat , I am sleeping");
    }

}

/**
 *        
 */
class BeforeAdvice implements MethodBeforeAdvice{

    @Override
    public void before(Method method, Object[] objects, @Nullable Object o) throws Throwable {
        System.out.println("        "+method);
    }
}
  • 需要:私たちはCatのプレイ方法について通知します.しかし、プレイ方法を呼び出す時にいつでも通知するというわけではありません.blackCatのsleep()方法でプレイ方法を呼び出す時に通知します.つまり、
  • です.
    public static void main(String[] args) {
            Cat cat = new Cat();
            cat.play();//         
            
            BlackCat blackCat = new BlackCat();
            blackCat.sleep(cat);//        paly       
        }
    Control FlowePointcutのエントリポイントを作成します.
        public static void main(String[] args) {
    //        Cat cat = new Cat();
    //        cat.play();//         
    //
    //        BlackCat blackCat = new BlackCat();
    //        blackCat.sleep(cat);//        paly       
    
    
            Cat target = new Cat();
    
            //                      ,                   
            Pointcut pc = new ControlFlowPointcut(BlackCat.class, "sleep");
            Advisor advisor = new DefaultPointcutAdvisor(pc, new BeforeAdvice());
    
            ProxyFactory proxy = new ProxyFactory();
            proxy.setTarget(target);
            proxy.addAdvisor(advisor);
    
            Cat proxyCat = (Cat) proxy.getProxy();
            proxyCat.play();//         
    
            System.out.println("----------------");
            
            BlackCat blackCat = new BlackCat();
            blackCat.sleep(proxyCat);//        paly       
        }
    二、コンビネーションカットポイント(Compsable Pointcut)を使う
    組み合わせの切り口とは、論理関係(orとand)を利用して、前の文で述べたようないくつかの切り口を組み合わせて、論理関係を使って書いてもいいです.しかし、直接と切り口を組み合わせるのではなく、切り口のClassFilter MethodMatcherを組み合わせています.(なぜですか?この文章でPointcut類のソースコードを見てください.分かりました.)
  • 用法:Compsable Pointcutのunion()は「または」Compsable Pointcutのintersection()は「和」を表す
  • まず3つのMethodMatchクラスを定義する
  • 
    /**
     *   sleep   
     */
    class SleepMethodMatcher extends StaticMethodMatcher{
    
        @Override
        public boolean matches(Method method, Class> aClass) {
            return method.getName().equals("sleep");
        }
    }
    
    /**
     *   s  
     */
    class SStartMethodMatcher extends StaticMethodMatcher{
    
        @Override
        public boolean matches(Method method, Class> aClass) {
            return method.getName().startsWith("s");
        }
    }
    
    /**
     *   k  
     */
    class KEndMethodMatcher extends StaticMethodMatcher{
    
        @Override
        public boolean matches(Method method, Class> aClass) {
            return method.getName().endsWith("k");
        }
    }
  • 切込み点
  • を作成します.
    /**
     *        
     */
    class BeforeAdviceDemo implements MethodBeforeAdvice {
    
        @Override
        public void before(Method method, Object[] objects, @Nullable Object o) throws Throwable {
            System.out.println("        " + method);
        }
    }
  • 試験類
  • public static void main(String[] args) {
            Cat target = new Cat();
    
            //             classFilter methodMatcher  
            ComposablePointcut pc = new ComposablePointcut(ClassFilter.TRUE, new KEndMethodMatcher());
    
    //        pc.union(new SStartMethodMatcher());//  s     ,           
    //        pc.intersection(new SleepMethodMatcher()); //  sleep  ,          
    
            Advisor advisor = new DefaultPointcutAdvisor(pc,new BeforeAdviceDemo());
            ProxyFactory proxyFactory = new ProxyFactory();
            proxyFactory.setTarget(target);
            proxyFactory.addAdvisor(advisor);
    
            Cat cat = (Cat) proxyFactory.getProxy();
            cat.talk();
        }
    
    上のこのクラスFilter.TRUEと下のコードは同じです.つまり戻ってくるクラスFilterはtrueです.つまりすべての種類にマッチします.
    new ClassFilter() {
                @Override
                public boolean matches(Class> aClass) {
                    return true;
                }
            }
    本プロジェクトのコード住所は、よく書けていると思います.スターをください.