Spring Aop,パラメータバインド
2719 ワード
現在、すべてのspring文章はspring 4.2を使用しています.4、前の3編を含む
前編では、コードに@PointCut、@Beforeなどの基本アプリケーションコードがいくつかありましたが、今回はaopのパラメータバインドについて一緒に学び、その前に最も基本的なbeanを定義します
このbeanでは、sayHello(Data)はaopを行う方法で、Dataのタイプのパラメータがあり、Dataも簡単です.
次に断面を定義します
皆さんにもっとよく理解してもらうために、私はわざわざすべてのパラメータをparam~~~と命名しませんでした.
まず,sayHello(Data param)メソッドのパラメータ名は,接面中のargsパラメータ名とは全く関係がないことを説明する.パラメータタイプではなくパラメータ名を言っているので大丈夫です.
上@Before(value="execution(*bindData.HelloWorld.sayHello(*)&&args(param 2))について逐一ご紹介します
@Before:前置き通知を表します.
value:接線に一致します.
execution:具体的な接点を宣言する;ここではbindDataパッケージのHelloWorldクラスを取得するsayHelloメソッド、sayHelloメソッドにパラメータが1つしかなく、任意の値を返すことができることを示します.
args:マッチングパラメータ;ここで、param 2は、まずbeforeSayHelloメソッドのparam 2パラメータに一致し、ここでは一致名が同じパラメータであることに注意し、次にparam 2のタイプを取得し、Dataであり、一致するsayHello(*)メソッドのパラメータタイプがDataでなければ一致しないことを示す.
最後に、テストを行います.もちろん、フル注釈モードです.
結果は
これにより,先行通知で切断方法のパラメータ値を変更することができる.
もう一つ注意しなければならないことがあります.
it’s worth pointing out that this won’t work for generic collections. So you cannot define a pointcut like this:
パターン集合はサポートされていません.上のように使用しないでください.
前編では、コードに@PointCut、@Beforeなどの基本アプリケーションコードがいくつかありましたが、今回はaopのパラメータバインドについて一緒に学び、その前に最も基本的なbeanを定義します
@Component
public class HelloWorld {
public void sayHello (Data param){
System.out.println("Hello World! -> " + param.name);
}
}
このbeanでは、sayHello(Data)はaopを行う方法で、Dataのタイプのパラメータがあり、Dataも簡単です.
public class Data {
public String name;
public Data (String name){
this.name = name;
}
}
次に断面を定義します
@Aspect
@Component
public class HelloWorldAspect {
@Before(value = "execution(* bindData.HelloWorld.sayHello(*)) && args(param2)")
private void beforeSayHello (Data param2){
System.out.println("this is before advice! -> " + param2.name);
param2.name = "change";
}
}
皆さんにもっとよく理解してもらうために、私はわざわざすべてのパラメータをparam~~~と命名しませんでした.
まず,sayHello(Data param)メソッドのパラメータ名は,接面中のargsパラメータ名とは全く関係がないことを説明する.パラメータタイプではなくパラメータ名を言っているので大丈夫です.
上@Before(value="execution(*bindData.HelloWorld.sayHello(*)&&args(param 2))について逐一ご紹介します
@Before:前置き通知を表します.
value:接線に一致します.
execution:具体的な接点を宣言する;ここではbindDataパッケージのHelloWorldクラスを取得するsayHelloメソッド、sayHelloメソッドにパラメータが1つしかなく、任意の値を返すことができることを示します.
args:マッチングパラメータ;ここで、param 2は、まずbeforeSayHelloメソッドのparam 2パラメータに一致し、ここでは一致名が同じパラメータであることに注意し、次にparam 2のタイプを取得し、Dataであり、一致するsayHello(*)メソッドのパラメータタイプがDataでなければ一致しないことを示す.
最後に、テストを行います.もちろん、フル注釈モードです.
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "bindData")
public class AopConfig {
@Test
public void testBeforeSayHello (){
ApplicationContext ctx = new AnnotationConfigApplicationContext(AopConfig.class);
Data data = new Data("no change");
HelloWorld hw = ctx.getBean(HelloWorld.class);
hw.sayHello(data);
}
}
結果は
this is before advice! -> no change
Hello World! -> change
これにより,先行通知で切断方法のパラメータ値を変更することができる.
もう一つ注意しなければならないことがあります.
it’s worth pointing out that this won’t work for generic collections. So you cannot define a pointcut like this:
@Before("execution(* ..Sample+.sampleGenericCollectionMethod(*)) && args(param)")
public void beforeSampleMethod(Collection<MyType> param) {
// Advice implementation
}
パターン集合はサポートされていません.上のように使用しないでください.