Spring Aop,パラメータバインド

2719 ワード

現在、すべてのspring文章はspring 4.2を使用しています.4、前の3編を含む
 
前編では、コードに@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
}

パターン集合はサポートされていません.上のように使用しないでください.