今まで、org.apache.commons.net.ftp.FTPClient を使用する処理をラップして提供するものを書いていた。
しかしそうすると、FTPClient の操作を呼び出し側では固定の認識になってしまい、与えられたFTP操作しかできない。
そこで、メソッド名、引数の配置を自由にした任意のメソッドの中で
インジェクトされるFTPClientを使用する方法の方が良いとおもった。
つまり、
// インジェクトされるFTPClient
@FTPClientDefine private FTPClient ftpClient;
// アノテーションでメソッドの形式を任意の形式を保たせる
@FtpMethod
public void execFTP(String a,@FtpHost String host
,@FtpUser tpUser String user, @FtpPasswd String passwd){
:
// this.ftpclient でFTP操作を実行→任意のコード
}
このようなことを、Google guice + AOP で実現させる。
まずは、このインターセプタMatcher が必要であろう。
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import com.google.inject.matcher.AbstractMatcher;
import com.google.inject.matcher.Matcher;
/**
* FTP実行インターセプタMatcher.
*/
public final class FtpInterceptMatcher{
private FtpInterceptMatcher(){}
/**
* Matcherを取得
* @param annotationType FtpMethodを指定
* @return FtpMethodアノテーションが付いていれば、true
*/
public static Matcher<AnnotatedElement> annotatedWith(final Class<? extends Annotation> annotationType){
return new AbstractMatcher<AnnotatedElement>(){
public boolean matches(AnnotatedElement element) {
Annotation annotation = element.getAnnotation(annotationType);
if (annotation==null){
return false;
}
return annotation.annotationType().equals(FtpMethod.class);
}
@Override
public String toString() {
return "annotatedWith("+annotationType.getSimpleName()+".class"+")";
}
};
}
}
続きはこの次...