SpringAOPで切り込みポイントの高級使用
4263 ワード
前のSpringAOPの使用点の作成通知
SpringAOPでのカットポイントの高級使用
一、制御フローを使ってポイント(Control FlowePointcut)に切り込みます.
制御流の切り口は何ですか?下のコードを見てください.需要:私たちはCatのプレイ方法について通知します.しかし、プレイ方法を呼び出す時にいつでも通知するというわけではありません.blackCatのsleep()方法でプレイ方法を呼び出す時に通知します.つまり、 です.
組み合わせの切り口とは、論理関係(orとand)を利用して、前の文で述べたようないくつかの切り口を組み合わせて、論理関係を使って書いてもいいです.しかし、直接と切り口を組み合わせるのではなく、切り口の用法:Compsable Pointcutのunion()は「または」Compsable Pointcutのintersection()は「和」を表す まず3つのMethodMatchクラスを定義する 切込み点 を作成します.試験類
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);
}
}
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類のソースコードを見てください.分かりました.)
/**
* 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;
}
}
本プロジェクトのコード住所は、よく書けていると思います.スターをください.